如何从SerialPort.BytesToRead获取正确的值

本文关键字:获取 BytesToRead SerialPort | 更新日期: 2023-09-27 18:28:43

有时在测试SerialPort.BytesToRead是否包含数据时,它的值为0,但当我的应用程序在几行后遇到断点时,我可以看到它有很多字节。

例如:

我把一些数据写入串行端口。然后我调用一个方法来读取响应:

var bytes = new List<byte>();
var byteCount = _serialPortWrapper.BytesToRead; // the value 0 is stored in byteCount
while (_serialPortWrapper.BytesToRead > 0) // this is 0, so it doesn't go in here
{
    try
    {
        bytes.Add(_serialPortWrapper.ReadByte());
    }
    catch (TimeoutException)
    {
        return null;
    }
}
MyPacket packet; // I set a breakpoint here and I can see that data is available
if (MyPacket.TryParse(bytes.ToArray(), out packet))
{
    return packet;
}
return null;

当我在ProprietaryPacket packet;设置断点时,我可以看到数据是可用的。事实上,在这一点上,如果我将光标向上拖动到bytes.Add(_serialPortWrapper.ReadByte());并让它再次运行,那么我所期望的所有数据都将填充到bytesProprietaryPacket.TryParse中。

我如何使BytesToRead第一次返回正确的值,然后ReadByte()方法才能工作?

edit注意,如果我在运行上述任何一个之前添加Thread.Sleep(500);,它每次都有效。不过我不想这么做,因为这有点像黑客。有办法解决这个问题吗?

如何从SerialPort.BytesToRead获取正确的值

与其监视BytesToRead,不如订阅DataReceived事件。然后,当新数据到达时,您将自动被调用。

如果您不知道如何在相应MSDN页面的上述链接上执行此操作,您将找到一个关于如何订阅事件以及您应该在其中做什么的示例。

在评估测试时,该值是正确的。在评估测试和命中断点并检查值之间,数据已进入缓冲区。这就是为什么在执行Thread.Sleep.时它也有数据