2012-03-12 60 views
4

我在鏈接read_async_some()調用異步讀取串行端口。在某些時候,我需要取消異步讀取,並在關聯的處理程序中檢測到這一事實。從the documentation for cancel(),我希望通過檢查傳遞給我的處理程序error_code這樣做簡單:正在關閉boost :: asio :: serial_port with pending read_async_some

此功能使所有未完成的異步讀取或寫入 操作立即完成,並取消 操作處理程序將通過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

沒關係。如果有其他人遇到同樣的問題,問題實際上是使用pttys進行測試。事實證明,當用於異步輸入時,pttys的行爲不正確,並且boost::asio用上述錯誤消息指示了這個問題。

我能夠通過使用socat創建模擬環回串行端口來解決此問題。在this blog post有這樣做的好指示。