Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 区分装置与超时断开_C_Com_Timeout_Connection_Serial Port - Fatal编程技术网

C 区分装置与超时断开

C 区分装置与超时断开,c,com,timeout,connection,serial-port,C,Com,Timeout,Connection,Serial Port,在通信资源上使用时,可以通过检查读取的字节数是否小于请求的字节数来检测读取超时。例如,当我想读取1个字节时,如果读取超时,则返回0个字节,函数成功 然而,当我在从COM端口读取一些字节后断开设备的连接,并在其旧句柄上启动读取操作时,同样的事情发生了:函数成功,并表示返回了0个字节 由于当前没有可用数据,如何区分设备断开连接和简单读取超时 目前,我正在检查是否返回了0个字节,如果是,我将检查设备是否仍然使用WMI连接。然而,这看起来不是很干净,我希望我能在这里找到更好的解决方案 更新 评论中询问的

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

然而,当我在从COM端口读取一些字节后断开设备的连接,并在其旧句柄上启动读取操作时,同样的事情发生了:函数成功,并表示返回了0个字节

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

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

更新

评论中询问的有关设备的更多信息:

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

CTS和DSR都是在数据传输过程中设置的,也可以在设备断开USB端口电缆连接后设置。

如果您使用的是Windows,则可能需要。您还应该查看处理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;
    }
}

如果您使用的是Windows,则可能需要。您还应该查看处理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,因此这是一种方法。

为了完整起见:


在Linux上,读取并选择还返回0,但tcgetattr在断开连接时将返回错误,在超时时返回0,因此这是一种方法。

您可能会认为这是一个文件未找到错误或其他什么……您说您已断开设备连接,并在其旧句柄上启动读取操作。您正在断开USB到串行转换器的连接吗?在这种情况下,会出现读取错误。如果您正在断开串行端口与电缆的连接,但串行端口与电脑保持连接,则该句柄不是旧句柄-该句柄用于仍然连接的串行端口,因此仍然有效。在这种情况下,除非你的设备使用握手线来表示它存在,否则你将无法做很多事情,你也可以检查它是否不存在。我阅读并在阅读时断开设备。是的,但是你如何断开设备的连接?它是通过串行电缆连接到正常的COM端口,还是删除了从系统中完全删除COM端口的东西?设备连接到电脑上的正常usb端口。端口本身没有从系统中删除。您可能会认为是文件未找到错误或什么……您说您已断开设备并启动了一个usb端口读取旧手柄上的操作。您正在断开USB到串行转换器的连接吗?在这种情况下,会出现读取错误。如果您正在断开串行端口与电缆的连接,但串行端口与电脑保持连接,则该句柄不是旧句柄-该句柄用于仍然连接的串行端口,因此仍然有效。在这种情况下,除非你的设备使用握手线来表示它存在,否则你将无法做很多事情,你也可以检查它是否不存在。我阅读并在阅读时断开设备。是的,但是你如何断开设备的连接?它是通过串行电缆连接到普通的COM端口,还是从系统中完全删除了COM端口?设备连接到电脑上的普通usb端口。端口本身没有从系统中删除。感谢您的帮助!SetCommTimeouts函数使读取文件在3秒后返回,如果您在那里指定了3000ms的读取超时。但是,ReadFile将成功并仅返回0字节,就像设备不再连接的情况一样。我不知道其他通信功能如何帮助我解决问题。您能详细说明我应该检查哪些功能吗?问题是数据传输过程中的断开连接,而不是最初连接到设备。或者你的意思是每次读取0时都设置超时,当它不工作时就意味着断开连接?我得到的断开连接是在数据传输期间。基本上,在移动设备上,USB在传输过程中抖动,导致断开连接,必须将其标识为与超时不同。原因是在我的断开连接场景中,por
t丢失,必须关闭并重新打开手柄。在超时情况下,情况显然不是这样。因此,当检测到超时readbytes==0时,调用SetCommTimeouts函数,如果它失败且错误被拒绝,则检测到错误。是的,上述代码是从端口读取到缓冲区的更大函数的一部分。在我的例子中,每当使用GETLASTrror返回在使用端口句柄的任何函数上拒绝访问时,我都使用C++,并抛出异常。谢谢您的帮助!SetCommTimeouts函数使读取文件在3秒后返回,如果您在那里指定了3000ms的读取超时。但是,ReadFile将成功并仅返回0字节,就像设备不再连接的情况一样。我不知道其他通信功能如何帮助我解决问题。您能详细说明我应该检查哪些功能吗?问题是数据传输过程中的断开连接,而不是最初连接到设备。或者你的意思是每次读取0时都设置超时,当它不工作时就意味着断开连接?我得到的断开连接是在数据传输期间。基本上,在移动设备上,USB在传输过程中抖动,导致断开连接,必须将其标识为与超时不同。原因是在断开连接的情况下,端口丢失,需要关闭并重新打开句柄。在超时情况下,情况显然不是这样。因此,当检测到超时readbytes==0时,调用SetCommTimeouts函数,如果它失败且错误被拒绝,则检测到错误。是的,上述代码是从端口读取到缓冲区的更大函数的一部分。在我的例子中,每当使用GETLASTrror返回使用端口句柄的任何函数拒绝访问时,我都使用C++并抛出异常。