Я разрабатываю какой-то инструмент мониторинга для какого-то протокола, основанного на последовательной связи.
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