我正在用户空间编写一个linux应用程序,通过uart与FPGA通信。我正在使用指定vmin和vtime的非规范阻塞读取操作。 FPGA响应我在uart上发送的命令,其中没有固定的字节数。我可以成功读取它们很长一段时间,但在执行一段时间之后,代码就会陷入读取功能。对于阻塞读取,我会假设它在指定的vtime周期后退出例程,即使它没有在uart缓冲区上看到任何数据。但是,它只是挂起整个应用程序。 有没有人知道必须造成什么?
以下是我为uart端口设置的属性:
struct termios oldtio; int fd;
fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY);
/* get old settings */
if (tcgetattr(fd, &oldtio) == -1) {
perror("tcgetattr");
}
/* no parity, CR=>NL */
oldtio.c_iflag |= IGNPAR | ICRNL;
/* XON/XOFF flow control off */
oldtio.c_iflag &= ~IXON;
oldtio.c_oflag = 0;
/* zero the character size bits */
oldtio.c_cflag &= ~CSIZE;
/* 8 data bits */
oldtio.c_cflag |= CS8 | CLOCAL | CREAD;
/* no hw flow control, no parity and 1 stop bit */
oldtio.c_cflag &= ~CRTSCTS & ~PARENB & ~CSTOPB;
if (cfsetispeed(&oldtio, B115200) == -1) {
perror("cfsetispeed");
exit(1);
}
if (cfsetospeed(&oldtio, B115200) == -1) {
perror("cfsetospeed");
exit(1);
}
/* raw mode */
//oldtio.c_lflag &= ~(ICANON | ISIG);
oldtio.c_lflag &= ~(ECHO | ICANON | ISIG);
oldtio.c_cc[VTIME] = vtime_value;
oldtio.c_cc[VMIN] = vmin_value;
if (tcflush(fd, TCIFLUSH) == -1) {
perror("tcflush");
exit(1);
}
if (tcsetattr(fd,TCSANOW,&oldtio) == -1) {
perror("tcsetattr");
exit(1);
}
baud_rate = 115200;
vmin = 0;
vtime=255;