串口接收到的部分帧发生移位或丢失数据

问题描述 投票:0回答:1

我通过串口与设备通信,速度为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

我之前做过一些串口应用,但从来没有以这种速度进行通信。速度是造成此类错误的原因吗?我分析了板上的传出帧,它们应该是这样的。然后这些数据被发送到我连接的第二块板,但我无法分析那里的帧是什么样的。

c# serial-port
1个回答
0
投票

hi statusRead 变量是否已初始化为 false Frist?

© www.soinside.com 2019 - 2024. All rights reserved.