Информация об изменениях

Сообщение 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(), что в общем-то наисано в исходниках :

    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(), о чем в общем-то написано в исходниках :

    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 и исключение