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多线程发送/接收冲突的主要内容,如果未能解决你的问题,请参考以下文章
多线程应用程序上的 boost::asio::ssl 访问冲突