如何在C ++中从串口发送和读取数据

时间:2014-03-20 20:49:15

标签: c++ arduino

我希望有人可以帮助我,我希望通过从执行一些基本面部识别的C ++程序发送命令来控制我的arduino uno。重要的是我发送一串数据

its John;

这样arduino就能正确回应。但是,我正在努力寻找执行此类操作的正确方法。如果有人能指出我正确的方向,我将不胜感激。

作为一个注释我不是在Windows上运行这个程序。它将在覆盆子pi上运行。

1 个答案:

答案 0 :(得分:3)

在raspberry pi上,串口是设备/ dev / ttyAMA0。它也可能正在运行一个终端,所以你必须打开/ etc / inittab并注释掉这一行并重启:

#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

如果你不这样做,你的arduino会在它向串口发送任何内容时尝试登录你的。

另一个陷阱是如果你想在你的协议中使用二进制数据,默认情况下启用XON / XOFF流控制,它会默默地吃某些字节(^ S和^ Q)。

以下是如何打开,设置串口模式(禁用流量控制!)和波特率,并写入串口:

#include <termios.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <string.h>
// (i may be forgetting some headers)

...

int fd = open("/dev/ttyAMA0", O_RDWR);
if (fd == -1) {
  perror("/dev/ttyAMA0");
  return 1;
}

struct termios tios;
tcgetattr(fd, &tios);
// disable flow control and all that, and ignore break and parity errors
tios.c_iflag = IGNBRK | IGNPAR;
tios.c_oflag = 0;
tios.c_lflag = 0;
cfsetspeed(&tios, B9600);
tcsetattr(fd, TCSAFLUSH, &tios);

// the serial port has a brief glitch once we turn it on which generates a
// start bit; sleep for 1ms to let it settle
usleep(1000);    

// output to serial port
char msg[] = "hi there";
write(fd, msg, strlen(msg));