Сообщение Re[12]: boost::serial_port и мозговой секс от 26.10.2014 21:59
Изменено 26.10.2014 21:59 HolyNick
PM>Телепатически предполагаю что все дело в выделенном — для нормальной работы асинхронного I/O у io_service нужно вызывать run(), run_once() или poll().
Да. И еще похоже, что нужно делать вызов reset(), что в общем-то наисано в исходниках :
Да. И еще похоже, что нужно делать вызов reset(), что в общем-то наисано в исходниках :
boost::asio::io_service service;
std::shared_ptr<boost::asio::serial_port> port(new boost::asio::serial_port(service));
port->open("COM3"); //OK
char buffer;
boost::asio::async_read(*port, boost::asio::buffer(&buffer, 1),
[port](boost::system::error_code error, std::size_t bytes_transferred)
{
int i = 0;
i++;
});
port->close();
service.poll();Вызовется обработчик из предыдущего async_read
service.reset();если не вызвать, то следующая команда poll не вызовет обработчик
port->open("COM3");//OK
char buffer2;
boost::asio::async_read(*port, boost::asio::buffer(&buffer2, 1),
[port](boost::system::error_code error, std::size_t bytes_transferred)
{
int i = 0;
i++;
});
port->close();
service.poll();Вызывает обработчик, только если был вызов reset()
port->open("COM3");//OK, только если был вызов reset(), в противно случае ACCESS DENIED и исключение
Re[12]: boost::serial_port и мозговой секс
PM>Телепатически предполагаю что все дело в выделенном — для нормальной работы асинхронного I/O у io_service нужно вызывать run(), run_once() или poll().
Да. И еще похоже, что нужно делать вызов reset(), о чем в общем-то написано в исходниках :
Да. И еще похоже, что нужно делать вызов reset(), о чем в общем-то написано в исходниках :
boost::asio::io_service service;
std::shared_ptr<boost::asio::serial_port> port(new boost::asio::serial_port(service));
port->open("COM3"); //OK
char buffer;
boost::asio::async_read(*port, boost::asio::buffer(&buffer, 1),
[port](boost::system::error_code error, std::size_t bytes_transferred)
{
int i = 0;
i++;
});
port->close();
service.poll();Вызовется обработчик из предыдущего async_read
service.reset();если не вызвать, то следующая команда poll не вызовет обработчик
port->open("COM3");//OK
char buffer2;
boost::asio::async_read(*port, boost::asio::buffer(&buffer2, 1),
[port](boost::system::error_code error, std::size_t bytes_transferred)
{
int i = 0;
i++;
});
port->close();
service.poll();Вызывает обработчик, только если был вызов reset()
port->open("COM3");//OK, только если был вызов reset(), в противно случае ACCESS DENIED и исключение