我有下面的程序,试图从一个arduino读取数据使用串行端口,事情是它大多不读任何东西,除了有时它读我发送的一部分。arduino代码只是在一个循环中写一个字母。#include
#include
#include
#include
#include
#include
int main() {
int serialfd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
if (serialfd == -1)
perror("Error opening the serial port");
else
fcntl(serialfd, F_SETFL, 0);
fprintf(stdout, "Device is open, attempting read \n");
fcntl(serialfd, F_SETFL, 0);
char buf[11] = {0};
read(serialfd, buf, 10);
fprintf(stdout, "Buffer: %s", buf);
close(serialfd);
return 0;
}
例如,输出如下
Device is open, attempting read
Buffer: AAAAAAAAAAA⏎
如果我尝试再次运行它(几次),我只得到0'd缓冲区
Device is open, attempting read
Buffer: ⏎
最佳答案:
听起来像是配置问题,很可能波特率设置不正确。此外,正如问题注释中提到的,您可能会得到一个完整的缓冲区,结尾没有'\0'字符,因此fprintf的行为不正常。
在这里,我将解释如何设置波特率,但你可以使用wikibooks链接,我已经把答案放在下面,设置其他设置,也要确保检查缓冲区。
简而言之,我喜欢用115200作为我的波特率。There are a few more that are usually supported在其他设备上,但是这个值很好,所以我将用它作为示例。
在arduino上,这很可能是您唯一需要配置的东西(如果事实上,这是我在想使用串行端口与计算机通信时设置的唯一东西)。Serial.begin(115200);
然后根据this wikibook可以通过termios结构中的设置来设置波特率,如wikibook示例中我将其称为attribs。
struct termios attribs;
/* get the current settings */
tcgetattr(serialfd, &attribs);
/* set the baudrate */
cfsetospeed(&attribs, B115200); /* outut baudrate */
cfsetispeed(&attribs, B115200); /* input baudrate */
/* if there is need for it, set other settings here */
/* eventually apply everything for your serialfd descriptor */
tcsetattr(serialfd, TCSANOW, &attribs);
所以从技术上讲,你可以有不同的输入速度,而不是输出速度,但是arduino的UART只有一个这样的设置,而且does not support different speeds for input/ouput,所以你需要在计算机上为这两个设置设置相同的值。