C# 无法检索完整的串行数据

C# 无法检索完整的串行数据,c#,winforms,arduino,serial-port,port,C#,Winforms,Arduino,Serial Port,Port,我正在开发一个从Arduino读取RFID标签的个人项目。 当我读到第一个标签时;我收到总字节数,信息处理正确。 然而,当阅读以下时间;似乎我的电脑在接收到8的第一个字节时看到接收到的事件;然后一次处理接收到的数据;当缓冲区中只有6个字节时。 在发送这6个待处理的字节后,它会注意到一个新的字节正在输入,并处理该字节和后面的字节;创建两条6字节和2字节的消息 结果示例: 第一次读取:消息:06DB0934 二读:信息1:06 二读:消息1:DB0934 我谦虚的代码如下: private void

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

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

因为这是在接收的数据中,所以需要将传入的字节存储在缓冲区中,直到读取足够的数据为止

将缓冲区作为全局/实例变量分开

私有字符串_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中更好。

看起来您需要将读取放入排序循环中,以便您可以继续读取,直到收到所需的所有数据。Hello@NibblyPig:我尝试使用StringBuilder并从Serial.Read中追加每个字符;在不同的尝试中:2个foreach循环;一个用于从输入数据中获取字符,另一个用于创建字符串。但是没有成功,太棒了!非常好,非常感谢。这就是你计算字节的方式!它使用8个字符。但我知道一个空格或一条线会导致这个值的增加。我不明白的是为什么tagBuffer的StartIndex=tagBuffer.Substring8;也是8岁。我是说;从末尾开始?因为它是0索引的,所以0,8表示从第1个字符的位置0开始读取8个字符。Substring8表示从第9个字符的位置8开始读取字符串的其余部分。所以基本上它删掉了前8个字符,因为我们已经处理过了。我把//设为9,因为我不确定该重载是否为零索引,并且懒得查找它