Программное прерывание последовательного ввода-вывода при извлечении USB-устройства — C++
-
30-09-2019 - |
Вопрос
У меня есть приложение, в котором последовательный ввод-вывод осуществляется с подключенного USB-устройства через виртуальный COM-порт.Как лучше всего остановить последовательный ввод-вывод при обнаружении неожиданного удаления устройства?Должен ли я просто закрыть порт?Или должна быть глобальная переменная, которая сохраняется для указания присутствия устройства и которую следует проверять в каждой функции последовательного ввода-вывода перед попыткой передачи/получения данных?Или это должна быть комбинация того и другого или что-то еще?Спасибо.
Решение
Я предполагаю, что вы используете Windows.Это зависит от того, как вы спланировали свой поток общения.
У меня есть объект BasePort, из которого я получил объект COMPort (и многие другие коммуникационные объекты).Объект COMPort создает один класс TXThread и RXThread.Эти потоки ждут сигнала «OVERLAP», который будет сигнализировать о том, что операция чтения или записи завершилась с помощью WaitForMultipleObjects()
.
TXThreads переходит в спящий режим, если нечего делать, и просыпается с помощью функции TXWrite (данные между основным процессом и потоком проходят через безопасный буфер FIFO trhead).
В этом случае им также необходимо дождаться сигнала события о закрытии порта, чтобы они могли отменить любые ожидающие операции и выйти (потоки завершаются и удаляются).
Чтобы определить, подключен ли USB-порт или отключен, я слушаю сообщение Windows. DEVICE_CHANGE
.Если порт отключен, я устанавливаю событие и жду завершения потоков, прежде чем класс порта удалит и закроет порт.
Я нашел этот подход очень надежным и безопасным.Это ядро коммуникационной платформы, которую я разработал более 8 лет назад и до сих пор работаю.