区分设备与超时断开连接

时间:2011-07-19 13:49:07

标签: c com timeout connection serial-port

在通信资源上使用ReadFile时,可以通过检查是否读取的字节数少于请求的字节数来检测读取超时。例如,当我想读取1个字节时,如果读取超时,则返回0个字节并且函数成功。

但是,当我从COM-Port断开设备(读取一些字节后)并在其旧句柄上启动读取操作时,会发生同样的事情:函数成功并表示返回了0个字节。

如何区分设备断开连接和简单的读取超时,因为当前没有数据可用?

目前,我正在检查是否返回了0个字节,如果是,我检查设备是否仍然使用WMI连接。但是,这看起来不太干净,我希望我能在这里找到更好的解决方案。

更新

有关该设备的更多信息(如评论中所述):

dcb.fDtrControl = DTR_CONTROL_ENABLE;
dcb.fRtsControl = RTS_CONTROL_ENABLE;

CTS和DSR都在数据传输期间设置,也可以在设备断开连接后从USB端口拔下电缆。

2 个答案:

答案 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,这是一种方法。