c -区分设备断开与超时



在通信资源上使用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,所以这是一种方法。

相关内容

  • 没有找到相关文章

最新更新