Разобрать данные с COM-порта - C#

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

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

Привет. Стоит задача проверять данные, приходящие с COM-порта, разбирать блоки побайтно и формировать выходные массивы данных. Данные состоят из блоков фиксированной длины. Последний байт 44 (в 16-и ричном коде - признак окончания блока). 3-й байт - константа. Мне необходимо вынимать данные с 1,2 и 4,5 байтов. Остальная информация не важна. Работает так: делаю отправку блока данных-1 (5 байт), в ответ приходит несколько блоков данных. Пока реализовал чтение так (для проверки работоспособности):
                 int byteRecieved = serialPort1.BytesToRead;
                 byte[] messByte = new byte[byteRecieved];
                 serialPort1.Read(messByte, 0, byteRecieved);
Все работает, данные считываются, потом сохраняю их в файл. Подскажите, пожалуйста: какой алгоритм лучше использовать для считывания данных побайтно, разбора данных и какими командами это лучше делать? Желательно с примерами кода (или ссылками на примеры), чтобы разобраться. Пока я алгоритм вижу так: 1.считывается первые 9 байт данных, сравниваются с данными в переменной (в неё записана последовательность первого ответа с устройства). Если совпадает, значит идет отправка данных. 2.Читаются следующие 9 байт данных. Проверяем, чтобы 9 и 3 байты совпадали данными констант (т.е. проверяем, что приняли правильно данные). 3.Читаем 1, 2 и 4, 5 байты (данные в формате short int). Пишем их в 2 массива. Какие методы лучше использовать для реализации?
Сорри, выше ошибся, не тот код вставил:
                byte[] array = new byte[serialPort1.BytesToRead];
                serialPort1.Read(array, 0, serialPort1.BytesToRead);
                SetText(Encoding.ASCII.GetString(array));
Количество блоков данных я задаю. Т.е. для предыдущего примера можно сделать расчет размера буфера для приема данных/ Что-то вроде такого:
static void Main(string[] args)
{
int16 db = 9; //указываем длину одного блока
int16 dd  = 50; //задаем количество блоков
int16 df = dd * db; //читаем размер буфера
}
                byte[] array = new byte[df];        //в качестве размера буфера подставляем рассчитанный размер буфера 
                serialPort1.Read(array, 0, serialPort1.BytesToRead);  // читаем данные в буфер
Не совсем понимаю, по какому алгоритму грамотно обработать данные.

Решение задачи: «Разобрать данные с COM-порта»

textual
Листинг программы
            int byteRecieved = serialPort1.BytesToRead;
            byte[] messByte = new byte[byteRecieved];
            serialPort1.Read(messByte, 0, byteRecieved);
 
            using (BinaryWriter bw = new BinaryWriter(new FileStream("data.dat", FileMode.Create, FileAccess.Write)))
            {
                bw.Write(1000);
            }

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


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

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

14   голосов , оценка 4.143 из 5
Похожие ответы