Как изменить скорость последовательного порта на лету с помощью boost :: asio (или как узнать, пуст ли аппаратный буфер)?

У меня особая проблема с boost :: asio и boost :: asio :: serial_port устройство. Код, наконец, неплохо работает с асинхронным чтением и прочим, но я не могу понять, как изменить скорость последовательного порта на лету.

То, что я пытаюсь сделать прямо сейчас, - это просто сказать устройству, подключенному к моему последовательному порту, изменить скорость последовательного порта, чтобы сказать, 38400 бод, а затем я настраиваю последовательный порт своих компьютеров на ту же скорость с помощью:

port_.set_option (boost :: asio :: serial_port_base :: baud_rate (rate));

Но на самом деле происходит то, что если я выполняю часть set_option, устройство никогда не получит команду на изменение скорости. Если я не выполняю часть set_option, устройство правильно меняет скорость. Из того, что я понял, происходит то, что (блокирующая, синхронная) запись помещает данные в аппаратный буфер на моем компьютере и возвращается, затем выполняет set_option, который отбрасывает буфер (до того, как он успел отправить данные на устройство). Поэтому мне нужно подумать о способе проверить, пуст ли аппаратный буфер и действительно ли устройство получило команду на изменение скорости, прежде чем перенастраивать последовательный порт моих компьютеров. Я также не могу найти никакой информации о том, нужно ли мне выполнять close () и open () на порту, чтобы изменение скорости повлияло. Мне также интересно, удаляет ли close () содержимое буфера или нет ... Я использую адаптер последовательного порта USB->, и моя платформа - Ubuntu 10.10, если это имеет какое-то значение.

7
задан Dago 16 December 2010 в 14:16
поделиться