COM端口关闭时是否可以接收COM端口事件?

时间:2015-07-01 14:55:42

标签: c#

我在笔记本电脑上,现在无法检查,我想知道我是否打开COM2连接,并为COM2端口添加接收事件,然后通过&#34关闭COM2连接; serial.Close()"在程序中,我仍然可以在COM2端口上接收接收事件吗?如果它仍然可以接收,我想我会在接收事件中打开COM2端口连接并读取数据,可以这样做吗?

    SerialPort serial = new SerialPort()
    {
        PortName = "com2",
        BaudRate = 9600,
        Handshake = System.IO.Ports.Handshake.None,
        Parity = Parity.None,
        DataBits = 8,
        StopBits = StopBits.One,
        ReadTimeout = 400,
        WriteTimeout = 200,
    };

 serial.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(Receive);

    private void Receive(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {            
        using (SerialPort serialPort = serial)
        {                
            if (serialPort.IsOpen)
                serialPort.Close();
            try
            {
                serialPort.Open();
                received_data = serialPort.ReadExisting();
                Dispatcher.Invoke(DispatcherPriority.Send, new UpdateUiTextDelegate(WriteMyData), received_data);
            }
            catch (Exception ex)
            {
            }
            finally
            {
                if (serialPort != null)
                {
                    if (serialPort.IsOpen)
                    {
                        serialPort.Close();
                    }
                    Thread.Sleep(5);
                    //serialPort.Dispose();
                }
                Thread.Sleep(5);
            }
        }
    }


    public void SerialCmdSendByte(byte[] hexstring)
    {
        using (SerialPort serialPort = serial)
        {
            if (serialPort.IsOpen)
                serialPort.Close();
            try
            {
                serialPort.Open();


                foreach (byte hexval in hexstring)
                {
                    byte[] _hexval = new byte[] { hexval };
                    serialPort.Write(_hexval, 0, 1);
                    Thread.Sleep(3);
                }                 
            }
            catch (IOException ex)
            {
            }
            finally
            {
                if (serialPort != null)
                {
                    if (serialPort.IsOpen)
                    {
                        serialPort.Close();
                    }
                    Thread.Sleep(5);
                    //serialPort.Dispose();
                }
                Thread.Sleep(5);
            }
        }            
    }

我的想法是只在我想从C#程序发送并立即关闭它时打开一个连接,但实际上需要同一个COM端口监听来自基于PIC的微控制器的通信。目前我们遇到的问题是以前程序从不尝试关闭连接(与上面的代码不同),但有时基于PIC的微控制器的接收部分工作,但程序的发送部分不起作用。这只会在某个时候发生,因为通常程序工作正常......

重新启动系统似乎重置了这个OK。所以我在考虑制作上面的代码对我的情况有帮助(能够发送,并在同一个COM端口上监听)?

3 个答案:

答案 0 :(得分:0)

不幸的是,没有。一次只能打开1个与COM端口的连接。

如果您有设备正在侦听该端口,那么其他任何设备都无法发送。

如果您可以访问微控制器用于在设备上侦听的代码,您可以随时编写一些内容,允许您向微控制器发送消息并让该设备发送COM消息。

否则,您唯一能做的就是让微控制器停止监听端口,从代码发送消息,接收发送消息后发出的任何响应,然后重新启用微控制器的监听功能。

修改

只是关于代码的说明。 using语句旨在在超出范围时关闭所有连接后处置对象。

在您的代码中,您将在 using block 中创建对串行端口实例的引用。如果按照定义工作,则需要先实例化串口实例,然后才能再次调用它。

答案 1 :(得分:0)

作为jp2code答案的补充,由于想象力是极限,你可能想要尝试更多"开箱即用"解决方案,类似于 Man-In-The-Middle

THIS POST可能会让您更好地了解我所谈论的内容。

答案 2 :(得分:0)

端口关闭时,您无法在串口上进行通信或侦听。 所以你写的代码是完全错误的。

理想情况下,您不应关闭COM端口。

以下可能是您的通讯失败的原因。

1.这个似乎是最可能的答案:如果在前一次运行中COM端口未正确关闭,则不会进行通信。在这种情况下,您必须重置系统。当系统崩溃时会发生这种情况。

  1. 当连接器不紧时,可能会发生这种情况。

  2. 检查接地连接是否正确。

  3. 如果您需要帮助更改代码,请与我们联系。