如何强制关闭SerialPort连接?

时间:2010-10-07 10:45:39

标签: c#

我有通过USB串行通信连接到PC的设备。我正在执行以下步骤

  1. 启动设备(开机)
  2. 设备将在我的电脑中检测为COMx名称
  3. 启动我的申请
  4. 在COM PID / VID的基础上,我连接到设备
  5. 进行沟通。 (到目前为止,我没有遇到任何问题)
  6. 当我关闭设备时,设备已断开但我无法关闭连接。
  7. 当我再次启动(打开)设备时,检测到设备但我的应用程序无法连接到COMx(设备)。它抛出IOException“COMx不存在”
  8. 所以我认为我有办法有力地关闭通信端口。

    感谢任何帮助

    由于

4 个答案:

答案 0 :(得分:2)

如果您通过串口与硬件进行通信并使用SerialEventListener,那么我认为会发生Serial.DATA_BREAK(不记得具体名称)事件。您可以在SerialEvent方法中捕获此信息并关闭从程序到端口的连接。希望这有助于您在断开硬件时强行关闭连接。

答案 1 :(得分:2)

我找到了解决方案,虽然它不能称为标准解决方案但是我对该解决方案没有任何问题,因为它解决了我的问题,解决方案是按照belove步骤

  1. 创建课程。
  2. 每次要发送数据时,都要创建并部署此类的实例。
  3. 第一步: -

        class clsRS232 : IDisposable
        {
            private SerialPort myPort;
            public clsRS232()
            {
                myPort = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);
            }
            public void OpenPort()
            {
                myPort.Open();
            }
            public void SendFunc(string str)
            {
                myPort.Write(str);
            }
            public string ReadFunc()
            {
               return  myPort.ReadExisting();
            }
    
            public void Dispose()
            {
                myPort.Dispose();
            }
    
        }
    

    第二步: -

    using (clsRS232 mySerialPort = new clsRS232())
                        {
                            lock (mySerialPort)
                            {
                                mySerialPort.OpenPort();
                                mySerialPort.SendFunc(commandArg);//here "commandArg" is command or data you want to send to serial port
                                this.serialPortObj_DataReceived(mySerialPort.ReadFunc()); //here "serialPortObj_DataReceived()" is a user define method where received data will be passed
                            }
                        }
    

答案 2 :(得分:1)

完成后,你是否在comport上运行.Close()?

理想情况下,您必须先关闭(),然后才能关闭电源或断开设备。

另外,您使用的是SerialPort.GetPortNames()吗?如果您正在使用USB comports并将它们拉出(或关闭电源),然后再重新插入它们,它们将获得Windows提供的新名称。

然后你必须用SerialPort.GetPortNames()重新枚举它们,以检查新的COM名称是什么。

即,您的设备可能在首次开机时被称为COM3,在第二次开机时可能被称为COM4,依此类推。经过多次循环后,它可能会再次被称为COM3。

这就是为什么你需要拨打GetPortNames,以查明是否出现了“新”设备。 (这不是一个真正的新设备,它是你的设备,它可以重新启动。)

答案 3 :(得分:0)

我知道问题已有几年了,但前几天我遇到了同样的问题。 我帮助的是在close()之前丢弃输入和输出缓冲区。

this.serialPort.DiscardInBuffer();
this.serialPort.DiscardOutBuffer();
this.serialPort.Close();