串口轮询不工作Beaglebone黑色

问题描述:

我根本无法得到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的字符,所以我知道它从根本上起作用。

+0

你忘了告诉我们问题是什么。你会得到什么结果?你能指望什么? – 2014-09-24 08:52:52

+0

我正在我的开发PC上运行终端(Hypertrm),并在其中输入字符。它连接在9600波特率,无奇偶校验,1个停止位,8位字符,无h/w控制。我的BBB上的“屏幕”程序回应了我输入的字符,所以我希望看到我的程序也可以回显我输入到我的PC终端中的字符。我一无所获 - poll()方法只是阻止,没有错误,只是没有看到任何来自UART的输入。 – 2014-09-24 08:58:27

+0

在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

的东西明智替换此:

 printf(buffer); 

也许:

for (int i = 0; i < r; ++i) 
    putchar(buffer[i]); 
fflush(stdout); 

这刷新,不冒险印刷更多的字符,如果缓冲区满不是阅读。

+0

好主意。相同的结果 - 没有打印。 – 2014-09-24 09:15:13

+0

“民意调查”是否返回?也许你只是收到不可打印的字符。 – 2014-09-24 09:20:47

+0

大卫没有回来。 – 2014-09-24 09:58:51