【发布时间】:2018-08-29 09:10:40
【问题描述】:
我有一个通过 RS485 进行通信的设备,我需要在 C# 中进行环回以接收我的数据并将它们发回。第一个字节包含有关即将到来的数据长度的信息。有时,C# 会分几部分触发一个事件。我需要我只收到其中一部分才能一次性寄回。
var buffer = new byte[1000];
port = new SerialPort(ConfigParams.PORT, 115200, Parity.None, 8, StopBits.One);
port.Handshake = Handshake.None;
port.RtsEnable = true;
port.DtrEnable = true;
port.DataReceived += (sender, e) =>
{
var length = port.ReadByte();
Thread.Sleep(10);
var bytes = port.Read(buffer, 1, length);
buffer[0] = (byte)length;
port.Write(buffer, 0, length + 1);
mainForm.Log("Port (" + (length + 1).ToString() +"): " + Encoding.UTF8.GetString(buffer, 0, length + 1)+"\n");
mainForm.Log("Data was sended.\n");
};
在第一步中,我读取第一个字节以获取即将到来的字节数。然后,我读取了其余的字节。如果我不在那里插入 Thread.Sleep(10) 行,Event DataReceived 有时会分几个部分触发。使用 Thread.Sleep(10) 每次都能正常工作。
你知道为什么会这样吗?我希望如果我说我想读取 40 个字节,SerialPort 将尝试接收所有这些 40 个字节或发生异常。我试图改变属性 ReadTimeout 但没有改变。
【问题讨论】:
-
不要使用握手它是过时的并且不能可靠地工作。
标签: c# serial-port rs485