c语言读取本机的串口,从C语言的串口读取arduino

我有下面的程序,试图从一个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,所以你需要在计算机上为这两个设置设置相同的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值