Я попытался связаться с моим Arduino Uno, используя библиотеку Boost Asio. Почему-то я не могу отправить данные на свой 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 все еще перезапускается.