2013-05-20 2 views
0

Я клиентское приложение сервера, поток, как описано ниже:повышения :: 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

yes @Joachim Я правильно использовал цикл io_service. сразу после async_write я использовал io_service.run() и reset(). –

+0

@Chirag Desai почему 'reset'? Можете ли вы показать код? Скорее всего, '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 не возвращается, пока цикл событий службы не остановлен. Во-вторых, если вы просто хотите использовать его как «poller», тогда вы должны использовать poll или необязательно poll_one (или, возможно, run_one).

Но если вы это сделаете, это то же самое, что и вызов non-async write, и вы ослабляете преимущества асинхронных функций.

+0

Я использую async_write на всякий случай, если мне нужно остановить операцию. В противном случае будет достаточно синхронной операции записи. Я хочу, чтобы async_write вел себя как синхронная запись и, следовательно, использовал run(). Функциональность отлично работает. Но почему-то клиент не получает сервер данных уже отправлен. –

+0

Теперь у вас есть мой вопрос? –

+1

@ChiragDesai И все-таки проблема в том, что вы можете остановить цикл событий раньше, чем закончится функция 'async_write'. Что-то, что вы говорите, возможно, захотите сделать, и на самом деле это происходит, когда сообщения, которые вы хотите отправить, не являются. –

Смежные вопросы