串行端口读取C#不完整

本文关键字:读取 串行端口 | 更新日期: 2023-09-27 18:21:46

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

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

同样,我的预期输出只有在重新发送Read命令几次或通过使用断点跳过上面的命令后才会出现完整的数据包。否则,我会得到小"字节大小的样本"的预期输出。任何帮助都将不胜感激!

串行端口读取C#不完整

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

我最近在这里发布了一个类似的问题:SerialPort.DataReceived返回异常结果

问题是,正如你所知,程序试图从缓冲区读取,而不能保证设备已经发出了它正在运行的任何命令。我的建议是执行本文中的第一个答案:从C#中的串行端口读取

我在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端口上写入数据。事实上,当你在网络端口连接扫描仪时会出现问题。

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