.NET: чтение данных из последовательного порта

Я читаю данные, отправленные на последовательный порт (т. Е. COM3), используя такой код:

_serialPort.PortName = "COM3";
_serialPort.BaudRate = 9600;
_serialPort.Parity = Parity.None;
_serialPort.DataBits = 8;
_serialPort.StopBits = StopBits.One;
_serialPort.ReadTimeout = 500;
_serialPort.WriteTimeout = 500;
_serialPort.DataReceived += new SerialDataReceivedEventHandler(_serialPort_DataReceived);
_serialPort.Open();

Данные, поступающие с этого последовательного порта, являются командами и могут быть строкой любой длины, заканчивающейся на "\ 0". Я ищу лучшие практики о том, как эффективно читать такие данные. Я думаю, что модель производителя / потребителя может быть лучшей, где:

  1. Каждый раз, когда происходит событие DataReceived, я считываю строку из порта и добавляю в буфер строк или какую-либо другую структуру
  2. Затем у меня есть другой поток, который постоянно проверяет строковый буфер или структуру для char '\0' и, если найден, анализирует и удаляет командную строку.

Будет ли это самый эффективный способ справиться с этим? Существует ли какая-либо блокирующая функция последовательного чтения, которая не зависит от события dataReceived?

1 ответ

Решение

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

Я использую Timerчасто на 10 Гц. в Timer, Я проверяю SerialPort.BytesToRead > 0, Тогда я использую SerialPort.ReadLine который читает одну строку текста и сохраняет много кода для обработки входящего буфера.

если ты Loop до тех пор BytesToRead == 0чтение каждой строки либо в буфер для последующей обработки, либо непосредственно после чтения.

ReadTimeout Свойство в вашем примере полезно, если вы знаете, сколько времени понадобится Arduino для построения строки текста и вызовет Exception если в пределах ReadTimeout,

Другие вопросы по тегам