串口轮询不工作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的字符,所以我知道它从根本上起作用。
的东西明智替换此:
printf(buffer);
也许:
for (int i = 0; i < r; ++i)
putchar(buffer[i]);
fflush(stdout);
这刷新,不冒险印刷更多的字符,如果缓冲区满不是阅读。
好主意。相同的结果 - 没有打印。 – 2014-09-24 09:15:13
“民意调查”是否返回?也许你只是收到不可打印的字符。 – 2014-09-24 09:20:47
大卫没有回来。 – 2014-09-24 09:58:51
你忘了告诉我们问题是什么。你会得到什么结果?你能指望什么? – 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