2014-09-24 87 views
0

我根本無法得到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

回答

0

的東西明智替換此:

 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