在通信资源上使用ReadFile
时,可以通过检查读取的字节数是否少于请求的字节数来检测读取超时。例如,当我想读取1字节时,在读取超时的情况下,返回0字节,函数成功。
然而,当我从COM-Port断开设备(在读取一些字节之后)并在其旧句柄上开始读取操作时,同样的事情发生了:函数成功并表示返回0字节。
如何区分设备断开连接和简单的读取超时,因为目前没有数据可用?
目前,我正在检查是否返回0字节,如果是,我检查设备是否仍然使用WMI连接。但是,这看起来不太干净,我希望我能在这里找到一个更好的解决方案。
关于设备的更多信息(在注释中询问):
dcb.fDtrControl = DTR_CONTROL_ENABLE;
dcb.fRtsControl = RTS_CONTROL_ENABLE;
CTS和DSR都是在数据传输期间设置的,也是在设备从USB端口拔下电缆断开连接后设置的。
如果你使用的是Windows,你可能需要SetCommTimeoutsFunction。您还应该检查处理RS232的其他通信功能。
编辑:当将一些代码从具有实际RS232的手持设备移动到具有USB RS232的手持设备时,我遇到了非常类似的情况。摇动USB,端口就会在应用程序不知道的情况下"丢失"。为了解决这个问题,我编写的代码如下(Win32平台)
COMMTIMEOUTS CTO;
CTO.ReadIntervalTimeout = 500;
CTO.ReadTotalTimeoutConstant = 500;
CTO.ReadTotalTimeoutMultiplier = 0;
if (SetCommTimeouts(hPort,&CTO) == 0)
{
DWORD dwError = GetLastError();
if (dwError == 5)
{
// Access denied, possibly loose USB, return error code or throw exception
return Housten__We_have_a_problem;
}
}
为了完整:
在Linux上,读取和选择也返回0,但tcgetattr
将在断开连接时返回错误,在超时时返回0,所以这是一种方法。