gpt4 book ai didi

c# - SerialPort.Read(byte[], int32, int32) 没有阻塞,但我想要它——我该如何实现?

转载 作者:行者123 更新时间:2023-11-30 13:26:55 33 4
gpt4 key购买 nike

我正在编写一个与测试设备对话的界面。该设备通过串行端口进行通信,并以已知字节数响应我发送的每个命令。

我目前的结构是:

  • 发送命令
  • 读回指定字节数
  • 继续申请

但是,当我使用 SerialPort.Read(byte[], int32, int32) 时,该函数没有阻塞。因此,举例来说,如果我调用 MySerialPort.Read(byteBuffer, 0, bytesExpected);,该函数将返回小于指定数量的 bytesExpected。这是我的代码:

public bool ReadData(byte[] responseBytes, int bytesExpected, int timeOut)
{
MySerialPort.ReadTimeout = timeOut;
int bytesRead = MySerialPort.Read(responseBytes, 0, bytesExpected);
return bytesRead == bytesExpected;
}

我这样调用这个方法:

byte[] responseBytes = new byte[13];
if (Connection.ReadData(responseBytes, 13, 5000))
ProduceError();

我的问题是,我似乎永远无法像我告诉它的那样让它读取完整的 13 个字节。如果我在 SerialPort.Read(...) 之前放置一个 Thread.Sleep(1000) 一切正常。

如何强制 Read 方法阻塞,直到超过 timeOut 或读取指定的字节数?

最佳答案

这是预料之中的;大多数 IO API 允许您指定 upper 边界 - 它们只需要返回至少一个字节,除非它是 EOF,在这种情况下它们可以返回一个非正值。为了补偿,你循环:

public bool ReadData(byte[] responseBytes, int bytesExpected, int timeOut)
{
MySerialPort.ReadTimeout = timeOut;
int offset = 0, bytesRead;
while(bytesExpected > 0 &&
(bytesRead = MySerialPort.Read(responseBytes, offset, bytesExpected)) > 0)
{
offset += bytesRead;
bytesExpected -= bytesRead;
}
return bytesExpected == 0;
}

唯一的问题是您可能需要减少每次迭代的超时时间,方法是使用 秒表 或类似工具来查看已经过了多少时间。

请注意,我还删除了 responseBytes 上的 ref - 您不需要它(您不需要重新分配该值)。

关于c# - SerialPort.Read(byte[], int32, int32) 没有阻塞,但我想要它——我该如何实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16439897/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com