Битовые операции с радиоэфиром
- Войдите на сайт для отправки комментариев
Здравствуйте,
Подскажите, пожалуйста, как правильнее сделать то, что я хочу?
У меня есть входящий поток нулей и единиц (это выход из компаратора) и представляет собой оцифрованный радиосигнал.
Этот входящий поток нулей и единиц я расцениваю как биты и мне нужно его проверить на целостность (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(){}
Для упрощения я пропустил ряд действий (дописать необходимое количество нулей к исходному сообщению, количество которых на 1 меньше длины содержимого GENERATOR, проверить значение остатка после XOR).
Это одно и тоже. Мне кажется именно это и есть лучшее решение для Вас.
Не сходите с ума
Можно. В каких-то случаях удобнее, чем byte. Выбор зависит от других обстоятельств, о которых мне неизвестно. Из того, что Вы написали, я бы остановился на byte.
Евгений, спасибо за поддержку.
Я понял в чем была моя изначальная ошибка и почему мне приходилось прибегать к ненужной конверсии типов данных. Я изначально неправильно сформулировал массив для хранения поступающего потока нулей и единиц.
Вместо
мне надо было просто использовать
byte message[] = {0, 1, 0, 0, 1}; // Входящий поток нулей и единиц byte GENERATOR[] = {1, 1, 0}; // Генератор для CRCи все. И никаких сложностей потом нет. И тип - byte, конечно же )).
Спасибо.