3

我正在编写一些代码来与一个硬件接口。硬件通过 USB 连接到 PC,设备内部带有 USB 到串行转换器(它在 Windows 中显示为 COM 端口设备)。

我遇到了 Win32 API ReadFile 系统调用的问题。我似乎无法让它像宣传的那样工作。我已经这样设置了 COMMTIMEOUTS 结构:

COMMTIMEOUTS ct;
ct.ReadIntervalTimeout = MAXDWORD;
ct.ReadTotalTimeoutconstant = 0;
ct.ReadTotalTimeoutMultiplier = 0;
ct.WriteTotalTimeoutConstant = 0;
ct.WriteTotalTimeoutMultiplier = 0;

if(SetCommTimeouts(device_id_, &ct) == 0)
{
     return ERROR; // this is never hit.
}

根据 Win32 API 文档,它说:

读取间隔超时

两个字节到达通信线路之间允许经过的最长时间,以毫秒为单位。在 ReadFile 操作期间,时间段从接收到第一个字节开始。如果任意两个字节到达的时间间隔超过此数量,则ReadFile操作完成并返回任何缓冲数据。零值表示不使用间隔超时。

MAXDWORD 值与 ReadTotalTimeoutConstantReadTotalTimeoutMultiplier成员的零值相结合,指定读取操作将立即返回已收到的字节,即使没有收到任何字节。

我发送的命令应该返回一个单字节整数。大多数时候,设备接收到命令并返回适当的值。然而,有时它似乎没有返回值并且 ReadFile() 会阻塞,直到收到更多字节(例如,通过按下设备上的按钮)。一旦按下按钮,就会收到我期望的初始整数响应以及按钮按下代码。根据 MSDN 文档,虽然这不是我对设备本身所期望的行为,但我更关心 ReadFile() 在不应该出现的情况下阻塞。ReadFile() 在这里阻塞有补救措施吗?

4

1 回答 1

0

哦!原来 ReadFile 阻塞只是一个症状,而不是问题。有问题的硬件设备中只有一个 4MHz 处理器。拆分写入设备的 3 个字符命令并单独发送它们,字符之间有 1ms 的停顿可以解决此问题。

于 2010-10-20T23:39:31.810 回答