0

我有客户端服务器应用程序,流程如下所述:

客户端在 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();
4

2 回答 2

2

你使用的方式是io_service行不通的。首先,run在服务事件循环停止之前,该函数不会返回。其次,如果您只是想将它用作“轮询器”,那么您应该使用pollor 可选poll_one(或者也许run_one)。

但是如果你这样做,它与进行非异步write调用相同,并且你失去了异步函数的好处。

于 2013-05-20T10:17:33.240 回答
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();
于 2013-06-03T05:23:31.560 回答