有时 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()
方法将起作用?
edit 注意,如果我在上述任何运行之前添加 Thread.Sleep(500);
,它每次都有效。我不想这样做,因为它有点像黑客。有没有办法解决?
您应该订阅
BytesToRead
事件,而不是关注DataReceived
。然后,当新数据到达时,您将自动被调用。如果您不知道如何在上面指向相应 MSDN 页面的链接上执行此操作,您将找到有关如何订阅事件以及您应该在其中做什么的示例。