我根本無法得到poll()函數來響應通過UART1/dev/ttyO1發送的數據。代碼如下,也許有人可以發現我愚蠢的錯誤?串口輪詢不工作Beaglebone黑色
#include <stdio.h>
#include <termios.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
#include <sys/poll.h>
#include <time.h>
#include <errno.h>
#include <unistd.h>
int openPort()
{
struct termios oldtio, newtio;
int fd = open("/dev/ttyO1",O_RDWR|O_NOCTTY|O_NONBLOCK|O_NDELAY);
if (fd == -1)
{
printf("could not open tty");
return -1;
}
if (tcgetattr(fd, &oldtio) == -1)
{
printf("error getting tcattr\n");
close(fd);
return -1;
}
cfmakeraw(&newtio);
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
newtio.c_cflag = (newtio.c_cflag & ~CSIZE) | CS8 | B9600;
newtio.c_cflag |= (CLOCAL | CREAD);
newtio.c_cflag &= ~(PARENB | PARODD);
newtio.c_cflag &= ~CRTSCTS;
newtio.c_cflag &= ~CSTOPB;
newtio.c_iflag = 0;//IGNPAR;
//newtio.c_iflag &= ~(IXON | IXOFF | IXANY);
newtio.c_lflag = 0;
newtio.c_oflag = 0;
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 1;
tcflush(fd, TCIOFLUSH);
if (tcsetattr(fd, TCSANOW, &newtio) == -1)
{
close(fd);
printf("error setting attrs\n");
return -1;
}
return fd;
}
void selectLoop(int fd)
{
struct pollfd fds[1];
fds[0].fd = fd;
fds[0].events = POLLIN;
int rc = poll(fds, 1, 100000);
if (rc < 0)
{
perror("poll");
}
else if (rc > 0)
{
char buffer[32] = {0};
int r = read(fd, buffer, sizeof(buffer));
if (r == -1)
{
printf("error: %s\n", strerror(errno));
}
else
{
printf(buffer);
}
}
else
{
printf("No data\n");
}
//close(fd);
sleep(1);
}
int main(int c, char ** v)
{
int fd = openPort();
if (fd >= 0)
{
while(1)
{
selectLoop(fd);
}
}
return 0;
}
我使用select()獲得相同的結果。但是,如果我給「接收的數據」附加一個信號,那麼信號就會觸發,儘管這是一個我試圖避免的情況,因爲它會對Netbeans的調試環境造成嚴重破壞。
僅供參考:電路板版本爲B6,UART1僅通過TX/RX連接。 「屏幕」程序成功接收和發送來自UART的字符,所以我知道它從根本上起作用。
你忘了告訴我們問題是什麼。你會得到什麼結果?你能指望什麼? – 2014-09-24 08:52:52
我正在我的開發PC上運行終端(Hypertrm),並在其中輸入字符。它連接在9600波特率,無奇偶校驗,1個停止位,8位字符,無h/w控制。我的BBB上的「屏幕」程序迴應了我輸入的字符,所以我希望看到我的程序也可以回顯我輸入到我的PC終端中的字符。我一無所獲 - poll()方法只是阻止,沒有錯誤,只是沒有看到任何來自UART的輸入。 – 2014-09-24 08:58:27
在openport()中,newtio在被初始化之前被使用。在tcgetattr()和cfmakeraw()之間需要'newtio = oldtio;'之類的東西。閱讀[正確設置終端模式](http://www.chemie.fu-berlin.de/chemnet/use/info/libc/libc_12.html#SEC237)和[用於POSIX操作系統的串行編程指南](http:/ /www.cmrr.umn.edu/~strupp/serial.html) – sawdust 2014-09-24 09:05:45