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

vtwuwzda  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(102)

我有一个打开/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。我希望它应该返回一个负数来指示错误(设备不再可用)。
如何检测已打开的设备是否已断开连接?

axr492tv

axr492tv1#

read()返回0时,您可以在设备文件名上调用stat()。如果USB设备断开连接,则设备节点已经消失,stat()将返回-1,errno==ENOENT。

mdfafbf1

mdfafbf12#

stat()上的设备文件名不安全,可能会出现其他设备连接到USB。
更好的方法是检查fstat( fd, &stat ) .stat.st_nlink在设备与USB断开连接时降为零。所有设备权限也降为零。这不是一个完美的方法,因为断开连接后更改此字段会有几毫秒的延迟。

相关问题