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 已重新启动。因此,然后在您的应用程序中开始阅读,当您收到该消息后,您就可以开始写作了。