C # serialPort скорость - PullRequest
       7

C # serialPort скорость

4 голосов
/ 21 августа 2009

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

Serial BaudRate = 187,5kb Я использую класс System.IO.Ports.SerialPort.

Этот протокол имеет 4 вида фреймов. У них есть 1Byte, 3Bytes, 6Bytes, 10-255Bytes. Я могу работать с ними, но получаю их слишком поздно, чтобы ответить .

Для начала я получаю первый пакет после отл. 96 мс (слишком поздно), и он содержит около 1000B. Это означает 20-50 кадров (слишком много, слишком поздно). Позже его работа более стабильна, 3-10 байт, но еще слишком поздно, потому что он содержит 1-2 кадра. Конечно, 1 кадр в порядке, но 2 слишком поздно.

Можете ли вы указать мне, как я могу справиться с этим более надежно? Я знаю, что это возможно.

Revision1:

Я пробовал прямо:

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
       if (!serialPort1.IsOpen) return;
       this.BeginInvoke(new EventHandler(this.DataReceived));
}

И рабочий Backgroud: И ... новый протектор (Читать) и ... всегда одно и то же. Слишком поздно, слишком медленно. Нужно ли возвращаться в WinApi и импортировать некоторые функции kernel32.dll?

Редакция 2: это часть использования кода в методе Treading:

int c = serialPort1.BytesToRead;
byte[] b = new byte[c];
serialPort1.Read(b, 0, c);

Я полагаю, это проблема с использованием потока внутри класса SerialPort. Или какая-то проблема с синхронизацией.

Редакция 3: Я не использую оба сразу !! Я просто пробовал разные способы.

С уважением MarekK

1 Ответ

1 голос
/ 10 января 2010

Возможно, вам следует прочитать это сначала , поскольку эта ошибка связана с событием DataReceived, которое иногда не запускается, и все еще не исправлено в Framework 3.0 / 3.5. Кроме того, вы должны прочитать кое-что здесь об этом постере, который сообщил о проблеме Microsoft, когда у него были проблемы с ее использованием, под VS2008 / NET 3.5 ... Я не могу сказать, правда это или нет ... но это то, о чем стоит помнить ... и у Microsoft действительно были определенные трудности с версией .NET, которая была представлена ​​в .NET версии 2.

В то время, когда я использовал .NET 1.1, я натолкнулся на предложения использовать версию, поставляемую с элементом управления ActiveX VB6, согласно которой source s в Интернете, что это был лучший сериал. управление связью !!!

Возможно, вам лучше изучить использование стороннего кода для обработки последовательных соединений, обычно написанных за пределами управляемого мира, то есть неуправляемых с использованием большого количества вызовов p /.

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

В итоге я использовал один из предоставленных Franson , который дал лучшие результаты, чем код Хинда.

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

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