我正在读取串行/ UART中的数据,波特率为9600(我的115200波特率工作正常)
我编写了下面的代码,但每次选择API都会超时,它需要超过2秒的超时,这是不可取的。因为我有2048字节的数据所以在100毫秒内我应该能够得到一些数据,但我认为选择API没有接收中断,即使串行的Rx缓冲区有一些数据需要处理。
注意:相同的代码在beaglebone black上工作正常,而不是在intel atom-3900 /内核上使用的是Linux-intel 4.9。
感谢您的期待
码:
int main(void)
{
int ret;
char buf[1280];
fd_set m_Inputs; // fd_set for the select call for com input
int m_maxFD; // max FD for select() call.
struct timeval tv;
/*Open Serial port in non blocking mode*/
int fd1;
fd1 = open("/dev/ttyS1", O_RDWR | O_NOCTTY | O_NONBLOCK);
/* get the termios structure */
struct termios options;
tcgetattr(fd1, &options); // Get the current options for the port...
// Set the baud rates...
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);
// Enable the receiver and set local mode...
options.c_cflag |= (CLOCAL | CREAD | CS8);
options.c_cflag &= ~PARENB; // ignore parity
options.c_cflag &= ~CSTOPB; // 1 stop bit (2 if set)
options.c_cflag &= ~CSIZE; // clear the size bits
options.c_cflag &= ~CRTSCTS; //No hard flow control
options.c_cflag &= ~HUPCL; //Hang Up on last Close
options.c_cflag |= CS8; // reset the size to 8 bits / char
options.c_cc[VMIN]=1;
options.c_cc[VTIME] = 1;
options.c_oflag = 0;
options.c_lflag = 0; //ICANON;
// Set the new options for the port...
tcsetattr(fd1, TCSANOW, &options);
cout << endl << "FD1 = " << fd1 << endl;
while (1)
{
fd_set rfds; // fd_set for the select call for com input
FD_ZERO(&rfds);
FD_SET(fd1, &rfds);
tv.tv_sec = 0;
tv.tv_usec = 100000;
ret = select(fd1 + 1, &rfds, NULL, NULL, &tv);
if (ret > 0)
{
ret = read(fd1, buf, 127);
buf[ret] = '\0';
cout << buf;
}else{
cout << "Time OUT" << endl;
break;
}
}
return 0;
}
您的UART帧有一个起始位,8个数据位和一个停止位 - 每个字节10位。因此,2048字节的最小传输时间为2048 * 10/9600 = 2.1333秒。目前还不清楚你是如何确定它只需要100毫秒
—
克利福德
OP说“在100ms内我应该能够获得_some_data”(我的重点) - 即他们不期望收到整个信息。
—
barny
select()
退货代码的检查不完整。仅0
表示超时已过期。你应该添加一个分支ret < 0
并检查errno
。