C++ Boost::asio串行通信与Arduino无法写入

C++ Boost::asio serial communcation with Arduino can't write

本文关键字:Arduino 通信 Boost asio C++      更新时间:2023-10-16

我尝试使用Boost Asio库与Arduino Uno进行通信。不知何故,我无法将数据发送到我的Arduino,而且我不知道我做错了什么。阅读工作正常,但写作只有在我打开终端并说:

cat /dev/ttyACM0

当此终端窗口打开时,我运行我的C++应用程序,它可以工作,否则它不起作用。

测试应用程序代码(C++(:

#include <iostream>
#include <boost/asio.hpp>
char* message;
int main()
{
boost::asio::io_service ioservice;
boost::asio::serial_port serial(ioservice, "/dev/ttyACM0");
serial.set_option(boost::asio::serial_port_base::baud_rate(115200));
serial.set_option(boost::asio::serial_port::flow_control(boost::asio::serial_port::flow_control::none));
serial.set_option(boost::asio::serial_port::parity(boost::asio::serial_port::parity::none));
serial.set_option(boost::asio::serial_port::stop_bits(boost::asio::serial_port::stop_bits::one));
serial.set_option(boost::asio::serial_port::character_size(boost::asio::serial_port::character_size(8)));
std::string s = "u";
boost::asio::streambuf b;
std::ostream os(&b);
os << s;
boost::asio::write(serial, b.data());
if (serial.is_open()) {
serial.close();
}
return 0;
}

我的Arduino应用程序的代码:

#include "Servo.h"
Servo servo;
void setup() {
Serial.begin(115200);
servo.attach(9);
servo.write(0);
}
void loop() {
if(Serial.available()) {
char c = Serial.read();
if(c == 'u') {
servo.write(180);
} else if (c == 'v') {
servo.write(0);
}
}
}

我在 Ubuntu 18.04 和 Debian 10 安装上都尝试了这个,以排除权限问题,所以我认为我的代码有问题。

更新:

我发现了问题,Arduino在进行串行连接时正在重新启动。例如,当我添加一个线程睡眠 5 秒,然后重新发送数据时,它会工作(因为这样它会保持串行连接的活动(。我仍在寻找一个永久的解决方案,这样我就不必在我真正想写东西之前写东西。

更新 2:

显然我什至不必进行写入,但是在我开始写入之前必须有一小段延迟,因为打开端口后Arduino仍在重新启动。

我在写入串行端口之前通过添加一个小延迟来修复它。正如我在上面的评论中所写的那样,当您开始串行通信时,Arduino正在重新启动。

可以通过多种方式禁用此功能:https://playground.arduino.cc/Main/DisablingAutoResetOnSerialConnection/

另一种选择是从Arduino发送"就绪"信号,以便在您的应用程序中知道Arduino已重新启动。因此,然后在您的应用程序中从阅读开始,当您收到该消息时,您就可以开始编写了。