我正在尝试将连接到COM端口的扫描程序中的字节读取到字节数组中。 C#中的串行端口库已经具有读取功能,这是我用来尝试读取的功能。我设置它,以便读入的字节输出到控制台。我正在使用一个非常可预测的协议,因此我知道当我在代码中传递该行时,我期待什么样的字节数组。但是,如果我运行程序,我只读取一个字节。如果我重新运行该程序的同一个实例(通过发送相同的读取命令),我得到剩余的预期字节。只有在我第三次运行之后才能获得我期望的所有字节。如果我只是在读取行上插入一个断点并跨过该行,则完全避免了这个问题。如果我这样做,我每次都会得到完整的阅读。我的问题是,如何在不插入断点的情况下每次都能获得完整的读取?我已经尝试使用系统暂停方法来暂停执行并让COM端口扫描足够快,这不起作用。我也试过使用一个线程(见下面的代码)。这也行不通。有什么建议吗?
t = new Thread(() => device.Read(buffer));
t.Start();
t.Join();
同样,我的预期输出仅在重新发送Read命令几次之后或者通过使用断点逐步执行上述命令而出现在完整数据包中。否则,我会在小的“字节大小的样本”中得到我期望的输出。任何帮助表示赞赏!
答案 0 :(得分:3)
这是字节流的预期行为。然后循环读取并泵送许多字节逐个接收到您的ProtocolUnit类实例(或其他),直到它完成并验证。
答案 1 :(得分:0)
我最近发布了一个类似的问题: SerialPort.DataReceived Returning Strange Results
问题是,如你所知,程序试图从缓冲区中读取,而不保证设备完成发出正在运行的命令。我的建议是在这篇文章中实现第一个答案: Reading from the serial port in 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;
答案 2 :(得分:0)
放入while循环的最佳方法,并在字节读取之间提供10毫秒的休眠时间。这将给扫描器提供10毫秒的时间来在COM端口上写入数据。实际上,当您在网络端口连接扫描仪时会出现问题。
您还可以编写代理或事件,以便在完全从扫描仪读取数据时通知。