我正在开发一个个人项目,以从Arduino读取RFID标签。 当我阅读第一个标签时;我收到了总字节数,并且信息已正确处理。 但是,在阅读以下时间时;好像我的电脑正在“看到”接收到的第一个字节(共8个字节)的事件;然后处理一次接收到的数据; (当缓冲区中只有6个字节时)。 发送完这6个要处理的字节后,它会注意到有一个新的字节传入并进行处理,随后的字节也是如此。创建结果时会产生两条分别为6和2个字节的消息。
结果示例:
第一读:消息:06DB0934
二读:消息1:06
第二读:消息1:DB0934
下面是我的普通代码:
private void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (port.IsOpen)
{
byte[] data = new byte[1024];
int bytesRead = port.Read(data, 0, data.Length);
idTag = Encoding.ASCII.GetString(data, 0, bytesRead);
// Custom Event that will update Information on Main Form
OnTagReceived();
}
}
有什么办法解决这个问题吗?
答案 0 :(得分:1)
由于这是在接收到的数据中,因此您需要将传入的字节存储在缓冲区中,直到您读够为止。
将缓冲区作为全局/实例变量分开保存,
private string _tagBuffer;
然后使用您的方法
if (port.IsOpen)
{
byte[] data = new byte[1024];
int bytesRead = port.Read(data, 0, data.Length);
_tagBuffer += Encoding.ASCII.GetString(data, 0, bytesRead);
if (_tagBuffer.Length >= 8)
{
idTag = tagBuffer.substring(0, 8);
tagBuffer = tagBuffer.substring(8); // might be 9
OnTagReceived();
}
}
最好将标签放在发送给事件的参数中,而不要放在idTag
中。