我正在使用一个微控制器,根据以下格式将数据发送到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
期待您的提示/技巧!
答案 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读取其余数据。这样做,我想你会找到你正在寻找的所有字节。