无法检索完整的串行数据

时间:2019-03-07 12:01:29

标签: c# winforms arduino serial-port port

我正在开发一个个人项目,以从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(); 
    }
}

有什么办法解决这个问题吗?

1 个答案:

答案 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中。