1

我正在使用根据以下格式将数据发送到 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

期待您的提示/技巧!

4

1 回答 1

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!
    }));
}

你打电话给sp.ReadChar()“A”

在“B”处,您测试它可能等于 0x7E,并且您有一个空列表,因此您将 7E 添加到列表中。

"C"计算为真,因为 indata 实际上等于 7E

“D”确实评估为真,因为 indata 仍然等于 7E,并且您在列表中有 1 个东西。

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

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

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

于 2012-10-13T01:21:40.763 回答