Как выполнить неблокирующее чтение с помощью asio?

Я пытаюсь использовать boost:: asio для чтения и записи с устройства на последовательном порту. Оба блока boost:: asio:read() и boost::asio::serial_port:: read_some (), когда читать нечего. Вместо этого я хотел бы обнаружить это условие и написать команду Порту, чтобы запустить устройство.

Как я могу обнаружить, что данные недоступны?

при необходимости я могу делать все асинхронно, я просто предпочел бы избежать дополнительной сложности, если я мочь.

3 ответов


у вас есть несколько вариантов, на самом деле. Вы можете использовать встроенный последовательный порт


вы должны использовать свободную функцию asio:: async_read.


его на самом деле намного проще, чем подразумевали ответы здесь, и вы можете сделать это синхронно:

предположим, что ваше блокировочное чтение было чем-то вроде этого:

size_t len = socket.receive_from(boost::asio::buffer(recv_buf), sender_endpoint);

затем вы заменяете его на

socket.non_blocking(true);
size_t len = 0;
error = boost::asio::error::would_block;
while (error == boost::asio::error::would_block)
    //do other things here like go and make coffee
    len = socket.receive_from(boost::asio::buffer(recv_buf), sender_endpoint, 0, error);
std::cout.write(recv_buf.data(), len);

вы используете альтернативную перегруженную форму receive_from, из которой почти все методы отправки/получения. К сожалению, они принимают аргумент flags, но 0, похоже, работает нормально.