.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". Я ищу лучшие практики о том, как эффективно читать такие данные. Я думаю, что модель производителя / потребителя может быть лучшей, где:
- Каждый раз, когда происходит событие DataReceived, я считываю строку из порта и добавляю в буфер строк или какую-либо другую структуру
- Затем у меня есть другой поток, который постоянно проверяет строковый буфер или структуру для char '\0' и, если найден, анализирует и удаляет командную строку.
Будет ли это самый эффективный способ справиться с этим? Существует ли какая-либо блокирующая функция последовательного чтения, которая не зависит от события dataReceived?
1 ответ
Я обнаружил, что dataReceieved
событие может срабатывать слишком часто и блокирует SerialPort
когда код работает в событии. Вы говорите, что хотите эту функцию, но здесь есть дополнительная информация, которая может или не может быть полезна.
Я использую Timer
часто на 10 Гц. в Timer
, Я проверяю SerialPort.BytesToRead > 0
, Тогда я использую SerialPort.ReadLine
который читает одну строку текста и сохраняет много кода для обработки входящего буфера.
если ты Loop
до тех пор BytesToRead == 0
чтение каждой строки либо в буфер для последующей обработки, либо непосредственно после чтения.
ReadTimeout
Свойство в вашем примере полезно, если вы знаете, сколько времени понадобится Arduino для построения строки текста и вызовет Exception
если в пределах ReadTimeout
,