我正在处理一个来电显示串行设备并编写以下程序:
serialPort = new SerialPort("COM7", 19200, Parity.None, 8, StopBits.One);
serialPort.DataReceived += serialPort_DataReceived;
serialPort.RtsEnable = true;
serialPort.Encoding = Encoding.ASCII;
serialPort.Open();
void serialPort_DataReceived(object s, SerialDataReceivedEventArgs e)
{
byte[] data = new byte[serialPort.BytesToRead];
serialPort.Read(data, 0, data.Length);
Console.WriteLine(Encoding.ASCII.GetString(data));
}
Run Code Online (Sandbox Code Playgroud)
首先我收到一个电话,事件完全触发,结果是: "A0101181456926E"
问题是随后的事件......下次我打电话时,事件serialPort_DataReceived会发生很多次,每次都有1个字符.
是否有任何属性可以设置或调用方法来解决此问题?
PS.如果我评论该行serialPort.RtsEnable = true;,我不会收到任何后续事件.
正如Henk所提到的,您可以设置在DataReceived使用属性触发事件之前接收的字节数ReceivedBytesThreshold.
但无论如何,您必须处理一次接收的任意数量的字节.您必须以能够在完全接收消息时识别的方式设计协议.