Битовые операции с радиоэфиром

llaabbss
Offline
Зарегистрирован: 28.12.2017

Здравствуйте,

Подскажите, пожалуйста, как правильнее сделать то, что я хочу?

У меня есть входящий поток нулей и единиц (это выход из компаратора) и представляет собой оцифрованный радиосигнал.

Этот входящий поток нулей и единиц я расцениваю как биты и мне нужно его проверить на целостность (CRC). Длина входящего сообщения известна заранее и составляет, допустим, N бит.

CRC основана на битовой операции XOR.

И вот вопрос: в каком виде мне лучше оформлять входящий поток нулей и единиц, чтобы проще его было отXORить: unsigned char, byte, String, int?

В зависимости от типа исходных данных приходится постоянно их конвертировать через strtoul(), atoi(), но я уверен, что это неэффективно.

Как я изначально хотел сделать:

byte GENERATOR = "110"; // Генератор для CRC


void setup(){
     
     // Входящее сообщение
     byte message[] = "01001"; // Входящий поток нулей и единиц
     
     // Сколько символов содержится в этом массиве
     int message_length = sizeof(message) - 1; // -1 завершающий символ

     // Сколько символов содержится в полиноме
     int gen_length = sizeof(GENERATOR) - 1; // -1 завершающий символ

     // Проверка целостности входящего сообщения 
     for (byte x = 0; x < message_length; x++){
        
          if (String(message[x]) == "1"){
            
               for (byte j = 0; j < gen_length; j++){

                    // XOR
                    // И вот здесь начинаются ошибки типов данных 
                    message[x + j] = message[x + j] ^ GENERATOR[j];
                
               }
          }
     }

     // Вывожу результат 
     Serial.print(F("Result: "));
     for (byte x = 0; x < message_length; x++){
          Serial.print(message[x]);
     }
}

void loop(){}

 

llaabbss
Offline
Зарегистрирован: 28.12.2017

Для упрощения я пропустил ряд действий (дописать необходимое количество нулей к исходному сообщению, количество которых на 1 меньше длины содержимого GENERATOR, проверить значение остатка после XOR).

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

llaabbss пишет:
unsigned char, byte

Это одно и тоже. Мне кажется именно это и есть лучшее решение для Вас.

llaabbss пишет:
String

Не сходите с ума

llaabbss пишет:
int

Можно. В каких-то случаях удобнее, чем byte. Выбор зависит от других обстоятельств, о которых мне неизвестно. Из того, что Вы написали, я бы остановился на byte.

llaabbss
Offline
Зарегистрирован: 28.12.2017

Евгений, спасибо за поддержку.

Я понял в чем была моя изначальная ошибка и почему мне приходилось прибегать к ненужной конверсии типов данных. Я изначально неправильно сформулировал массив для хранения поступающего потока нулей и единиц.

Вместо

byte message[] = "01001"; // Входящий поток нулей и единиц
byte GENERATOR = "110"; // Генератор для CRC

мне надо было просто использовать

byte message[] = {0, 1, 0, 0, 1}; // Входящий поток нулей и единиц
byte GENERATOR[] = {1, 1, 0}; // Генератор для CRC

и все. И никаких сложностей потом нет. И тип - byte, конечно же )).

Спасибо.