Я пытаюсь написать программу, которая обновляет форму окна каждый раз, когда новые данные поступают на последовательный порт, но я борюсь с пониманием того, как работает последовательный порт, и как я может использовать его так, как я этого хочу.Последовательный порт Trigger DataReceived при получении определенных количеств байтов
У меня есть внешнее устройство, отправляющее 8 байтов на 1 Гц на мой последовательный порт и желающее использовать событие DataReceived из класса SerialPort. Когда я отлаживаю свой код, событие более или менее запускается случайным образом на основе того, что программа делает в определенное время. Код как ниже:
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//byte[] rxbyte = new byte[1];
byte[] rxbyte = new byte[8];
byte currentbyte;
port.Read(rxbyte, 0, port.BytesToRead);
currentbyte = rxbyte[0];
int channel = (currentbyte >> 6) & 3; //3 = binary 11, ANDS the last 2 bits
int msb_2bit = (currentbyte >> 0) & 255; //AND compare all bits in a byte
currentbyte = rxbyte[1];
int val = ((msb_2bit << 8) | (currentbyte << 0));
//Extra stuff
SetText_tmp1(val.ToString());
}
Я хочу быть в состоянии иметь ровно 8 байт в приемном буфере перед тем, как вызвать функцию чтения, но я не знаю, как это сделать (не используется класс SerialPort перед тем), и хотите делать все манипуляции с данными только тогда, когда у меня есть все 8 байтов. Есть ли встроенный способ переключения события только тогда, когда определенное количество байтов находится в буфере? Или есть другой способ получить только 8 байтов, но не более, и оставить оставшиеся байты в следующем экземпляре?
Видимо, у вас есть проблема XY. У вас есть ответ на проблему Y, но IMO вам все равно нужно решить X. Если это просто домашнее задание, то надежное решение, вероятно, не обязательно (но должно быть стоит A или дополнительный кредит). Если это для реального продукта, то вы не закончили. – sawdust