C:读取功能不会在断开的串行USB设备上返回错误

C:读取功能不会在断开的串行USB设备上返回错误,c,linux,serial-port,C,Linux,Serial Port,我有一个打开/dev/ttyUSB*端口的C应用程序 fd = open(portName.c_str(), O_RDWR | O_NOCTTY | O_NONBLOCK); options.c_cflag |= (CLOCAL | CREAD); options.c_cflag &= ~PARENB; options.c_cflag &= ~CSTOPB; options.c_cflag &= ~CSIZE; option

我有一个打开/dev/ttyUSB*端口的C应用程序

    fd = open(portName.c_str(), O_RDWR | O_NOCTTY | O_NONBLOCK);
    options.c_cflag |= (CLOCAL | CREAD);
    options.c_cflag &= ~PARENB;
    options.c_cflag &= ~CSTOPB;
    options.c_cflag &= ~CSIZE;
    options.c_iflag &= (tcflag_t) ~(INLCR | IGNCR | ICRNL | IGNBRK);
    options.c_oflag &= (tcflag_t) ~(OPOST);
    options.c_cflag |= CS8;
    options.c_cflag |= CRTSCTS;
    options.c_lflag &= ~(ICANON | ECHO | ISIG);
    tcsetattr(fd, TCSANOW, &options);
    struct serial_struct kernel_serial_settings;
    if (ioctl(fd, TIOCGSERIAL, &kernel_serial_settings) == 0) {
                kernel_serial_settings.flags |= ASYNC_LOW_LATENCY;
                kernel_serial_settings..
                ioctl(fd, TIOCSSERIAL, &kernel_serial_settings);
    }
端口打开,我接收数据。但是,如果USB设备稍后断开连接,我调用读取功能:

nRead = _read(fd, buffer, length);
nRead将返回0。我认为它应该返回一个负数,以指示设备不再可用的错误


如何检测打开的设备已断开连接?

当返回零时,可以调用设备文件名。如果USB设备断开连接,则设备节点已消失,stat将返回-1,errno==enoint。

当返回零时,您可以调用设备文件名。如果USB设备断开连接,则设备节点已消失,stat将返回-1,errno==enoint。

@Ryker我想是的-问题是如何检测打开的设备断开连接?如果stat在enoint中出错,这意味着它不存在。因为它以前存在,现在不存在了,所以从这个结果可以得出一个很好的推论。您可以在文件描述符上使用fstat。这类似于在TCP连接断开时读取0。@AndrewHenle-谢谢。很好的解释。@Ryker我想是的-问题是我如何检测到打开的设备断开了连接?如果stat在enoint中出错,这意味着它不存在。因为它以前存在,现在不存在了,所以从这个结果可以得出一个很好的推论。您可以在文件描述符上使用fstat。这类似于在TCP连接断开时读取0。@AndrewHenle-谢谢。很好的解释。