从串口读取字节

时间:2015-12-30 21:33:45

标签: c# winforms serial-port

我正在建立一个应用程序,我需要从串行设备中提取15个字节。 (ScaleXtric c7042 powerbase)字节需要按正确的顺序排列,最后一个是crc。

在后台工作中使用此代码,我得到字节:

byte[] data = new byte[_APB.ReadBufferSize];
_APB.Read(data, 0, data.Length);

问题是我没有先得到第一个字节,就像它将一些字节存储在缓冲区中一样,所以下次DataRecieved事件触发时,我从上一个消息中获取最后x个字节,并且只有来自新的15-x字节。我将字节写入文本框,并将其遍布整个地方,因此某些字节在某处丢失。

我在每次阅读后都尝试清除缓冲区,但没有运气。

_APB = new SerialPort(comboBoxCommAPB.SelectedItem.ToString());
_APB.BaudRate = 19200;
_APB.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandlerDataFromAPB);
_APB.Open();
_APB.DiscardInBuffer();

希望任何人都可以帮助我

1 个答案:

答案 0 :(得分:1)

使用此方法从串行端口读取固定的字节数,对于您的案例toread = 15;

 public byte[] ReadFromSerialPort(SerialPort serialPort, int toRead)
 {
     byte[] buffer = new byte[toRead];
     int offset = 0;
     int read;

    while (toRead > 0 && (read = serialPort.Read(buffer, offset, toRead)) > 0)
    {
        offset += read;
        toRead -= read;
    }
    if (toRead > 0) throw new EndOfStreamException();

    return buffer;
}