Я разрабатываю приложение для Windows, которое должно взаимодействовать (как с входом, так и с выходом) с Arduino через его последовательный порт. Я использую boost :: asio по причинам переносимости, и я хочу продолжать использовать его. Что происходит, когда я запускаю свое приложение в первый раз, оно работает отлично, но если я запускаю его во второй раз, данные из Arduino больше не поступают, и приложение застревает в операции чтения. Единственный способ восстановления - отключить и снова подключить USB-кабель Arduino к компьютеру.
Это поведение зависит от Windows. Тот же код отлично работает в Linux.
Компилятор - Visual Studio 2017 Community Edition.
Вот пример кода для воспроизведения проблемы:
#include <iostream>
#include <string>
#include <boost/asio.hpp>
#include <vector>
int main() {
boost::asio::serial_port port(ioctx, "COM3"); // "/dev/ttyACM0" on Linux
port.set_option(boost::asio::serial_port::baud_rate(9600));
port.set_option(boost::asio::serial_port::character_size(8));
port.set_option(boost::asio::serial_port::stop_bits(boost::asio::serial_port::stop_bits::one));
port.set_option(boost::asio::serial_port::parity(boost::asio::serial_port::parity::none));
port.set_option(boost::asio::serial_port::flow_control(boost::asio::serial_port::flow_control::none));
char c = 'e';
auto const s = boost::asio::write(port, boost::asio::buffer(&c, 1));
std::cout << "sent " << s << " bytes" << std::endl;
boost::asio::streambuf response;
boost::asio::read_until(port, response, "\r\n");
std::istream response_stream(&response);
std::string line;
std::getline(response_stream, line);
std::cout << line << std::endl;
port.close(); // last-ditch effort to get it working
}
Вот эскиз Arduino (полученный с сайта Arduino):
int incomingByte = 0; // for incoming serial data
void setup() {
Serial.begin(9600); // opens serial port, sets data rate to 9600bps
}
void loop() {
// send data only when you receive data:
if (Serial.available() > 0) {
// read the incoming byte:
incomingByte = Serial.read();
// say what you got:
Serial.print("I received: ");
Serial.println(incomingByte, DEC);
}
}
Есть ли способ восстановить правильное состояние соединения? Я что-то упустил?