Некорректное чтение данных из com порта - C#
Формулировка задачи:
Считываю данные из прибора
Протокол обмена следующий:
Текущие данные передаются из прибора каждые 4 сек пакетом 344 байта. Все данные в двоичном формате.
Скорость передачи 9600 бит/c. Каждый байт кодируется: одним старт битом, восемью битами данных и одним стоп битом.
Помогите разобраться с кодом
Байты читаю по кнопке button
Теперь моя проблема: в 70-80% байты считываются правильно, и в 20% - неправильное чтение.
Может у кого то, есть рабочий код под мой случай с использованием события
const int DataSize = 344; byte[] rez = new byte[DataSize]; // массив для хранения данных длинной 344 бита SerialPort ComPort = new SerialPort(); ComPort.StopBits = StopBits.One; // стоп битов ComPort.DataBits = 8; // размер байта ComPort.BaudRate = 9600; // скорость обмена ComPort.Parity = Parity.None; // бит четности ComPort.ReadTimeout = 6000; // тайминги // Читаем из Com порта в массив public void readcomport() { ComPort.DiscardInBuffer(); ComPort.DiscardOutBuffer(); for (int i = 0; i< DataSize; i++) { rez[i]= Convert.ToByte(ComPort.ReadByte()); // читаем байты в массив } // Сохранение в файл под своим номером using (BinaryWriter writer = new BinaryWriter(File.Open((rez[15] << 8 | rez[14]).ToString() + ".tek", FileMode.Create))) { writer.Write(rez); } display(); // вызов метода отображение данных из прибора на экран }
private void button1_Click(object sender, EventArgs e) { try { ComPort.Open(); if (ComPort.IsOpen) { readcomport(); } } catch (Exception e1) { MessageBox.Show(e1.Message); } }
DataReceived
. Желательно с использованием промежуточного буфера, чтобы считывался весь пакет данных без потерь. Буду признателен за ответ.Решение задачи: «Некорректное чтение данных из com порта»
textual
Листинг программы
void Port_Read(object sender, SerialDataReceivedEventArgs e) { try { for (int i = 0; i < DataSize; i++) { rez[i] = Convert.ToByte(ComPort.ReadByte()); // ЧТЕНИЕ БАЙТОВ ИЗ ПРИБОРА В МАССИВ } SetText(Encoding.ASCII.GetString(rez)); } catch (Exception e3) { MessageBox.Show(e3.Message); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д