2014-12-01 59 views
0

首先,這是我第一次使用boost :: asio以及異步編程。所以,我對這兩者都不熟悉。升壓異步操作不起作用(對我來說)

基本上我想通過串口與機器人進行交互。爲此,我使用boost :: asio :: serial_port。我想要做的一個操作是讓機器人旋轉幾毫秒,但是是異步的,以免在其他處理中產生任何滯後。是類的內部如下:

class Robot 
{ 
    boost::asio::io_service is; 
    boost::asio::serial_port port; 

    ... 

    public: 

    Robot(const std::string &visionDeviceAddress, const std::string &motorControlDeviceAddress) 
    :visionDevice(visionDeviceAddress), port(is), motorControlDevice(motorControlDeviceAddress) 

    ... 

    void completePendingMotions() 
    { 
     is.run(); 
    } 
} 

我相信下面的函數應該做的工作:

void Robot::async_rotateLeftFor(unsigned long milliseconds) 
{ 
    boost::asio::deadline_timer t(is, boost::posix_time::milliseconds(milliseconds)); 
    //the character 'a' initiates a non-stop anticlockwise rotation 
    char c='a'; 
    boost::asio::write(port, boost::asio::buffer(&c,1)); 
    t.async_wait([&](boost::system::error_code e) 
    { 
     //to stop the rotation, i need to pass the character 'q' 
     //this is done synchronously by function stop() 
     stop(); 
    }); 
} 

最後,從主()看起來調用,比如:

int main(void) 
{ 
    Robot r("0","COM6"); 
    r.connect(); 
    r.async_rotateLeftFor(2000); 
    r.completePendingMotions(); 
    return 0; 
} 

我得到的僅僅是機器人連接成功建立,它開始旋轉,但不會停止,因爲它應該由於完成處理程序。我對於可能的原因感到不知所措。沒有關於asio的文檔也沒有幫助。任何援助非常感謝。

+0

看起來像它應該工作給我,我會鼓搗出來,但我意識到我搞砸了我的提振構建和我需要重新編譯 – mukunda 2014-12-01 16:24:50

+0

其實我剛剛遇到了同樣的問題..:/對docs應該在主'deadline_timer'頁面中提到這個警告 – mukunda 2014-12-01 16:59:20

回答

1

問題是,deadline_timer對象需要保持活動狀態,直到處理程序觸發,否則當調用is.run()時,處理程序將立即觸發並出現錯誤。定時器在async_rotateLeftFor函數退出時被破壞。

我在做什麼來保持計時器,將計時器對象包裝在一個shared_ptr中,並將它傳遞給處理程序對象。

void Robot::async_rotateLeftFor(unsigned long milliseconds) { 
    auto t = std::make_shared<boost::asio::deadline_timer>(
      is, boost::posix_time::milliseconds(milliseconds)); 

    //... 

    // (capture shared_ptr in lambda) 
    t->async_wait([this,t](boost::system::error_code e) 
     { 
      stop(); 
     } 
    ); 
+0

感謝您的回覆。你對此絕對正確。我相信我永遠不會想到我自己。謝謝 – rahul1210 2014-12-01 17:35:28