Winapi Win32 API:读取文件未超时

Winapi Win32 API:读取文件未超时,winapi,usb,serial-communication,Winapi,Usb,Serial Communication,我正在写一些代码与一个硬件接口。硬件通过USB连接到PC,USB到串行转换器位于设备内部(在Windows中显示为COM端口设备) 我在Win32 API ReadFile系统调用中遇到问题。我似乎不能像广告上说的那样让它工作。我已将COMMTIMEOUTS结构设置为: COMMTIMEOUTS ct; ct.ReadIntervalTimeout = MAXDWORD; ct.ReadTotalTimeoutconstant = 0; ct.ReadTotalTimeoutMultiplier

我正在写一些代码与一个硬件接口。硬件通过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文档,它说:

ReadIntervalTimeout

最长时间 允许在到达之间经过 通信上的两个字节 行,以毫秒为单位。在 ReadFile操作,时间段 当第一个字节为 收到。如果 任何两个字节的到达都超过此值 数量,ReadFile操作是 已完成,并且所有缓冲数据都已完成 返回。值为零表示 不使用间隔超时

MAXDWORD的值,与 两个参数的值均为零值 ReadTotalTimeoutConstantReadTotalTimeOut乘数成员, 指定执行读取操作 立即返回字节 甚至已经收到了 如果没有收到字节


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

D'oh!结果表明,ReadFile阻塞只是一种症状,而不是问题所在。所讨论的硬件设备中只有一个4MHz处理器。将写入设备的3个字符的命令拆分,并在字符之间分别发送1毫秒的暂停时间,解决了问题。

您是否检查了对
setcommtimeout
的调用是否成功?确实如此。没有返回错误。我甚至试着在设备上再次调用GetCommTimeouts()到一个新的COMMTIMEOUTS结构中,以确保设备设置正确。也许USB端口上的UART没有缓冲区-我从引用的文档的第二段中得出-那里有些可疑。此外,ReadFile文档没有说明在没有可用数据时返回的任何内容。另外,看看MAXDWORD的值是多少也没什么坏处,或者试着把1改为…@Danel:来自ReadFile()文档:“从通信设备读取时,ReadFile的行为由设置的当前通信超时决定,并使用SetCommTimeouts和GetCommTimeouts函数检索。如果未能设置超时值,可能会出现不可预测的结果。有关通信超时的更多信息,请参阅COMMTIMEOUTS。“是的,这是Microsoft串行端口驱动程序对它的解释。正在编写所有USB串行端口仿真器的frikkin笨蛋,每个人都以非常合理的价格购买了许可证,但他还没有意识到这一点。