ctb :: SerialPort - время ожидания в Write () - PullRequest
0 голосов
/ 06 января 2012

Я пишу программу, которая должна управлять научной аппаратурой через COM-порт.Сама программа написана на wxWidgets и использует библиотеку ctb .Чтобы проверить это, прежде чем подключить его к оборудованию стоимостью 300 тыс. Евро, я использую com0com (эмулятор нуль-модема) для переадресации порта COM2.Для эмуляции моего оборудования я использую wxTerminal (COM3).В целом это работает хорошо.Отладку можно выполнять не только в VS или DB, но и просматривать всю передачу данных в wxTerminal .

Теперь к моей проблеме.Я использую для отправки данных на COM-порт ctb::SerialPort::Write() функцию.

device->Write( (char*)line.c_str(), line.size() );

Однако, если я отключу соединение на стороне wxTerminal ( т.е. COM2-> NULL), чем программа зависает в этой функции.

Очевидно, что я должен добавить некоторую функцию, чтобы проверить, все ли мое оборудование все еще там, но чтобы сделать это, мне нужно отправить пакет данных к нему и ожидать некоторыеответ.Итак, я вернулся к Write().

"На всякий случай" Я также попытался ctb::IOBase::Writev (char ∗ buf, size_t len, unsigned int timeout_in_ms) с timeout , установленным на 100 мс, и у меня все еще есть зависание программы в той же строке.Это действительно ожидаемое поведение, так как в этом случае timeout означает только то, что линия соединения блокируется до тех пор, пока не будет передан весь буфер, или не достигнуто timeout .

Подключение wxTerminal в COM3 приводит к размораживанию отладчика или отдельной программы.Солнце светит, птицы поют.

Может кто-нибудь дать мне подсказку, как преодолеть мою проблему?Буду признателен, если комментарии будут ограничены wxWidgets-world - я действительно не хочу переписывать всю программу с другим инструментарием.

1 Ответ

0 голосов
/ 07 января 2012

Если ваша библиотека COM-порта не обеспечивает эффективные тайм-ауты для блока записи (предположительно из-за аппаратного управления потоком), вы можете реализовать свой собственный, поточив запись.Вы можете использовать пару событий / семафоров / condvar / что угодно.Один из них сигнализирует потоку, что в буфере есть что-то для отправки, а другой - что вы можете подождать с таймаутом, сигнализируемым потоком после того, как он отправил буфер.Если время ожидания «ack» истекло, ваш COM-порт застрял, и вы можете вызвать всплывающее сообщение «Check cable».Я не знаю, что другие вызовы поддерживает ваш порт lib, поэтому я не знаю, как вы могли бы выполнить сброс / повтор.

...