我试图弄清楚如何在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::vector
或std::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)
会更好。 但是,以上全部仍然适用。