我正在开发一个带有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
任何想法?如何重新建立连接?