2012-03-12 10 views
4

read_async_some()シリアルポートから非同期に読み込みを呼び出す連鎖しています。ある時点で、私は非同期読み取りをキャンセルし、関連するハンドラでこの事実を検出する必要があります。 the documentation for cancel()から、私は単に私のハンドラに渡されたerror_codeをチェックして、そうすることを期待:私はread_async_someを保留にしてboost :: asio :: serial_portを閉じる

この機能は、すべての未処理の非同期がすぐに終了する 読み取り操作または書き込み原因となり、キャンセル 操作のためのハンドラが渡されますboost::asio::error::operation_abortedエラーです。私はこれをしようとすると

しかし、私のハンドラはinvalid_argumentエラーの代わりに期待operation_abortedエラーと呼ばれています。ここでは、シリアルポートをエミュレートするpttyを使用して、問題を再現する最小限の例です:

void handle(boost::system::error_code const& error, size_t count) 
{ 
    std::cout << "error_code = " << error.message() << std::endl; 
} 

int main(int argc, char **argv) 
{ 
    std::fstream fs("/dev/ttyp0", std::ios::in | std::ios::ate); 
    boost::asio::io_service io; 
    boost::asio::serial_port serial(io, "/dev/ttyp0"); 

    std::vector<uint8_t> buffer(1); 
    serial.async_read_some(boost::asio::buffer(buffer), 
     boost::bind(&handle, 
        boost::asio::placeholders::error, 
        boost::asio::placeholders::bytes_transferred 
     ) 
    ); 

    boost::thread thread(boost::bind(&boost::asio::io_service::run, &io)); 
    serial.cancel(); 
    thread.join(); 
    fs.close(); 
} 

少なくとも私にとっては、このプログラムの出力はerror_code = Invalid argumentです。なぜ私はドキュメントに記載されている動作を取得していないと誰も説明できますか?

答えて

4

Nevermind。他の誰かが同じ問題に遭遇した場合、問題は実際にテストのためにpttysを使用していました。結果として、pttysは非同期入力用に正しく動作しません。boost::asioは上記のエラーメッセージでこの問題を示しています。

socatでシミュレートされたループバックシリアルポートを作成することで、この問題を解決できました。 this blog postでこれを行うための良い指示があります。

関連する問題