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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> CRC вопрос!
bezobraznic
сообщение Oct 5 2007, 19:04
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 169
Регистрация: 26-05-05
Пользователь №: 5 441



Необходимо гонять между контроллером и PC через уарт большие пакеты данных. Надо проверять целостность и если что повторять передачу. Кто реализовывал подобные задачи подскажите пожалуйста идею реализации!! Спасибо!!!
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 5 2007, 19:14
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Дык, а в чем собственно вопрос-то? Есть CRC8, CRC16, CRC32, LRC даже. В каждой может быть свой образующий полином, который выбирается, исходя из условий: среды передачи, вероятностей тех или иных ошибок и пр.
Кстати, если вероятность ошибки высокая, то разумнее "гонять" наоборот НЕбольшие пакеты данных. Чтобы в случае ошибки повторять более короткий пакет, повторная передача которого займет меньше времени.
Go to the top of the page
 
+Quote Post
PSP
сообщение Oct 5 2007, 19:34
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 118
Регистрация: 1-10-07
Пользователь №: 30 988



В общем случае в зависимости от вероятности ошибки и ее характера (например портятся отдельные биты, а не сплошные блоки данных) использование корректирующих кодов может оказаться эффективнее чем просто контроль целостности и перепосылка. Правда если речь идет о метровом кабеле RS232 не в заводском цеху, то скорее всего одиночную ошибку можно ждать неделями.

Сообщение отредактировал PSP - Oct 5 2007, 19:40
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Oct 5 2007, 19:45
Сообщение #4


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Посмотрите стандартные протоколы: xmodem, zmodem, WAKE и другие. Возможно, что-то подойдет, а можете и стандартный модефицировать под свою задачу.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 5 2007, 22:26
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Ну тогда еще один вариант CRC16. С начальным входным значением, чтобы можно было посчитать общую CRC16 блочных данных.
Код
//==============================================//
// Функция подсчета СRC16 по алгоритму          //
//----------------------------------------------//
//аргументы: указатель на буфер,                //
//           размер буфера,                     //
//           стартовое значение СRC16           //
//возвращает:подсчитанное значение СRC16        //
//----------------------------------------------//
//ВНИМАНИЕ! Стартовому значению CRC16 необходимо//
//          присвоить значение 0xFFFF,          //
//          размер массива для подсчета CRC16   //
//          не более 65535 байт                 //
//==============================================//
#ifndef _POLINOME_CRC16_
  #define _POLINOME_CRC16_  0xA001
#endif

unsigned int f_CRC16Calc(unsigned char *buf, unsigned int sizeBuf, unsigned int crc)
{ unsigned int i, j;
  for(i=0;i<sizeBuf;i++)
  { crc=crc^buf[i];
    for (j=0;j<8;j++)
    { if ((crc&0x0001)!=0x0000) crc=(crc>>1)^_POLINOME_CRC16_;
      else crc>>=1;
    }
  }
  return (crc);
}
Go to the top of the page
 
+Quote Post
CD_Eater
сообщение Oct 6 2007, 06:11
Сообщение #6


Частый гость
**

Группа: Новичок
Сообщений: 173
Регистрация: 3-09-04
Из: Moscow
Пользователь №: 595



Для больших пакетов рулит Adler32 (скорость вычислений на порядок выше CRC). Если Вам 32 бита много, то можно по аналогии со стандартным Adler32 сделать "Adler16".
Коротко: Adler - это Флетчер, но по простому модулю.
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Oct 6 2007, 08:24
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



2 PSP - а про корректирующие коды - можно поподробнее??
Go to the top of the page
 
+Quote Post
bezobraznic
сообщение Oct 6 2007, 08:37
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 169
Регистрация: 26-05-05
Пользователь №: 5 441



Спасибо за ответы! Последний вопрос!
Я понял так:
Вышепреведённую функцию crc16 необходимо высчитать на передающей стороне.
Затем результат передать вместе с данными.
На принимающей стороне опять считаем crc16 и сравниваем результат с переданным.
В зависимости от результата принимаем решение о повторной передаче.

Подкоректируйте если чё-нить не правильно!!!!
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Oct 6 2007, 08:43
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



2 bezobraznic - правильно..
Go to the top of the page
 
+Quote Post
DiMomite
сообщение Oct 6 2007, 11:10
Сообщение #10


Участник
*

Группа: Свой
Сообщений: 47
Регистрация: 8-04-06
Из: Одесса
Пользователь №: 15 959



Цитата
Спасибо за ответы! Последний вопрос!
Я понял так:
Вышепреведённую функцию crc16 необходимо высчитать на передающей стороне.
Затем результат передать вместе с данными.
На принимающей стороне опять считаем crc16 и сравниваем результат с переданным.
В зависимости от результата принимаем решение о повторной передаче.


