Я просто не могу заставить функцию 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, поэтому я знаю, что она в принципе работает.
Вы забыли рассказать нам, в чем проблема. Какой результат вы получаете? Что вы ожидаете? –
Я запускаю терминал (Hypertrm) на своем Dev PC и набираю символы в него. Он подключен со скоростью 9600 бод, без контроля четности, 1 стопового бита, 8 бит символов, без контроля ч/б. «Экранная» программа на моем BBB повторяет символы, которые я печатаю, поэтому я надеюсь увидеть, что моя программа также повторяет символы, которые я вводил в свой терминал. Я ничего не получаю - метод poll() просто блокирует, никаких ошибок, просто не видит никакого ввода от UART. –
В 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