我有客户端服务器应用程序,流程如下所述:
客户端在Windows端,不使用boost
服务器在linux端并使用boost
客户端 - 服务器通过串行通道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 :(得分:2)
您使用io_service
的方式无效。首先,run
函数在服务事件循环停止之前不会返回。其次,如果您只是想将其用作“投放程序”,那么您应该使用poll
或可选poll_one
(或者run_one
)。
但是如果你这样做,它就像进行非异步write
调用一样,并且你放弃了异步函数的好处。
答案 1 :(得分: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();