реклама на сайте
подробности

 
 
> помогите куском кода, crc-8
laryc
сообщение Feb 3 2016, 11:40
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 55
Регистрация: 1-01-10
Из: комсомольск на амуре
Пользователь №: 54 586



не получается вкурить даташиты! ..почему-то.. нужно вычислять сrc-8 _CCITT = 0X07 c (double ) DATA
Был бы очень благодарен если кто-нибудь даст рабочий код для Си AVRa


--------------------
никогда не бывает так плохо чтобы небыло ещё хуже
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
esaulenka
сообщение Feb 5 2016, 14:39
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Какие-то не те книжки Вы читаете.

Берём гугл. Ищем "алгоритм crc8".
Первая же ссылка - wikibooks.
Копируем "Пример программы расчёта CRC8 на языке Си".
Вызываем:
Код
double myDouble = 1.23;
unsigned char crcResult = Crc8 ((unsigned char *) &myDouble, sizeof(myDouble));

Проверяем. Не сходится.
Внимательно читаем, выясняем, что Вам нужен полином 0x07, а тут используется далласовский 0x31. Меняем ОДНУ цифру 0x31 на 0x07, правим комментарий, повторяем проверку.


PS не силён в double'ах AVR-компиляторов. Но фразу "в сообщении 5 байт" с 8-байтовым double'ом связаны как-то слабо.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
laryc
сообщение Feb 7 2016, 12:07
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 55
Регистрация: 1-01-10
Из: комсомольск на амуре
Пользователь №: 54 586



Цитата(esaulenka @ Feb 5 2016, 18:39) *
Какие-то не те книжки Вы читаете.

Берём гугл. Ищем "алгоритм crc8".
Первая же ссылка - wikibooks.
Копируем "Пример программы расчёта CRC8 на языке Си".
Вызываем:
Код
double myDouble = 1.23;
unsigned char crcResult = Crc8 ((unsigned char *) &myDouble, sizeof(myDouble));

Проверяем. Не сходится.
Внимательно читаем, выясняем, что Вам нужен полином 0x07, а тут используется далласовский 0x31. Меняем ОДНУ цифру 0x31 на 0x07, правим комментарий, повторяем проверку.


PS не силён в double'ах AVR-компиляторов. Но фразу "в сообщении 5 байт" с 8-байтовым double'ом связаны как-то слабо.

попытка не увенчалась успехом .. посмотрите код ..что не так?

//делаем переменную из пяти байт
unsigned long long myDouble = 0;//double не позволяет сдвигать берём long long
myDouble = myDouble+number[0];
myDouble = myDouble<<8;
myDouble = myDouble+number[1];
myDouble = myDouble<<8;
myDouble = myDouble+number[2];
myDouble = myDouble<<8;
myDouble = myDouble+number[3];
myDouble = myDouble<<8;
myDouble = myDouble+number[4];


number[5] = Crc8 ((unsigned char *) &myDouble, sizeof(myDouble));



unsigned char Crc8(unsigned char *pcBlock, unsigned int len)
{
unsigned char crc = 0xFF;
unsigned int i;

while (len--)
{
crc ^= *pcBlock++;

for (i = 0; i < 8; i++)
crc = crc & 0x80 ? (crc << 1) ^ 0x07 : crc << 1;//0x31
}

return crc;
}


мож я действительно как-то не так мыслю... задача у меня такая : принимаю по USARTу пять байт и считаю CRC - 8 по полиному 0х07.. я согласно учебникам решил сделать 40 битовое число чтобы не заморачиваться с массивами и посчитать crc для одного числа .. честно сказать я не очень понимаю как работают указатели - всю жизнь обходился без них (уровень достаточного дилетанта)


--------------------
никогда не бывает так плохо чтобы небыло ещё хуже
Go to the top of the page
 
+Quote Post
k155la3
сообщение Feb 7 2016, 12:40
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(laryc @ Feb 7 2016, 15:07) *
попытка не увенчалась успехом .. посмотрите код ..что не так?
//делаем переменную из пяти байт
unsigned long long myDouble = 0;//double не позволяет сдвигать берём long long


А что Вы имеете ввиду "double не позволяет сдвигать"
- что сдвигать
- куда сдвигать
- зачем

А что именно успехом не увенчалось ?

Цитата(laryc)
мож я действительно как-то не так мыслю... задача у меня такая : принимаю по USARTу пять байт и считаю CRC - 8 по полиному 0х07.. я согласно учебникам решил сделать 40 битовое число чтобы не заморачиваться с массивами и посчитать crc для одного числа .. честно сказать я не очень понимаю как работают указатели - всю жизнь обходился без них (уровень достаточного дилетанта)



unsigned char RxBuf[1000];

RxBuf[0] = GetUSART_Byte();
RxBuf[1] = GetUSART_Byte();
RxBuf[2] = GetUSART_Byte();
RxBuf[3] = GetUSART_Byte();
RxBuf[4] = GetUSART_Byte();

unsigned char * MyPtr = (unsigned char *) &RxBuf[0];

unsigned char MyCRC;

MyCRC = Crc8 ( MyPtr, 5 );
printf("\nMyCRC8 = %.2X", MyCRC);

Не мучайте AVR. Возьмите на PC VisualStudio и наклацайте main() в console-проекте.

Кроме полинома, для ф-ии CRC есть еще как минимум 2 "подстройки"
- "стартовое" значение. В приведенной выше ф-ии unsigned char crc = 0xFF;
но может использоваться и 0x00
- порядок "счета" бит в байте, или направление сдвига (определяет, какой бит в "новом" байте
будет обработан первым - младший или старший)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th August 2025 - 05:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.01374 секунд с 7
ELECTRONIX ©2004-2016