在通信资源上使用ReadFile
时,可以通过检查是否读取的字节数少于请求的字节数来检测读取超时。例如,当我想读取1个字节时,如果读取超时,则返回0个字节并且函数成功。
但是,当我从COM-Port断开设备(读取一些字节后)并在其旧句柄上启动读取操作时,会发生同样的事情:函数成功并表示返回了0个字节。
如何区分设备断开连接和简单的读取超时,因为当前没有数据可用?
目前,我正在检查是否返回了0个字节,如果是,我检查设备是否仍然使用WMI连接。但是,这看起来不太干净,我希望我能在这里找到更好的解决方案。
更新
有关该设备的更多信息(如评论中所述):
dcb.fDtrControl = DTR_CONTROL_ENABLE;
dcb.fRtsControl = RTS_CONTROL_ENABLE;
CTS和DSR都在数据传输期间设置,也可以在设备断开连接后从USB端口拔下电缆。
答案 0 :(得分:0)
如果您使用的是Windows,则可能需要SetCommTimeoutsFunction。您还应该查看othe communications functions处理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;
}
}
答案 1 :(得分:0)
为了完整性:
在Linux上,read和select也返回0,但是tcgetattr
将在断开时返回错误,在超时时返回0,这是一种方法。