Linux Uart读取阻塞

时间:2014-02-07 20:44:43

标签: linux serial-port embedded-linux uart

我正在用户空间编写一个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;

0 个答案:

没有答案