Я пишу программу, которая должна управлять научной аппаратурой через 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 - я действительно не хочу переписывать всю программу с другим инструментарием.