$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-users] Asio problems with async_read
From: Allan Nielsen (a_at_[hidden])
Date: 2011-08-08 08:13:08
Hi
I have a funciton where we I am using boost::asio to read from the
serial port of my computer.
I have started out with an implementation which uses read, and I am
now trying to convert it to async_read because I want a time out.
When I am trying to use the async_read version, I get timeouts after I
have read one or two charterers, even though I know there are more
charterers to be read on the wire.
Here is the code:
void set_result( boost::optional<boost::system::error_code> * a,
boost::system::error_code b ) {
    a->reset( b );
}
std::vector<uint8_t> receive(boost::asio::io_service & io,
boost::asio::serial_port & cctalk_port){
#if 0
    boost::optional<boost::system::error_code> timer_result;
    boost::optional<boost::system::error_code> read_result;
    boost::asio::deadline_timer timer( io );
    timer.expires_from_now( boost::posix_time::milliseconds(5000) );
    timer.async_wait( boost::bind(&set_result, &timer_result, _1) );
    boost::asio::streambuf result;
    boost::asio::async_read(
            cctalk_port,
            result,
            boost::asio::transfer_at_least(1),
            boost::bind( &set_result, &read_result, _1 ));
    while(1) {
        io.poll_one();
        if ( read_result ) {
            timer.cancel();
            std::vector<uint8_t> res(boost::asio::buffer_cast<const
uint8_t * >(result.data()),  boost::asio::buffer_cast<const uint8_t *
>(result.data()) + result.size()  );
            return res;
        } else if ( timer_result ) {
            throw runtime_error("timeout");
        }
    }
    throw runtime_error("Should not happend");
#else
    uint8_t c;
    boost::asio::read(cctalk_port, boost::asio::buffer(&c, 1));
    std::vector<uint8_t> res;
    res.push_back(c);
    return res;
#endif
}