Еще небольшое уточнение.
Есть 2 варианта определения того, что передача прошла без ошибок: первый описали вы, а второй - CRC считается для всех данных+поле CRC, в этом случае результат должен быть равен нулю при отсутствии ошибок (либо если их больше, чем может обнаружить код). Это никак не влияет на саму идею вычисления CRC, но если вы когда то столкнетесь со вторым вариантом реализации, так что бы это вас не смутило.
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Oct 6 2007, 11:34
Сообщение #11


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

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Цитата
второй - CRC считается для всех данных+поле CRC, в этом случае результат должен быть равен нулю при отсутствии ошибок

Как раз это первый и правильный способ, но именно для CRC, так как он когда-то реализовывался аппаратноwink.gif Варианты же образования контрольных сумм с отклонением от этого правила действительно требуют сравнения результатов параллельного подсчёта и переданного значения


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
bezobraznic
сообщение Oct 6 2007, 12:20
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 169
Регистрация: 26-05-05
Пользователь №: 5 441



Цитата(DiMomite @ Oct 6 2007, 14:10) *
Еще небольшое уточнение.
Есть 2 варианта определения того, что передача прошла без ошибок: первый описали вы, а второй - CRC считается для всех данных+поле CRC, в этом случае результат должен быть равен нулю при отсутствии ошибок (либо если их больше, чем может обнаружить код). Это никак не влияет на саму идею вычисления CRC, но если вы когда то столкнетесь со вторым вариантом реализации, так что бы это вас не смутило.



Я не понимаю почему црц должно быть равно 0 во втором варианте(данные+поле CRC) поясните если можно!!!

И ещё, В передатчике,если использовать 2 вариант, то я должен сначала посчитать црц по данным,
затем дополнить поле данных результатом црц, и потом опять считать црц !? И куда мне деть результат второго црц?
В приёмнике чё делать?

Распишите плиз 2й вариант а то я запутался!! Спасибо!!
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Oct 6 2007, 12:26
Сообщение #13


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

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



В передатчике ничего не правим. В приёмнике подсчёт контрольной суммы ведётся не "для всего до контрольной суммы", а на 2 байта (для CRC16) больше - результат вычисления в таком случае должен быть равен нулю если ошибок не было.


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
PSP
сообщение Oct 6 2007, 12:39
Сообщение #14


Частый гость
**

Группа: Свой
Сообщений: 118
Регистрация: 1-10-07
Пользователь №: 30 988



Цитата(Kuzmi4 @ Oct 6 2007, 11:24) *
2 PSP - а про корректирующие коды - можно поподробнее??


В самых общих чертах примерно так. Вычисляется хитрая контрольная сумма по блоку данных и передается вместе с данными. На приемной стороне опять считается контрольная сумма, и при ошибке можно вычислить какие биты искажены и восстановить их. В простейшем случае восстанавливается 1 бит, а большее количество ошибок только обнаруживается. Пример такого кода - ECC используемое в NAND flash, которые могут иметь одиночные сбои. Там на каждую страницу в 512 байт используется 3-х байтовое ECC и есть специальная область данных (spare) для его хранения. Алгоритм с примерами описан в appnote у Samsung. Подобная, но более сложная система, которая восстанавливает больше ошибок используется на всех CD и DVD дисках.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 6 2007, 18:44
Сообщение #15


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(bezobraznic @ Oct 6 2007, 15:20) *
Я не понимаю почему црц должно быть равно 0 во втором варианте(данные+поле CRC) поясните если можно!!!
CRC - это остаток от деления массива данных (который берется как очень длинное число) на полином. По аналогии с простым делением - если A/B дает в остатке C, то (A-C)/B дадут в остатке ноль. При выполнении обычного деления используется вычитание делителя из делимого. Деление полиномов аналогично, только используется вычитание по модулю два. Которорое обладает таким свойством, что дает тот же самый результат, что и суммирование по модулю два. Когда мы добавляем рассчитанное CRC к массиву - мы фактически приписываем к делимому N нулей в конец (умножаем его на 2^N) и прибавляем CRC по модулю два к добавленным нулевым битам, или же, что тождественно, вычитаем его по модулю два. Получается, что мы из исходного данного вычли остаток и теперь деление на приемной стороне должно будет дать в остатке (т.е. в результате вычисления CRC) ноль.
Попытался, как смог, объяснить "на пальцах". Более подробно с выкладками у Скляра в "цифровой связи", ну и в других книгах.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 14:02
Рейтинг@Mail.ru


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