Получая ошибку только в первый раз, когда я общаюсь с моим SerialPort позже, он работает нормально - PullRequest
0 голосов
/ 27 мая 2011
  • У меня есть USB-устройство (например, сканер штрих-кода и т. Д.)
  • Я общаюсь с ним, используя SerialPort (который можно найти из набора инструментов VS2008)

Моя проблема:

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

Чтобы выйти из этого, я просто отсоединить USB-кабель от USB-порта моего ПК.

Как только я уберу кабель, я получаю сообщение об ошибке ниже:

enter image description here

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

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

Примечание : Другая вещь, которую следует учитывать, - это если я введу свой код в try и catch Я ловлю исключение, только когда отсоединяю USB-кабель от ПК.

Редактировать

После перезагрузки компьютера, если я это сделаю

  1. отсоедините и затем подключите USB-кабель к USB-порту компьютера, а затем
  2. Я запускаю приложение, затем оно работает нормально

Мне кажется, что управление происходит внутри бесконечного цикла, когда я пытаюсь отправить строку на последовательный порт в самый первый раз после запуска ПК.

Смотрите подробности моего кода более здесь

Ответы [ 2 ]

1 голос
/ 24 марта 2012

Вероятность 90% заключается в том, что вы пытаетесь обойти общий сценарий взаимоблокировки с SerialPort. Обычно срабатывает при использовании Invoke () в обработчике событий DataReceived. Если вы затем используете Close () в своем основном потоке, когда порт занят приемом данных, то возникает взаимоблокировка. Закрытие не может быть завершено до тех пор, пока обработчик событий DataReceived не завершит работу, Invoke () не может завершиться, поскольку основной поток застрял в вызове Close. Выдергивание коннектора работает, потому что ThreadExceptionDialog перекачивает сообщения, позволяя завершить Invoke.

Простой обходной путь - вместо этого использовать BeginInvoke (). Просто не вызывать Close тоже хорошо, Windows позаботится об этом, когда ваша программа завершится. Лучше всего использовать своего рода контролируемое отключение вашего приложения, чтобы вы ничего не потеряли, отправленное устройством serialport.

0 голосов
/ 24 марта 2012

Вы должны закрыть последовательный порт в событии FormClose. Потому что порт один раз откроет ваше приложение и закроет порт на конце приложения

...