2014-09-24 2 views
0

Я просто не могу заставить функцию poll() отвечать на данные, отправляемые через UART1/dev/ttyO1. Код выглядит следующим образом: может быть, кто-то может заметить мою глупую ошибку?Опрос последовательного порта не работает на Beaglebone Black

#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.

FYI: ревизия платы B6, UART1 подключается только TX/RX. «Экранная» программа успешно принимает и отправляет символы из UART, поэтому я знаю, что она в принципе работает.

+0

Вы забыли рассказать нам, в чем проблема. Какой результат вы получаете? Что вы ожидаете? –

+0

Я запускаю терминал (Hypertrm) на своем Dev PC и набираю символы в него. Он подключен со скоростью 9600 бод, без контроля четности, 1 стопового бита, 8 бит символов, без контроля ч/б. «Экранная» программа на моем BBB повторяет символы, которые я печатаю, поэтому я надеюсь увидеть, что моя программа также повторяет символы, которые я вводил в свой терминал. Я ничего не получаю - метод poll() просто блокирует, никаких ошибок, просто не видит никакого ввода от UART. –

+0

В openport() newtio используется до того, как он был инициализирован. Вам нужно что-то вроде 'newtio = oldtio; 'между tcgetattr() и cfmakeraw(). Прочитайте [Правильно настроите режимы терминала] (http://www.chemie.fu-berlin.de/chemnet/use/info/libc/libc_12.html#SEC237) и [Руководство по серийному программированию для операционных систем POSIX] (http://www.cmrr.umn.edu/~strupp/serial.html) – sawdust

ответ

0

Заменить это с чем-то разумном:

 printf(buffer); 

Возможно:

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

This флеши и не рискует печати больше символов, чем читать, если буфер заполнен.

+0

Nice идея. Тот же результат - ничего не напечатано. –

+0

Был ли опрос 'poll'? Возможно, вы просто получаете непечатаемые символы. –

+0

Не вернулся, Дэвид. –

Смежные вопросы