2013-05-20 44 views
0

我有客户端服务器应用程序,流程如下解释:的boost ::通过串行通道ASIO :: ASYNC_WRITE问题

客户端是在窗户边,不使用升压 服务器是在Linux端,并使用升压客户 - 服务器通过串行通道RS485进行通信。并且服务器使用boost::asio::async_write

client --> calls command with specific command_id --> server 
client <-- sends acknowledgement     <-- server 
{server process the command, meanwhile the client is blocked for response} 
client <-- sends response       <-- server 

有时会发生什么情况客户端会收到确认,但没有收到即使响应由服务器发送的响应。 当客户端发送另一个命令时,客户端稍后收到待处理的响应。

如果我使用boost::asio::write进行串行通信,根本没有问题。下面

是ASYNC_WRITE

boost::asio::async_write(serial_port, boost::asio::buffer(&v_chunk[0], v_chunk.size()), 
     boost::bind(&Serial_channel::async_write_callback, this, boost::asio::placeholders::error, 
       boost::asio::placeholders::bytes_transferred)); 

io_serv->run(); 
io_serv->reset(); 
+0

在“服务器”端,您正在正确运行“io_service”事件循环? –

+0

是@Joachim我正确使用了io_service循环。在async_write之后,我使用了io_service.run()和reset()。 –

+0

@Chirag德赛为什么'​​重置'?你能显示代码吗?很可能,'io_service'失去工作。 –

回答

0

引用@Joachim评论我改变了我的流程,就像下面它的工作。

boost::asio::async_write(serial_port, boost::asio::buffer(&v_chunk[0], v_chunk.size()), 
     boost::bind(&Serial_channel::async_write_callback, this, boost::asio::placeholders::error, 
       boost::asio::placeholders::bytes_transferred)); 

io_serv->run(); 
usleep(1000); // 1 millisecond delay 
io_serv->reset(); 
2

使用io_service将无法​​正常工作的方式的代码片段。首先,run函数在服务事件循环停止之前不会返回。其次,如果你只是想用它作为“轮询”,那么你应该使用poll或可选的poll_one(或者可能是run_one)。

但是,如果你这样做,它就像做非异步write调用一样,并且你放松了异步函数的好处。

+0

我只是在需要停止操作时才使用async_write。否则,同步写入操作就足够了。我希望async_write的行为像同步写入,因此使用run()。功能很好。但不知何故,客户端不会收到已经发送的数据服务器。 –

+0

现在你有什么问题吗? –

+1

@ChiragDesai问题仍然是你可能会在'async_write'函数完成之前尽早停止事件循环。你说你可能想要做的事情,实际上当你想要发送的消息不是时会发生什么。 –