如何从C ++的串口设备读取数据

我试图弄清楚如何在Linux C ++中使用串行通信来读/写我的Arduino。 目前,我正在尝试阅读我“触发”的Arudino的回复

echo "g" > /dev/ttyACM0" 

我试过用我的terminal来查看我的Arduino的响应,使用下面的命令:

 tail -f /dev/ttyACM0 

这是工作,因为它应该。 现在我想在C ++应用程序中做同样的事情。 所以我做了这个testing

 void testSerialComm() { std::string port = "/dev/ttyACM0"; int device = open(port.c_str(), O_RDWR | O_NOCTTY | O_SYNC); std::string response; char buffer[64]; do { int n = read(device, buffer, sizeof buffer); if (n > 0) { response += std::string(buffer); std::cout << buffer; } } while (buffer[0] != 'X'); // 'X' means end of transmission std::cout << "Response is: " << std::endl; std::cout << response << std::endl; close(device); } 

几个“消息”之后,传输变得有点混乱。 我的testing应用程序以随机​​顺序编写响应字符,而某些东西是不正确的。 我试过用这个命令尝试configuration/ dev / ttyACM0设备:

 stty -F /dev/ttyUSB0 cs8 115200 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts 

没有骰子。 有人能帮我理解如何在C ++中与我的Arduino进行通信吗?

显示的代码打开/dev/ttyACM0 ,试图寻找到这个“文件”的结尾,并根据生成的文件位置分配一个老式的C风格的内存缓冲区,出于一些奇怪的原因,而不是使用std::vectorstd::string ,尽管声称这大概是一个C ++程序,根据问题的标签。

这种方法的问题是,你只能通过普通的,普通的,花园式的文件寻求。 /dev/ttyACM0不是一个普通的文件。 这是一个设备。 虽然有些设备是可以寻求的,但这不是。 根据评论,你已经独立发现了。

串口设备是可读写的。 他们不是可以追求的。 在串口上“寻找”是没有的。 这是没有意义的。

要从串行端口读取,只需读取它即可。 操作系统确实保持了一定的内部缓冲区大小,所以如果已经通过串口接收到了一些字符,初始化的读取将全部返回(假设read()缓冲区的大小足够大)。 例如,如果传递一个1024个字符的缓冲区,并且已经从串口read() 5个字符,则read()将返回5,以便相应地指示。

如果没有字符被读取,并且您将串行端口作为阻塞设备打开,则read()会阻止至少一个字符从串行端口读取,然后返回。

所以,为了从串口读取所有你需要做的就是读取它,直到你确定你已经读完了所有的读取。 你怎么决定的? 这取决于你。 您可能会决定只读直到阅读换行符。 或者你可能会决定只读,直到阅读了固定的#n个字符。 这完全取决于你。

当然,如果硬件配置合适,并且您需要与串口设备进行必要的安排以遵守串口控制引脚,并且根据您的配置,DCD和/或DSR引脚会发出信号指示串口设备不再可用,你的read()会立即返回0,表示串口设备上文件状态的伪端。 这也是你需要实现必要的逻辑来处理的东西。

PS既不是C风格的stdio,也不是C ++风格的iostream ,由于它们自己的内部缓冲算法,它们将在字符设备上运行得很好。 当使用串行端口时,使用open(2)read(2)write(2)close(2)会更好。 但是,以上全部仍然适用。