根据串口格式读取数据包

时间:2012-10-13 00:28:49

标签: c# .net winforms serial-port packet-capture

我正在使用一个微控制器,根据以下格式将数据发送到PC的串行端口:

Start Byte = 0x7E
Data Bytes ...........
StopByte = 0x7E

所以基本上我想在字节数组中读取这些数据包。我试图使用DataReceived类的SerialPort事件来做到这一点,但它只是失败并且从未完全收到一个好的数据包:

private List<int> _readBuffer = new List<int>();

private void Connection_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    var sp = (SerialPort)sender;
    var indata = sp.ReadChar();

    if (indata == 0x7E && _readBuffer.Count == 0)
        _readBuffer.Add(indata);

    if(_readBuffer.Count > 0 && indata != 0x7E)
        _readBuffer.Add(indata);

    if(_readBuffer.Count > 0 && indata == 0x7E)
    {
        _readBuffer.Add(indata);

        //Dump packet to textbox
        Invoke(new EventHandler((o, args) =>
        {
           foreach(var i in _readBuffer)
           {
               tbIn.Text += string.Format("{0:X} ", i);
           }

            _readBuffer = new List<int>(); //Renew the reading buffer array!
        }));
    }
}

我无法弄清楚可能出现什么问题,我只得到文本框的开头和结尾字节,如:

7E 7E

虽然我知道正确的数据包是:

7E 0 43 00 FF FF 0 0 7E

期待您的提示/技巧!

1 个答案:

答案 0 :(得分:3)

嗯......所以让我们来看看那段代码吧。我添加了一些我在下面引用的评论。

var sp = (SerialPort)sender;
var indata = sp.ReadChar();  // A

if (indata == 0x7E && _readBuffer.Count == 0) // B
    _readBuffer.Add(indata);  

if(_readBuffer.Count > 0 && indata != 0x7E) // C
    _readBuffer.Add(indata);

if(_readBuffer.Count > 0 && indata == 0x7E) // D
{
    _readBuffer.Add(indata);

    //Dump packet to textbox
    Invoke(new EventHandler((o, args) =>
    {
       foreach(var i in _readBuffer)
       {
           tbIn.Text += string.Format("{0:X} ", i);
       }

        _readBuffer = new List<int>(); //Renew the reading buffer array!
    }));
}

您在“A”处致电sp.ReadChar()

在“B”你测试并且它等于,大概是0x7E,你有一个空列表,所以你将7E添加到列表中。

“C”评估为真,因为indata确实等于7E

“D”确实评估为真,因为indata仍然等于7E而你在列表中有1件事。

所以现在7E在列表中两次。你刚刚复制了两次相同的字节。

然后将两个列表项推入文本框... 7E两次。

您只拨打过一次sp.ReadChar。如果要获取该数据,则需要从SerialPort读取其余数据。这样做,我想你会找到你正在寻找的所有字节。