2013-02-13 2 views
0

Я использую библиотеку последовательного порта C# для связи с датчиком и ПК. Я часто получаю таймауты с помощью метода SerialPort.Read(), хотя там есть данные. Я использовал серийные снифферы, чтобы проверить, что я получаю весь пакет в порту, но некоторые, как .NET не выбирает их всех и время. Я читаю байты, а получаемые мной байты на 2112 меньше, чем размер буфера последовательного порта. Я попробовал несколько вещей и теперь думал об использовании родной C/C++ и звонил в C#. Может ли кто-нибудь поделиться своими мыслями или использовать собственный код C/C++ в C#.Таймауты в последовательном порту C#

ответ

1

работает на скорости передачи данных 460800 до 921600

Это довольно странные скорости передачи данных, довольно высокие. Очевидно, что вы не используете событие DataReceived, поэтому довольно важно, как часто вы вызываете метод Read(). Потратьте немного времени на то, чтобы сделать что-то еще, в том числе Windows, думая, что нужно что-то более важное, и контекст отключается от вашего потока, и буфер приема быстро переполняется. Невыполнение события SerialPort.ErrorReceived является стандартной ошибкой, поэтому вы просто не видите эти переполнения, все, что вы видите, - это отсутствие данных.

Написание этого кода на C++ вряд ли принесет облегчение. Существует только один api для последовательных портов, SerialPort - это всего лишь тонкая оболочка и использует функции winapi, такие как ваш код на C++.

Так возьмите все из следующих этапов:

  • Реализовать событие ErrorReceived так что вы знаете что переливается происходят
  • Favor используя событие DataReceived, так что вы не зависят от вызова Read() часто достаточно
  • Установите ReadBufferSize на большое большое количество, чтобы драйвер мог занять слабину.
  • Установите свойство «Рукопожатие», чтобы драйвер мог сообщить устройству прекратить отправку, когда буфер заполнен
  • Проверьте, можете ли вы реализовать протокол, чтобы устройство не просто шланговое устройство не работало.
  • Опустите скорость передачи в бодах, если она по-прежнему недостаточно надежна.
Смежные вопросы