- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个与测试设备对话的界面。该设备通过串行端口进行通信,并以已知字节数响应我发送的每个命令。
我目前的结构是:
但是,当我使用 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/
使用登录后,我想吐出用户名。 但是,当我尝试单击登录按钮时, 它给了我力量。 我看着logcat,但是什么也没显示。 这种编码是在说。 它将根据我在登录屏幕中输入的名称来烘烤用户名。 不会有任何密码。
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或include a min
我是一名优秀的程序员,十分优秀!