Как сформировать контрольную сумму CRC ?
- Войдите на сайт для отправки комментариев
Ср, 02/07/2014 - 16:19
Привет всем , помогите пожалуйста разобраться с проблемкой , есть устройства на которое нужно посылать изменяющиеся показания но оно читает данные только с контрольной суммой CRC .
Подскажите как скормить показания чтобы выводилась контрольная сумма?
как запустить таблицу расчёта контрольной суммы?
Пример кода
void setup() { Serial.begin(9600); } void loop() { Serial.print("88"); Serial.print(","); Serial.println(con_sum);
static const uint8_t PROGMEM dscrc_table[] = { 0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65, 157,195, 33,127,252,162, 64, 30, 95, 1,227,189, 62, 96,130,220, 35,125,159,193, 66, 28,254,160,225,191, 93, 3,128,222, 60, 98, 190,224, 2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255, 70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89, 7, 219,133,103, 57,186,228, 6, 88, 25, 71,165,251,120, 38,196,154, 101, 59,217,135, 4, 90,184,230,167,249, 27, 69,198,152,122, 36, 248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91, 5,231,185, 140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205, 17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80, 175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238, 50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115, 202,148,118, 40,171,245, 23, 73, 8, 86,180,234,105, 55,213,139, 87, 9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22, 233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168, 116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53}; uint8_t crc8(const uint8_t *addr, uint8_t len) { uint8_t crc = 0; while (len--) { crc = pgm_read_byte(dscrc_table + (crc ^ *addr++)); } return crc; }
В папке OneWire.h вроде есть пример вот тока не понятно как это запустить
Так а в чем вопрос-то? Сами спросили, сами ответили. В вашем же посте функция crc8 для расчета контрольной суммы. Вызываете ее, передаете адресс "кого нужно обсчитать", и сколько байт нужно обработать.
И во втором посте, тоже две фунции crc8 и crc16-ть.
Вы вообще не с того немного начали. У контрольная сумма это не какое-то "стандарт". Это "класс фунций". Семейство. Которые похоже только "предназначением".Контрольная сумма — Википедия
Поэтому для "некоего устройства", нужен "некий алгоритм расчета контрольной суммы".
Вообщем начинайте поиск с даташита своего "некоего устройства", в котором дожно быть описано как расчитать контрольную сумму. Именно для ЭТОГО устройства.
Либо ищите готовую либу под него.
Либо, если устройство работает по какой-то стандартной шине - в описании шины будет указанно что-же именно понимается под "контрольной суммой" в данном случае.
Привет , я в ручную рассчитывал контрольную сумму по CRC 100110001 через калькулятор
http://ghsi.de/CRC/index.php?Polynom=100110001&Message=7c+80+e0+c8+ca+00+3f+28
и забивал в строку
62,1,7,19,83,0,252,20 контрольная сумма 183
Подскажи пожалуйста как мне засунуть эту строку в код чтобы он выдавал контрольную сумму.
Вот наброски кода есть но где то что то тут не правильно
А мы теперь должны угадать в чем именно "неправильно" проявляется? Это такая игра?
А "не то", тут то, что вы берете копируете код, и вставляете его "куда попало", не осмыслено. Не вникая ни "куда вы его вставили" ни что же этот код означает с точки зрения компилятора.
Для начала, отворматируйте свой код. Все что в скобочках квадратных должно иметь смещение. Если не хотите руками нажмите CTRL-T в ArduinoIDE, она автоматом это сделает. После чего ответте на такие вопросы:
1. Сколько функций объявляет ваш код?
2. Где он их объявляет (внутри чего они находятся)
3. Где они вызываются (назовите строки)
4. Что происходит в строке 50?
у меня почему та код выдаёт ошибку
0021\hardware\arduino\cores\arduino/Print.h:61: note: void Print::println(long unsigned int, int) <near match>
sketch_jul10a.cpp: In function 'void CRC(unsigned char*, unsigned char)':
sketch_jul10a:56: error: 'CRC_table' was not declared in this scope
Лицорука... лешак, я понял, ты тут терпение тренируеш и спокойствие.
А где ответы на вопросы?
Вот вам еще:
"sketch_jul10a:56: error: 'CRC_table' was not declared in this scope" - как перевести? Где объявлена переменная CRC_table?
Не я просто пытаюсь разобраться
А где ответы на вопросы?
Есть вариант в Караганде. :)
Дык а фигли? Вон в железных вопросах со мной так же "тренируют терпение". Там уже я туплю.
А вообще, когда я учился, то мой учитель (который себя таковым не считал, просто небыло больше никого кто хоть что-то знал, и инета небыло, даже фидо еще у нас не...) - вообще ничего не объяснял. Все его ответы на мои приставания сводились к "вон в той книге есть то что тебе нужно". В итоге я был ему благодарен именно за такой подход :)
2bit: вам нужно брать справочник по языку и начинать смотреть "объявления переменных", "область видимости переменых", "объявление функций"... вообщем вначале ознакомится с синтаксисом языка (пару простеньких упражнений выполнить), а потом уже пытатся на его базе строить осмысленные предложения, а не "дали набор слов, расставте их там что-бы фраза получилась правильная". И чужой код "что-же тут происходит и зачем" - появится шанс понимать.
Гыыы, у меня щас дочь осваивает курс по програмированию на с++ от гарварда.. дык она програмы сначала в тетради пишет. И как то там видит что у ней работать будет а что нет. Я честно говоря окосел когда первый раз увидел. Кстати очень занимательный курс, для начинающих особенно. Они там так хитро народ вводят в програмирование. Рекомендую.
1 две функции
2 int main(int argc, char* argv[])
3 строка 36
4 должна выводится чексум
Гыыы. Эпично.
Официант, еще кувшин сидора и крылышек. Ну и попкорна если кто желает.
А меня как раз бесило, когда в школе заставляли "в тетрадочке". Невозможно ничего поправить, даже форматирование. Нет помощи дружественного компилятора который может подсказать куда обратить внимание... :) (многие почему-то на ошибки компилятора негативно реагируют, а ведь это "первейший друг", самая главная помощь, которая позволяет решить 90% самостоятельно).
Но, после того, как я зацепился с лектором на тему "это не возможно, нет возможно...". И потом на практике написал 5 строчек кода, которые с точки зрения препода "работать не должны", а они работали :) И после того как 45-минут уже три препода разбиралсь с этими 5-тью строчками и завершилось посылкой парламентера "просят прийти и объяснить как работает" - больше с дуристиков листиков ко мне не приставали. И вообще ничего от меня не хотели.
Собственно с того момента все "практики" я проводил в режиме "учитель". Бродил по классу и помогал "у кого что не выходит/не понятно".
Хе... вот вспомнил былое... :) Может потому тут на форуме мне и нравится "терпение тренировать"? ;)
Ну там они кстати забавно. По инструкции подымаеш виртуальную машину с их линухом (почти голый в командной строке). Там уже все библиотеки, все подлючено. И пишеш код в текстовике, компилиш, запускаешь. Смотриш.
1 две функции
Неверно. У вас их 4-ре штуки объявлено. Назовите две которые вы нашли.
2 int main(int argc, char* argv[])
Еще раз. Сделайте отбивку кода. Внутри main() у вас не объявлено ни одной функции (испльзуются - да, а объвление - в другом месте). Кстати, вы догадываетесь что main() - это тоже функция? Уже хотя-бы поэтому ответом на вопрос "внутри чего они находятся?" ответ "внутри main() - ну никак не может быть верным.
3 строка 36
Неверно. В строке 36-ть у вас объявляется функция main() , а вопрос был "где они вызываются?" (кстати "они", фунции, а не только про одну вопрос был).
Воощем еще раз, открывайте справочник по языку, например в шапке сайте есть раздел "Программирование", а там есть "функции". Выяните разницу между "объявлением" (описанием как называется функция, какие параметры принимает, что делает...) и ее вызовом (использованием по назначению). И уже на основе этих знаний разбирайте по косточкам свой код.
4 должна выводится чексум
Чексум - это уже "то что вы держите в голове". Я для компилятора существуют понятие "переменная" (у которой дожно быть имя) и "функция" и т.п. Так что же именно выводить Serial.println(CRC); ? Переменную CRC? Результат функции CRC? Генеральную линию партии? ;)
1 Я только 3 функции вижу
07
void setup()
12
void loop()
54
void CRC (unsigned
4 Результат функции CRC
На остальные вопросы затрудняюсь ответить
А можно какой нить код простой чтобы с него начать разбираться?
Напишите и распишете пожалуйста код расчйта контрольной суммы за вознаграждения.
Да что тут писать-то? Что толку, даже если за денежку напишут, если вы воспользоваться уже готовым не можете?
Если пытаетесь объявление фунции, в функцию пихать? Если структуру базового скетча ардуины не знаете. Пытается main() сюда вмантулить.
Вот что это: int main(int argc, char* argv[])?
Спросили бы "что такое main" выяснили бы что такое параметры argc и argv[]. Сразу бы узнали что это "параметры переданные программи из командной строки".... А где у нас в ардуине (или любом микроконтроллере) команданая строка... а в п... нигде. Операционки-то у нас нет. Значит это ЯВНО вообще из другой оперы.
Да, в конце-то концов. За МЕСЯЦ можно-то было разобраться, что функция внутри функции не объявляется? За месяц с нуля, вообще не видя компьютер до этого, уже можно было хотя-бы синтаксические несуразности убрать. Взять любой учебник по C/C++ и хотя-бы объявлять функции и вызывать их научится?
И ведь этого "достаточно" для вашей задачи. В #5 у вас уже "все написано". Нужно только "выбросить лишние". И не пытаться запихнуть багажник автомобиля в телевизор. Нужно,все-таки, телевизор в багажник автомобиля.
Выводит раз в секунду:
Что вообщем-то немного похоже на ваше "Контрольная сумма 100110001"
Ну, а если учесть, что ваше "100110001" - это 9-ть бит. И выкинуть "один лишний", то будет не "похоже", а "совпадает".
При этом.... мозг "что такое CRC" - я вообще не включал. Взял код который тут висит месяц и выкинул из него "синтаксические несуразности". Просто взял и вызвал функцию которая "уже готова".
Спасибо большое за помощь.
Почему-то код работает не правильно, контрольную сумму расчитыватся только по первому числу 62 и контрол суумма должна быть 234 (0xEA)?
И где тут встовляется полином 100110001 P(x) = x8+ x5+ x4+ x0 или он тут не нуже, расчёт идёт по таблице?
Ай, дарагой, отстань.... ну нужна тебе эта 234, а???? Это что, начало номера девушк, да?
Вывод:
Спасибо
ээээ... в догонку
есть устройства (MPX TOYOTA) посылающие сообщения:
0x67, 0xFE, 0xDF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x36, 0x7E
0x55, 0xFE, 0xE6, 0x20, 0x25, 0x40, 0xE3, 0x7E
0x53, 0xFE, 0x24, 0x00, 0x67, 0x7E
0x64, 0xFE, 0xE4, 0x00, 0x00, 0x28, 0x7E
0x44, 0xFE, 0xAB, 0x62, 0x80, 0x30, 0x7E
0xA4, 0x62, 0xA4, 0xFF, 0x00, 0x19, 0x7E
(4bits) приоритет/(4bits) размер / DST-ID (8bits) / MES-ID (8bits) / DATA (8- 88bits) / CRC (8bits) / EOM (8blts) /
все понятно но сосчитать контрольную сумму никак не удается. пользовался разными онлайн калькуляторами, библиотеками все бестолку. должно быть простое решение. Но я не вижу. Может кто глянет на досуге?
Спасибо.
вопрос решен.
кому интересно решение тут: habrahabr.ru/company/contactless/blog/216023/