【问题标题】:Unable to retrieve complete serial data无法检索完整的串行数据
【发布时间】:2019-07-29 07:27:03
【问题描述】:

我正在开发一个从 Arduino 读取 RFID 标签的个人项目。 当我阅读第一个标签时;我收到总字节数并且信息被正确处理。 但是,在阅读以下时间时;似乎我的 PC 正在“看到”接收到的第一个字节(共 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(); 
    }
}

知道如何解决这个问题吗?

【问题讨论】:

  • 看来您需要将 Read 放入一个排序循环中,以便您可以继续阅读,直到您收到所需的所有数据。
  • 你好@NibblyPig:我试过使用StringBuilder并从Serial.Read中追加每个Char;在不同的尝试中:2个foreach循环;一个是从传入数据中获取字符,另一个是创建一个字符串。但没有成功。

标签: c# winforms arduino serial-port port


【解决方案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中。

【讨论】:

  • 太棒了!工作得很好非常感谢。所以这就是你计算字节的方式!它适用于 8 个字符。但我知道 Space 或 Line 可能会导致这个值的增加。我不明白为什么 tagBuffer = tagBuffer.Substring(8); 的“StartIndex”;也是8。我的意思是;从头开始?
  • 因为它是 0 索引的,所以 0, 8 表示从位置 0(即第一个字符)开始读取 8 个字符。 Substring(8) 表示从位置 8(即第 9 个字符)开始并读取字符串的其余部分。所以基本上它会删除前 8 个字符,因为我们已经处理过它们。我把 // 可能是 9 因为我不确定这个重载是否是零索引并且懒得去查找它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-22
  • 2015-05-14
  • 1970-01-01
相关资源
最近更新 更多