Linux,termios:如何处理select()的否定结果

时间:2014-02-03 11:04:38

标签: linux select arm uart termios

我正在开发一个带有ubuntu的am335x系统,以及从TI(供应商)发布的最后一个内核。 我正在使用虚拟tty设备(ttyUSB0)与远程设备进行通信。经过大约一个小时的连续通信(循环开放 - 发送 - 接收 - 关闭)后,我得到了一个奇怪的read()行为。如果在阻塞模式下打开UART,则读取将永久挂起(无论我在VMIN& VTIME上设置什么值)。如果我在非阻塞模式下打开它,它将永远返回-1(1小时后)。 现在我使用select()来检查是否有要读取的数据。 如果我从select收到否定结果,我该如何处理错误?什么是好习惯?我必须重启服务吗?

此代码是在启动时启动的服务的一部分(使用upstart)。当它挂起时,如果我重新启动它,它会再次起作用。重启对我正在通信的设备没有任何影响。它运作正常。

这是一段代码,只是为了完整性:

        FD_ZERO(&set); /* clear the set */
        FD_SET(tty_fileDescriptor, &set); /* add our file descriptor to the set */
        timeout.tv_sec = 10;
        timeout.tv_usec = 0;
        rv = select(tty_fileDescriptor + 1, &set, NULL, NULL, &timeout);
        if(rv>0){
            letti=read(tty_fileDescriptor,payLoadTMP,300);
        }if(rv<0){
                  perror("select")
                   //what to do here to re-stablish communication?
        }

perror的输出是:

select: Resource temporarily unavailable

这是dmesg上的一个grep

usb 1-1: cp210x converter now attached to ttyUSB0

任何想法?如何重新建立连接?

0 个答案:

没有答案