Обработка данных из com порта - C#

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

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

Неправильно читаются данные из массива (в одном байте игнорируется 0 спереди)

Настройки порта не привожу, чтобы не захламлять код Кусок кода
Листинг программы
  1. const int DataSize = 344;
  2. byte[] rez = new byte[DataSize]; // массив для хранения данных длинной 344 байта
  3. SerialPort ComPort = new SerialPort();
  4. public void readcomport()
  5. {
  6. listBox1.Items.Clear();
  7. ComPort.DiscardInBuffer();
  8. ComPort.DiscardOutBuffer();
  9. // цикл считывания побайтно из порта и преобразование в 16-ую систему счисления.
  10. for (int i = 0; i< DataSize; i++)
  11. {
  12. rez[i]= Convert.ToByte(ComPort.ReadByte());
  13. listBox1.Items.Add(i + ". " + Convert.ToString(rez[i], 16)); //выводим данные ListBox
  14. }
  15. display(); // вызов функции отображение данных из прибора на экран
  16. }
  17. // Сцепление младшего и старшего байта
  18. public string szepka (byte low, byte hi)
  19. {
  20. prizep = String.Concat(Convert.ToString(low, 16), Convert.ToString(hi, 16));
  21. return prizep;
  22. }
  23. // Раскидываю данные по ячейкам
  24. void display()
  25. {
  26. ...
  27. szepka(rez[225], rez[224]); // 1-1
  28. textBox1.Text = Convert.ToInt32(prizep, 16).ToString();
  29. szepka(rez[227], rez[226]); // 1-2
  30. textBox2.Text = Convert.ToInt32(prizep, 16).ToString();
  31. ...
  32. }
Вот в чем проблема, допустим в textBox23, должно находиться десятичное число 22796 (или в шестнадцатиричной системе счисления - 59 0с), а в textBox23 по факту находиться число 1436 ( в 16-ой СС - 59 с), во втором байте спереди игнорируется нуль 0. Как выйти из этого положения? Если в listBox сделать так,
Листинг программы
  1. listBox1.Items.Add(i + ". " + Convert.ToString(rez[i], 16).PadLeft(2,'0'));
то нуль как бы есть, но я беру данные из массива.

Второй вопрос.

Как правильно округлить десятичное число, например до 4 знаков, но чтобы не пропадали нули, например, число 1.9600. Пробовал так,
Листинг программы
  1. textBox91.Text = Math.Round(float.Parse(textBox61.Text) / float.Parse(textBox65.Text), 4).ToString();
Такой способ дает число 1.96, а мне нужно 1.9600

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

textual
Листинг программы
  1. textBox1.Text = (rez[225] << 8 | rez[224]).ToString();
  2. textBox1.Text = (rez[227] << 8 | rez[226]).ToString();

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


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

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

13   голосов , оценка 3.692 из 5

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

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

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