none
С# проблема с закрытием COM порта RRS feed

  • Вопрос

  • Всем Добрый день!

    У меня возникла проблема c закрытием порта.

    Использую библиотеку System.IO.Ports

    Порт открываю без всяких ошибок

    А вот при закрытии порт не закрывается.

    
    namespace COMport
    {
        public class Program
        {
            SerialPort port = new SerialPort(); // cоздаем экземпляр встроенного класса SerialPort
            public byte[] RECEIVE_BUFFER;
    
            static void Main(string[] args)
            {
            }
    
            public void COMportInint()
            {
                port.WriteTimeout = 500;        //Время ожидания записи с порта
                port.ReadTimeout = 500;         //Время ожидания чтения с порта
                port.BaudRate = 19200;          //Настраиваем скорость обмена данными
                port.Parity = Parity.None;
                port.DataBits = 8;
                port.StopBits = StopBits.One;
                port.Handshake = Handshake.RequestToSend;
                port.DtrEnable = true;
                port.RtsEnable = true;
                port.NewLine = Environment.NewLine;
            }
    
            public void setPortName(String Name)
            {
                port.PortName = Name;
            }
    
            public String getPortName()
            {
                return port.PortName;
            }
    
            public bool openPort()
            {
                COMportInint();
                try
                {
                    port.Open();
                }
                catch { }
                return port.IsOpen;
            }
    
            public void closePort()
            {
                COMportInint();
                port.Close();
            }
    }
    


    19 октября 2016 г. 12:50

Ответы

  • В методе msClosePort_Click Вы создаете и пытаетесь закрывать НОВЫЙ экземпляр порта! Его еще не открывали, потому и возникает ошибка. А тот, который открывался в msOpenPort_Click уже не доступен, т.к. был локальной переменной.

    Вывод: экземпляр класса COM должен быть полем вашей формы TestPO, а не локальной переменной того или иного метода.


    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    • Помечено в качестве ответа Егор Зобнин 25 октября 2016 г. 14:31
    25 октября 2016 г. 12:56

Все ответы

  • Что значит "не закрывается"?

    This posting is provided "AS IS" with no warranties, and confers no rights.

    19 октября 2016 г. 15:39
    Модератор
  • public void closePort()

    {

         COMportInint();

         port.Close();

    }

    Вероятно, потому "не закрывается", что Вы пытаетесь заново инициализировать уже открытий порт. Зачем здесь вызов COMportInint (странное, кстати, название метода)?

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    • Предложено в качестве ответа Liliya Muray 20 октября 2016 г. 5:36
    19 октября 2016 г. 19:51
  • COMportInit();

    я дописал когда закрыть с одной

    port.Close();

    Не помогло

    20 октября 2016 г. 6:55
  • Какое конкретно исключение возникает? И еще, покажите код общения с портом. В приведенном выше коде метод Main пустой.

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    20 октября 2016 г. 8:27
  • Прошу прощения за то что не отвечал.

    Вот код который Вы спрашивали, я немного видоизменил проект.

    Но проблема осталась.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.IO.Ports;
    
    namespace COMtest
    {
        static class Program
        {
            /// <summary>
            /// Главная точка входа для приложения.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new TestPO());
            }
        }
    
        public class COM
        {
            SerialPort port = new SerialPort(); // cоздаем экземпляр встроенного класса SerialPort
    
            public void COMportInint()
            {
                port.WriteTimeout = 500;        //Время ожидания записи с порта
                port.ReadTimeout = 500;         //Время ожидания чтения с порта
                port.BaudRate = 19200;          //Настраиваем скорость обмена данными
                port.Parity = Parity.None;
                port.DataBits = 8;
                port.StopBits = StopBits.One;
                port.Handshake = Handshake.RequestToSend;
                port.DtrEnable = true;
                port.RtsEnable = true;
                port.NewLine = Environment.NewLine;
            }
    
            public void setPortName(String Name)
            {
                port.PortName = Name;
            }
    
            public String getPortName()
            {
                return port.PortName;
            }
    
            public bool openPort()
            {
                COMportInint();
                try
                {
                    port.Open();
                }
                catch { }
                return port.IsOpen;
            }
    
            public void closePort()
            {
                port.Close();
            }
    
        }
    
    }
    

            private void msOpenPort_Click(object sender, EventArgs e)
            {
                COM ComPort = new COM();
                ComPort.setPortName(NamePort);
                isTryOpen = ComPort.openPort();
                if (isTryOpen)
                {
                    RefreshForm(NamePort + " = true");
                    msSelectPort.Enabled = false;
                    msOpenPort.Enabled = false;
                    msClosePort.Enabled = true;
                }
                else
                {
                    RefreshForm(NamePort + " = false");
                    msSelectPort.Enabled = true;
                    msOpenPort.Enabled = false;
                    msClosePort.Enabled = false;
                }
    
            }
    
            private void msClosePort_Click(object sender, EventArgs e)
            {
                if (isTryOpen)
                {
                    COM ComPort = new COM();
                    ComPort.setPortName(NamePort);
                    ComPort.closePort();
                    RefreshForm(NamePort + " = close");
                    msSelectPort.Enabled = true;
                    msOpenPort.Enabled = false;
                    msClosePort.Enabled = false;
                }
            }

    25 октября 2016 г. 12:48
  • В методе msClosePort_Click Вы создаете и пытаетесь закрывать НОВЫЙ экземпляр порта! Его еще не открывали, потому и возникает ошибка. А тот, который открывался в msOpenPort_Click уже не доступен, т.к. был локальной переменной.

    Вывод: экземпляр класса COM должен быть полем вашей формы TestPO, а не локальной переменной того или иного метода.


    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    • Помечено в качестве ответа Егор Зобнин 25 октября 2016 г. 14:31
    25 октября 2016 г. 12:56
  • Поправил, да глупая ошибка.

    Но не помомгло

    namespace COMtest
    {
        public partial class TestPO : Form
        {
            COM ComPort = new COM();
            private string NamePort;
            public string PortState;
            public bool isOpen = false;
            public bool isTryOpen = false;
    
            public TestPO()
            {
                InitializeComponent();
            }
    
            public void RefreshForm(string Port)
            {
                ssPortState.Text = Port;
            }
    
    /*пропустил ряд однотипных функций по выбору порта, они роли не играют
    */
            private void msOpenPort_Click(object sender, EventArgs e)
            {
                ComPort.setPortName(NamePort);
                isTryOpen = ComPort.openPort();
                if (isTryOpen)
                {
                    RefreshForm(NamePort + " = true");
                    msSelectPort.Enabled = false;
                    msOpenPort.Enabled = false;
                    msClosePort.Enabled = true;
                }
                else
                {
                    RefreshForm(NamePort + " = false");
                    msSelectPort.Enabled = true;
                    msOpenPort.Enabled = false;
                    msClosePort.Enabled = false;
                }
    
            }
    
            private void msClosePort_Click(object sender, EventArgs e)
            {
                if (isTryOpen)
                {
                    ComPort.setPortName(NamePort);
                    ComPort.closePort();
                    RefreshForm(NamePort + " = close");
                    msSelectPort.Enabled = true;
                    msOpenPort.Enabled = false;
                    msClosePort.Enabled = false;
                }
            }
        }
    }
    

    25 октября 2016 г. 13:47
  • Тогда возвращаемся в начало :) Что означает "не закрывается"? Генерируется исключение? Какое? Можете поймать его отладчиком?

    Еще предположение. Задавать свойству PortName новое значение нельзя, если порт уже открыт (см. здесь).


    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    25 октября 2016 г. 13:56
  • Порт после закрытия остаётся занят

    PortName отрабатывает, так как

    при запуске допустим порт 4 свободен

    открываю порт 4 занят

    закрываю порт 4 занят

    останавливаю отладку освобождается

    25 октября 2016 г. 14:10
  • Вы "накручиваете" все новые и новые термины. Теперь мы будем выяснять, что значит "занят"? Я задал Вам конкретный вопрос: какое исключение и в какой момент Вы получаете от методов класса SerialPort?

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    25 октября 2016 г. 14:21
  • К сожалению, я не понял вопроса ... какое исключение.

    Но похоже дело было все таки в

    "Вы создаете и пытаетесь закрывать НОВЫЙ экземпляр порта! Его еще не открывали, потому и возникает ошибка. А тот, который открывался в msOpenPort_Click уже не доступен, т.к. был локальной переменной."

    Поместив, подряд функции открыть и закрыть ком порт открылся и закрылся нормально

    Порт занят значит что порт используется другим устройством.

    Большое спасибо.

    25 октября 2016 г. 14:30