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

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

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

Считываю данные из прибора Протокол обмена следующий: Текущие данные передаются из прибора каждые 4 сек пакетом 344 байта. Все данные в двоичном формате. Скорость передачи 9600 бит/c. Каждый байт кодируется: одним старт битом, восемью битами данных и одним стоп битом. Помогите разобраться с кодом
        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(); // вызов метода отображение данных из прибора на экран           
        }
Байты читаю по кнопке button
        private void button1_Click(object sender, EventArgs e)
        {          
            try
            {
                ComPort.Open();
                if (ComPort.IsOpen)
                {
                    readcomport();
                }               
            }
            catch (Exception e1)
            {
                MessageBox.Show(e1.Message);
            }            
        }
Теперь моя проблема: в 70-80% байты считываются правильно, и в 20% - неправильное чтение. Может у кого то, есть рабочий код под мой случай с использованием события

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);
            }
        }

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


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

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

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