不完整的串行端口读取C#

不完整的串行端口读取C#,c#,multithreading,serial-port,bytearray,C#,Multithreading,Serial Port,Bytearray,我试图从一个连接到COM端口的扫描器中读取字节到一个字节数组中。C#中的串行端口库已经有一个读取函数,这是我用来尝试读取的函数。我将其设置为将读入的字节输出到控制台。我使用的是一个非常可预测的协议,所以当我在代码中传递这一行时,我知道我期望的是什么类型的字节数组。然而,如果我运行这个程序,我只能读入一个字节。如果我重新运行同一个程序实例(通过发送相同的read命令),我将获得预期的剩余字节。只有在我第三次运行它之后,我才能得到我期望的所有字节。但是,如果我只是在读取行上插入一个断点并跨行,则完全

我试图从一个连接到COM端口的扫描器中读取字节到一个字节数组中。C#中的串行端口库已经有一个读取函数,这是我用来尝试读取的函数。我将其设置为将读入的字节输出到控制台。我使用的是一个非常可预测的协议,所以当我在代码中传递这一行时,我知道我期望的是什么类型的字节数组。然而,如果我运行这个程序,我只能读入一个字节。如果我重新运行同一个程序实例(通过发送相同的read命令),我将获得预期的剩余字节。只有在我第三次运行它之后,我才能得到我期望的所有字节。但是,如果我只是在读取行上插入一个断点并跨行,则完全可以避免这个问题。如果我这样做,我每次都会得到一个完整的阅读。我的问题是,如何在每次都不插入断点的情况下获得完整的读取?我已经尝试使用系统暂停方法来停止执行,并让COM端口扫描足够快,但这不起作用。我也尝试过使用线程(参见下面的代码)。这也不起作用。有什么建议吗

    t = new Thread(() => device.Read(buffer));
    t.Start();
    t.Join();

同样,我的预期输出只有在重新发送Read命令几次之后,或者通过带断点的单步执行上述命令,才会以完整的数据包形式出现。否则,我会在小“字节大小的样本”中获得预期的输出。任何帮助都将不胜感激

这是字节流的预期行为。循环读取并将接收到的字节逐个泵入ProtocolUnit类实例(或其他),直到完成并验证。

我最近在这里发布了一个类似的问题:

问题是,正如您所知,程序试图从缓冲区中读取数据,而不保证设备已发出其正在运行的任何命令。我的建议是实施本文的第一个答案:

我在DataReceived事件中的实现如下:

void serialPort_DataReceived(object s, SerialDataReceivedEventArgs e)
    {
        byte[] data = new byte[serialPort.BytesToRead];
        serialPort.Read(data, 0, data.Length);
        Console.Write(System.Text.Encoding.UTF8.GetString(data));
    }
只需将其连接到代码中:

serialPort.DataReceived += serialPort_DataReceived;

最好的方法是加入while循环,并在字节读取之间提供10毫秒的睡眠时间。这将给扫描仪10毫秒的时间在COM端口上写入数据。实际上,当你们在网络端口连接扫描仪时,问题就发生了


您还可以编写委托或事件,当从扫描仪中完全读取数据时将发出通知。

您的代码不是有效代码,没有只接受字节数组的
SerialPort
功能。只有两个读取功能有三个参数为什么不使用串行端口datareceived事件获取数据?无需使用其他线程,因为datareceived处理程序位于其自己的线程中。读取被重载以接受字节数组,这是调用
Read