我正在使用 ubuntu 和 TI(供应商)发布的最后一个内核在 am335x 系统上进行开发。我正在使用虚拟 tty 设备 (ttyUSB0) 与远程设备通信。经过大约一小时的连续通信(循环打开-发送-接收-关闭)后,我得到了一个奇怪的 read() 行为。如果 UART 在阻塞模式下打开,则读取将永远挂起(无论我在 VMIN&VTIME 上设置什么值)。如果我以非阻塞模式打开它,它会永远返回-1(1小时后)。现在我正在使用 select() 来检查是否有要读取的数据。如果我收到来自 select 的否定结果,我该如何处理该错误?什么是好的做法?我必须重新启动服务?
此代码是在启动时启动的服务的一部分(使用新贵)。当它挂起时,如果我重新启动它,它会再次工作。重新启动对我正在与之通信的设备没有任何影响。它工作正常。
这是一段代码,只是为了完整性:
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
有任何想法吗?如何重新建立连接?