C ++ Boost :: asio последовательная связь с Arduino не может написать - PullRequest
1 голос
/ 15 февраля 2020

Я попытался связаться с моим 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 все еще перезапускается.

1 Ответ

0 голосов
/ 16 февраля 2020

Я исправил это с добавлением небольшой задержки перед записью в последовательный порт. Как я уже писал в своем комментарии выше, Arduino перезапускается при запуске последовательной связи.

Это можно отключить несколькими способами: https://playground.arduino.cc/Main/DisablingAutoResetOnSerialConnection/

Другой Можно отправить сигнал готовности от Arduino, чтобы узнать в вашем приложении, что Arduino перезагружен. Итак, начните в приложении с чтения, и когда вы получите это сообщение, вы можете начать писать.

...