Некорректное чтение данных из 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);
}
}