Какой неуправляемый API я должен использовать для управления последовательным портом? - PullRequest
1 голос
/ 13 апреля 2011

Сага продолжается ...

Я быстро прихожу к выводу, что мое последовательное устройство слишком привередливое, чтобы хорошо играть с классом SerialPort, предоставленным System.IO.Ports.

Чтобы убедительно выдать себя за программное обеспечение, поставляемое поставщиком, я пытаюсь сопоставить каждый аспект разговора, записанный Portmon ( logs здесь ) и Бесплатный серийный монитор HHD . Используя управляемую (.NET) библиотеку, я не могу воспроизвести следующее:

  1. Специальные символы . Как описано в отдельном вопросе , SerialPort не позволяет изменять набор специальных символов. вероятно, что это не имеет значения , но я бы хотел иметь возможность категорически отвергнуть его.
  2. Мелкозернистые таймауты . Как описано в MSDN , есть 5 настроек времени ожидания, которые определяют результирующее поведение:

    • ReadIntervalTimeout (RI)
    • ReadTotalTimeoutMultiplier (RM)
    • ReadTotalTimeoutConstant (RC)
    • WriteTotalTimeoutMultiplier (WM)
    • WriteTotalTimeoutConstant (WC).

    SerialPort.WriteTimeout(int) и SerialPort.ReadTimeout(int) только изменяют настройки WC и RC, что является небольшой проблемой, но вместо того, чтобы оставить остальные равными 0, .NET устанавливает RI и RM на -1.

  3. Запросы при открытии порта . Между открытием порта и настройкой скорости передачи мое приложение (.NET) и приложение, поставляемое поставщиком, выполняют несколько запросов, таких как IOCTL_SERIAL_GET_LINE_CONTROL. .NET добавляет то, чего не делает приложение вендора, например IOCTL_SERIAL_GET_MODEMSTATUS. Я бы хотел это остановить.

  4. Избыточное повторение . Во время открытия порта блок команд (настройка контроля линии, скорости передачи, специальных символов и рукопожатия, очистка RTS и DTR) почему-то повторяется .NET. Поставляемое поставщиком программное обеспечение сразу запускается после запуска этого блока.

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

Тогда мой вопрос: как мне напрямую подключить правильный API для управления последовательным портом на уровне «гайки и болты»? Любые предложения или рекомендации приветствуются!

Ответы [ 2 ]

0 голосов
/ 25 декабря 2014

Кажется, прошло некоторое время с тех пор, как этот поток был активен, но, поскольку у него нет решения, я решил ответить на вопрос для полноты.

Ваша проблема с повторной инициализацией происходит из-за значения по умолчаниюРукопожатие, которое использует класс SerialPort, я не знаю, почему он это делает, но это действительно раздражает, вы можете обойти это, пропустив свойства SerialPort и углубившись в структуру DCB.

Я сделалкласс в C #, полный методов расширения для класса SerialPort, посмотрите мой ответ здесь на CodeProject

Если вы решите пойти по этому пути, я бы рекомендовал пропустить напрямуючерез SerialPort.Write к SerialPort.BaseStream.Write они принимают те же параметры, но я вполне уверен, что класс SerialPort выполняет там дополнительные ненужные действия инициализации, делает то же самое с SerialPort.Read.

0 голосов
/ 13 апреля 2011

Прошло много времени с тех пор, как я делал сериалы, но я помню этого парня как очень хороший ресурс - сайт http://www.lvr.com/serport.htm. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...