Обнаружение открытого COM-порта ПК на устройстве виртуального Com-порта USB

Я использую микроконтроллер STM32F105 с USB-библиотекой STM32_USB-FS-Device_Lib_V3.2.1 и адаптировал пример VCP для наших целей (интеграция с RTOS и последовательным API).

Проблема в что если USB-кабель подключен, но порт не открыт на хосте Windows, через несколько минут устройство постоянно повторно входит в USB ISR, пока порт не откроется, а затем все начнет работать нормально.

У меня есть инструментальный обработчик прерываний, и я вижу, что при возникновении ошибки обработчик ISR завершает работу, а затем немедленно возвращается. Это происходит потому, что при выходе из прерывания флаг IEPINT в OTG_FS_GINTSTS не ясен. OTG_FS_DAINT в это время содержит 0x00000002 (набор IEPINT1), а DIEPINT1 - 0x00000080 (TXFE). Вызывается строка в OTGD_FS_Handle_InEP_ISR (), которая очищает TXFE, но бит либо не сбрасывается, либо сразу становится повторно подтвержденным. Когда COM-порт на хосте повторно открывается, состояние OTG_FS_GINTSTS и OTG_FS_DAINT в конце прерывания всегда равно нулю, и дальнейшие прерывания происходят с нормальной скоростью. Обратите внимание, что проблема возникает только в том случае, если данные выводятся, но у хоста нет открытого порта. Если порт открыт или данные не выводятся, система работает бесконечно. Я считаю, что чем больше данных выводится, тем скорее возникает проблема, но в настоящее время это анекдотично.

В коде VCP есть переменная состояния, которая принимает следующие перечисленные значения:

  UNCONNECTED,
  ATTACHED,
  POWERED,
  SUSPENDED,
  ADDRESSED,
  CONFIGURED

, и мы используем состояние КОНФИГУРИРОВАНИЕ для определения следует ли помещать данные в буфер драйвера для отправки. Однако состояние CONFIGURED устанавливается, когда кабель подключен, а не когда на хосте открыт порт и подключено приложение. Я вижу, что когда Windows действительно открывает порт, происходит всплеск прерываний, поэтому кажется, что при этом событии происходит какое-то взаимодействие; Интересно, можно ли, таким образом, определить, открыт ли порт на хосте.

Возможно, мне понадобится одна из двух вещей:

  1. Чтобы код USB не застревал в ISR в первую очередь
  2. Чтобы определить, открыт ли порт на хосте со стороны устройства, и только нажимать данные для отправки при открытии.
5
задан Clifford 4 April 2014 в 19:51
поделиться