Некорректное чтение данных из com порта - C#

Узнай цену своей работы

Формулировка задачи:

Считываю данные из прибора Протокол обмена следующий: Текущие данные передаются из прибора каждые 4 сек пакетом 344 байта. Все данные в двоичном формате. Скорость передачи 9600 бит/c. Каждый байт кодируется: одним старт битом, восемью битами данных и одним стоп битом. Помогите разобраться с кодом
Листинг программы
  1. const int DataSize = 344;
  2. byte[] rez = new byte[DataSize]; // массив для хранения данных длинной 344 бита
  3. SerialPort ComPort = new SerialPort();
  4. ComPort.StopBits = StopBits.One; // стоп битов
  5. ComPort.DataBits = 8; // размер байта
  6. ComPort.BaudRate = 9600; // скорость обмена
  7. ComPort.Parity = Parity.None; // бит четности
  8. ComPort.ReadTimeout = 6000; // тайминги
  9. // Читаем из Com порта в массив
  10. public void readcomport()
  11. {
  12. ComPort.DiscardInBuffer();
  13. ComPort.DiscardOutBuffer();
  14. for (int i = 0; i< DataSize; i++)
  15. {
  16. rez[i]= Convert.ToByte(ComPort.ReadByte()); // читаем байты в массив
  17. }
  18. // Сохранение в файл под своим номером
  19. using (BinaryWriter writer = new BinaryWriter(File.Open((rez[15] << 8 | rez[14]).ToString() + ".tek", FileMode.Create)))
  20. {
  21. writer.Write(rez);
  22. }
  23. display(); // вызов метода отображение данных из прибора на экран
  24. }
Байты читаю по кнопке button
Листинг программы
  1. private void button1_Click(object sender, EventArgs e)
  2. {
  3. try
  4. {
  5. ComPort.Open();
  6. if (ComPort.IsOpen)
  7. {
  8. readcomport();
  9. }
  10. }
  11. catch (Exception e1)
  12. {
  13. MessageBox.Show(e1.Message);
  14. }
  15. }
Теперь моя проблема: в 70-80% байты считываются правильно, и в 20% - неправильное чтение. Может у кого то, есть рабочий код под мой случай с использованием события

DataReceived

. Желательно с использованием промежуточного буфера, чтобы считывался весь пакет данных без потерь. Буду признателен за ответ.

Решение задачи: «Некорректное чтение данных из com порта»

textual
Листинг программы
  1.   void Port_Read(object sender, SerialDataReceivedEventArgs e)
  2.         {
  3.             try
  4.             {
  5.  
  6.                 for (int i = 0; i < DataSize; i++)
  7.                 {
  8.                     rez[i] = Convert.ToByte(ComPort.ReadByte()); // ЧТЕНИЕ БАЙТОВ ИЗ ПРИБОРА В МАССИВ
  9.                 }
  10.                 SetText(Encoding.ASCII.GetString(rez));
  11.             }
  12.             catch (Exception e3)
  13.             {
  14.                 MessageBox.Show(e3.Message);
  15.             }
  16.         }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.133 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут