0

シリアルポートで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からの読み取りになります。また、各whileループでbufオブジェクトをチェックしましたが、空です。私が間違っているのは??

4

2 に答える 2

0

コールバックを機能させるには、io_service で run() メソッドを呼び出す必要があります。あなたのループでは、が必要io.run()です。

于 2012-07-26T13:11:50.623 に答える
0

Janm が指摘したように、 async_read_until を機能させるには io.run を呼び出す必要があります。

しかし...

また、同期呼び出しと非同期呼び出しは asio 内でうまく連携しないため、書き込みを async_write に変換する必要もあります。あなたがする必要があるのは次のことです:

最初の async_write 呼び出し io.run をセットアップします

書き込みハンドラーのセットアップで async_read_until

読み取りハンドラーのセットアップで、次の async_write

于 2012-07-26T13:28:32.033 に答える