Как выполнить неблокирующее чтение с помощью asio?
Я пытаюсь использовать boost:: asio для чтения и записи с устройства на последовательном порту. Оба блока boost:: asio:read() и boost::asio::serial_port:: read_some (), когда читать нечего. Вместо этого я хотел бы обнаружить это условие и написать команду Порту, чтобы запустить устройство.
Как я могу обнаружить, что данные недоступны?
при необходимости я могу делать все асинхронно, я просто предпочел бы избежать дополнительной сложности, если я мочь.
3 ответов
у вас есть несколько вариантов, на самом деле. Вы можете использовать встроенный последовательный порт
его на самом деле намного проще, чем подразумевали ответы здесь, и вы можете сделать это синхронно:
предположим, что ваше блокировочное чтение было чем-то вроде этого:
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, похоже, работает нормально.