boost :: asio :: async_read_until没有调用处理程序

时间:2012-07-26 13:08:51

标签: c++ linux serial-port boost-asio

我正在学习如何使用Boost:asio库和串口。我使用同步写入和读取编写了一些代码,我现在想使用异步但它不起作用。 简单示例:

void readHandler(const boost::system::error_code&,std::size_t);

streambuf buf;

int main(int argc,char *argv[]){

    io_service io;
    serial_port port(io,PORT);

        if(port.isopen()){
           while(1){
            // ... getting std::string::toSend from user ...

                write(port,buffer(toSend.c_str(),toSend.size())); 

                async_read_until(port,buf,'\n',readHandler); // <= it's returning but not calling readHandler at all
           }
           port.close(); 
        }

}

void readHandler(const boost::system::error_code& error,std::size_t bytes_transferred){

    std::cout << "readHandler()" << std::endl;
    //... reading from buf object and calling buf.consume(buf.size()) ...
}

async_read_until()它正在返回但未调用 readHandler() 。如果我改为同步读取,则从端口OK读取。我还在循环中检查 buf 对象,它是空的。我做错了什么?

2 个答案:

答案 0 :(得分:0)

您需要在io_service上调用run()方法才能使回调生效。在循环中,您需要io.run()

答案 1 :(得分:0)

正如Janm指出你需要调用io.run才能使async_read_until工作。

但是...

您还需要将写入转换为async_write,因为同步和异步调用在asio中并不能很好地协同工作。您需要做的是:

首先设置async_write 打电话给io.run

在您的写入处理程序中设置async_read_until

在你的读处理程序中设置下一个async_write