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

时间:2012-03-21 12:21:20

标签: c# serial-port

有时我测试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);,则每次都有效。我不想这样做,因为它有点像黑客。有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:0)

您应该订阅DataReceived事件,而不是观看BytesToRead。然后,当新数据到达时,您将自动被调用。

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

答案 1 :(得分:0)

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