Программное прерывание последовательного ввода-вывода при извлечении USB-устройства — C++

StackOverflow https://stackoverflow.com/questions/4336871

Вопрос

У меня есть приложение, в котором последовательный ввод-вывод осуществляется с подключенного USB-устройства через виртуальный COM-порт.Как лучше всего остановить последовательный ввод-вывод при обнаружении неожиданного удаления устройства?Должен ли я просто закрыть порт?Или должна быть глобальная переменная, которая сохраняется для указания присутствия устройства и которую следует проверять в каждой функции последовательного ввода-вывода перед попыткой передачи/получения данных?Или это должна быть комбинация того и другого или что-то еще?Спасибо.

Это было полезно?

Решение

Я предполагаю, что вы используете Windows.Это зависит от того, как вы спланировали свой поток общения.

У меня есть объект BasePort, из которого я получил объект COMPort (и многие другие коммуникационные объекты).Объект COMPort создает один класс TXThread и RXThread.Эти потоки ждут сигнала «OVERLAP», который будет сигнализировать о том, что операция чтения или записи завершилась с помощью WaitForMultipleObjects().

TXThreads переходит в спящий режим, если нечего делать, и просыпается с помощью функции TXWrite (данные между основным процессом и потоком проходят через безопасный буфер FIFO trhead).

В этом случае им также необходимо дождаться сигнала события о закрытии порта, чтобы они могли отменить любые ожидающие операции и выйти (потоки завершаются и удаляются).

Чтобы определить, подключен ли USB-порт или отключен, я слушаю сообщение Windows. DEVICE_CHANGE.Если порт отключен, я устанавливаю событие и жду завершения потоков, прежде чем класс порта удалит и закроет порт.

Я нашел этот подход очень надежным и безопасным.Это ядро ​​коммуникационной платформы, которую я разработал более 8 лет назад и до сих пор работаю.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top