Связь через COM-порт C # - ошибки с USB на последовательный адаптер - PullRequest
2 голосов
/ 26 июля 2011

Вот сценарий - у меня есть приложение C #, которое читает с COM-порта. Большую часть времени я использую устройства с последовательным адаптером и на машине с последовательными портами. Тем не менее, машины с последовательными портами все труднее найти, поэтому я начал использовать машины с последовательным / USB-соединением.

В некоторых случаях код C #, который у меня есть, будет нормально работать с «истинным» последовательным соединением, но не с USB / последовательным соединением. Данные поступают фрагментированно с первой частью входящих данных (как, возможно, первые 1 или 2 символа) и ничего больше.

Я использую что-то базовое, например comport.ReadExisting (), чтобы забрать данные из порта. Это часть проблемы? Существуют ли другие методы, гарантирующие, что все данные будут прочитаны в одной строке?

Наконец, я хочу добавить, что я уже поигрался с некоторыми настройками USB / serial в диспетчере устройств, И данные идут хорошо при использовании хорошего, ole 'hyperterminal. , , так что должно быть что-то в коде.

Ответы [ 2 ]

2 голосов
/ 26 июля 2011

С помощью USB-последовательных преобразователей вы ДОЛЖНЫ установить тайм-аут приема, поскольку данные могут долго храниться на USB-устройстве, когда Windows не знает об этом. Реальные последовательные порты хранят данные в FIFO 16550, где их видит драйвер Windows.

1 голос
/ 26 июля 2011

В большинстве случаев вы хотели бы использовать событие SerialPort.DataReceived (http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived.aspx).

Для этого необходимо вручную объединить порции данных, поскольку вы можете получать части вашей строки, но как только вы обнаружите границу одной «записи», вы можете запустить обработку этой записи, позволяя IO получать больше событий.

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

...