我通过串口与设备通信,速度为512000。所有串口设置:
SerialPort = new SerialPort();
SerialPort.BaudRate = 512000;
SerialPort.Parity = Parity.None;
SerialPort.DataBits = 8;
SerialPort.StopBits = StopBits.One;
SerialPort.ReadTimeout = 2000;
SerialPort.WriteTimeout = 2000;
我迷上了 DataReceived 事件并以这种方式读取数据:
private bool statusRead;
private async void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
if (statusRead)
return;
statusRead = true;
while (SerialPort.BytesToRead == 7)
await Task.Delay(1);
byte[] bufferHeader = new byte[7];
SerialPort.Read(bufferHeader, 0, bufferHeader.Length);
while (SerialPort.BytesToRead < bufferHeader[4] - 7)
await Task.Delay(1);
byte[] buffer = new byte[bufferHeader[4] - 7];
SerialPort.Read(buffer, 0, buffer.Length);
if (Crc.CheckCrc(ref buffer, 0, buffer.Length, BitConverter.ToUInt16(bufferHeader, 5)))
{
...
}
else
{
...
SerialPort.ReadExisting();
}
statusRead = false;
}
catch (Exception)
{
statusRead = false;
}
if (SerialPort.BytesToRead > 0)
port_DataReceived(null,null);
}
读取帧时,最常见的情况是帧没有第一个字节。或者某些数据不合适。我可以在 C# 方面做一些事情来防止这种情况发生吗?
它期望一个看起来像这样的框架:
11 26 19 0 16 102 143 7 27 0 0 0 0 0 0 0
但我得到的例子是:
26 19 0 16 102 143 7 27 0 0 0 0 0 0 0
11 26 19 0 16 102 0 143 7 27 0 0 0 0 0 0
我之前做过一些串口应用,但从来没有以这种速度进行通信。速度是造成此类错误的原因吗?我分析了板上的传出帧,它们应该是这样的。然后这些数据被发送到我连接的第二块板,但我无法分析那里的帧是什么样的。
hi statusRead 变量是否已初始化为 false Frist?