首先,這是我第一次使用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的文檔也沒有幫助。任何援助非常感謝。
看起來像它應該工作給我,我會鼓搗出來,但我意識到我搞砸了我的提振構建和我需要重新編譯 – mukunda 2014-12-01 16:24:50
其實我剛剛遇到了同樣的問題..:/對docs應該在主'deadline_timer'頁面中提到這個警告 – mukunda 2014-12-01 16:59:20