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

问题描述 投票:0回答:2

有时在我测试它是否包含数据时 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());
并让它再次运行,我期望的所有数据都会填充到
bytes
中并且
ProprietaryPacket.TryParse
然后将起作用。

我怎样才能使这项工作使

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

编辑注意,如果我在上述任何运行之前添加

Thread.Sleep(500);
,它每次都有效。不过我不想这样做,因为这有点麻烦。有什么办法解决这个问题吗?

c# serial-port
2个回答
0
投票

与其观看

BytesToRead
,不如订阅
DataReceived
事件。然后,当有新数据到达时,您将自动被呼叫。

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.