COM-порт перестает работать - PullRequest
0 голосов
/ 15 ноября 2011

Среда: WinXP; PowerBuilder 11.5 (хотя, вероятно, не имеет значения, потому что эта часть почти полностью состоит из вызовов WinAPI)

Мое приложение открывает COM-порт для записи с использованием перекрывающихся вызовов методов. Порт открывается при открытии приложения. Приложение всегда оставляет порт открытым.

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

Данное устройство печатает этикетки со штрих-кодом. Приложение будет печататься очень хорошо, но вдруг оно не будет печатать. Закройте приложение; открыть и соединить с гипертерминалом; отключить и закрыть гипертерминал; откройте приложение. Он снова работает отлично ... на некоторое время. (У меня были похожие проблемы с другими устройствами, которые также общаются через COM-порт, поэтому я знаю, что это не само устройство.)

Самая близкая похожая проблема, которую я могу найти в Интернете, - http://www.eggheadcafe.com/microsoft/Windows-XP-Hardware/30829577/com1-not-behaving.aspx, которая говорит о конфликтах IRQ и не предлагает решения. Я могу только догадываться, что моя проблема похожа.

Кто-нибудь знает, что может делать гипертерминал, чтобы прояснить ситуацию?

Ответы [ 2 ]

0 голосов
/ 27 января 2015

Ну, это очень поздно, но у меня были похожие проблемы на нескольких устройствах, в первую очередь на устройствах USB, имеющих драйвер USB / COM-порта.

Симптом, который я обнаружил, это то, что COM-порт спорадически закрывает все самостоятельно.Я проследил эту проблему до двух потенциальных проблем:

  1. Драйвер USB / COM может иметь ошибки, которые приводят к закрытию порта.Попробуйте обновленный драйвер.

  2. Электрические помехи на проводе USB, входящем в компьютер, могут привести к закрытию порта.Если вы столкнулись с этой проблемой, вы не сможете решить ее легко.

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

    Если вы не можете, вам, возможно, придется изменить приложение, чтобы обнаружить закрытый порт, а затем выполнить сброс драйвера, что аналогично отключению и повторному подключению кабеля USB, а затем приостановитьнемного, чтобы убедиться, что сброс действительно занимает.

0 голосов
/ 29 ноября 2011

Я явно установил метод рукопожатия с помощью SetCommState, и это, похоже, решило проблему. PowerBuilder не имеет битовых операндов, поэтому мне пришлось создать метод, который превращал бы число DWORD в массив символов «1» и «0». Я создал соответствующий метод, который превратил массив символов обратно в DWORD. Итак, я захватил текущее состояние с помощью GetCommState, перевел флаги в массив, обошел массив, копируя существующие значения, за исключением тех, которые задают управление потоком (DTR Control и RTS Control - не уверен, нужны ли мне оба), которые я явно установить в '0', затем преобразовать полученный массив обратно в DWORD и использовать SetCommState, чтобы применить его.

Для тех, кто занимается исследованиями, помните, что DTR Control и RTS Control имеют два бита каждый. Десятичные значения для них:

CONSTANT ULong fDtrControl_Enable = 2^4
CONSTANT ULong fDtrControl_Handshake = 2^5
CONSTANT ULong fRtsControl_Enable = 2^12
CONSTANT ULong fRtsControl_Handshake = 2^13
CONSTANT ULong fRtsControl_Toggle = fRtsControl_Enable + fRtsControl_Handshake
...