C++ Boost::asio 与Arduino的串口通信无法写入
C++ Boost::asio serial communcation with Arduino can't write
我尝试使用 Boost Asio 库与我的 Arduino Uno 通信。不知何故,我无法将数据发送到我的 Arduino,而且我不知道我做错了什么。阅读工作正常,但只有当我打开终端并说:
cat /dev/ttyACM0
当这个终端 window 打开时,我 运行 我的 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 秒,然后重新发送它工作的数据(因为它保持串行连接处于活动状态)。我还在寻找一个永久的解决方案,这样我就不必在真正想写东西之前先写。
更新二:
显然我什至不需要写,但在我开始写之前必须有一个小的延迟,因为在打开端口后 Arduino 仍在重新启动。
我在写入串行端口之前添加了一个小延迟来修复它。正如我在上面的评论中所写,当您开始串行通信时,Arduino 正在重新启动。
可以通过多种方式禁用此功能:https://playground.arduino.cc/Main/DisablingAutoResetOnSerialConnection/
另一种选择是从 Arduino 发送 "ready" 信号,以在您的应用程序中知道 Arduino 已重新启动。因此,然后在您的应用程序中开始阅读,当您收到该消息后,您就可以开始写作了。
我尝试使用 Boost Asio 库与我的 Arduino Uno 通信。不知何故,我无法将数据发送到我的 Arduino,而且我不知道我做错了什么。阅读工作正常,但只有当我打开终端并说:
cat /dev/ttyACM0
当这个终端 window 打开时,我 运行 我的 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 秒,然后重新发送它工作的数据(因为它保持串行连接处于活动状态)。我还在寻找一个永久的解决方案,这样我就不必在真正想写东西之前先写。
更新二:
显然我什至不需要写,但在我开始写之前必须有一个小的延迟,因为在打开端口后 Arduino 仍在重新启动。
我在写入串行端口之前添加了一个小延迟来修复它。正如我在上面的评论中所写,当您开始串行通信时,Arduino 正在重新启动。
可以通过多种方式禁用此功能:https://playground.arduino.cc/Main/DisablingAutoResetOnSerialConnection/
另一种选择是从 Arduino 发送 "ready" 信号,以在您的应用程序中知道 Arduino 已重新启动。因此,然后在您的应用程序中开始阅读,当您收到该消息后,您就可以开始写作了。