C#SerialPort多线程发送/接收冲突

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#SerialPort多线程发送/接收冲突相关的知识,希望对你有一定的参考价值。

我正在尝试在C#命令行应用程序(状态机)和通过SerialPort连接的外部设备之间进行通信。我有一个.Net Core 3.1.0应用程序,正在使用Sytem.IO.Ports(4.7.0)。我正在使用FTDI USB串行适配器。

我必须监视由发送到我的计算机的数据指示的设备状态,并根据设备状态使用命令进行回复以进入下一个状态。

使用腻子时发送和接收作品没有问题

当使用命令行作为键盘输入和输出时,没有问题

不幸的是,当将数据从另一个线程发送到设备时,似乎两个站点都同时发送,并且发生了冲突,这使我的目标崩溃。

    Initialization:
    _port = new SerialPort(
                    Parameters.TelnetCOMport,
                    Parameters.TelnetBaudrate,
                    Parameters.TelnetParity,
                    Parameters.TelnetDataBits,
                    Parameters.TelnetStopBits);
                _port.DataReceived += Port_DataReceived;
                _port.ErrorReceived += Port_ErrorReceived;
                _port.Handshake = Handshake.RequestToSend;
                _port.RtsEnable = true;
                _port.DtrEnable = true;
                _port.Encoding = Encoding.ASCII;
                _port.Open();

   private void Send_Command(string command)
    
        lock (_portLock)
        
            _port.Write(command + "\n");
        
    

    private string _dataReceived;

    private void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
    
        lock (_portLock)
        
            byte[] data = new byte[_port.BytesToRead];
            _port.Read(data, 0, data.Length);
            _dataReceived += Encoding.UTF8.GetString(data);
            ProcessDataReceived();
        
    

我试图用锁来避免这种情况,但这没有帮助。唯一有帮助的是,在收到一个状态指示器之后增加了很长的延迟,以确保在发送新命令之前,设备绝对不会发送任何内容。

所以我的问题是:如何在从多线程应用程序通过SerialPort发送数据时避免冲突?

我正在尝试在C#命令行应用程序(状态机)和通过SerialPort连接的外部设备之间进行通信。我有一个.Net Core 3.1.0应用程序,正在使用Sytem.IO.Ports(4.7.0)...

答案

感谢您评论我的问题!

以上是关于C#SerialPort多线程发送/接收冲突的主要内容,如果未能解决你的问题,请参考以下文章

C# 多线程 大量数据实时接收\解析\存储 问题

C# 子线程 传值

多线程应用程序上的 boost::asio::ssl 访问冲突

Serialport DataRecieved 线程在执行前结束

JAVA - 多线程服务器 - 接收和发送之间的延迟

Python使多线程中的每个锁都成为可能