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

|
Дык, а в чем собственно вопрос-то? Есть CRC8, CRC16, CRC32, LRC даже. В каждой может быть свой образующий полином, который выбирается, исходя из условий: среды передачи, вероятностей тех или иных ошибок и пр. Кстати, если вероятность ошибки высокая, то разумнее "гонять" наоборот НЕбольшие пакеты данных. Чтобы в случае ошибки повторять более короткий пакет, повторная передача которого займет меньше времени.
|
|
|
|
|
Oct 6 2007, 11:10
|

Участник

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

|
Цитата Спасибо за ответы! Последний вопрос! Я понял так: Вышепреведённую функцию crc16 необходимо высчитать на передающей стороне. Затем результат передать вместе с данными. На принимающей стороне опять считаем crc16 и сравниваем результат с переданным. В зависимости от результата принимаем решение о повторной передаче. Еще небольшое уточнение. Есть 2 варианта определения того, что передача прошла без ошибок: первый описали вы, а второй - CRC считается для всех данных+поле CRC, в этом случае результат должен быть равен нулю при отсутствии ошибок (либо если их больше, чем может обнаружить код). Это никак не влияет на саму идею вычисления CRC, но если вы когда то столкнетесь со вторым вариантом реализации, так что бы это вас не смутило.
|
|
|
|
|
Oct 6 2007, 11:34
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
Цитата второй - CRC считается для всех данных+поле CRC, в этом случае результат должен быть равен нулю при отсутствии ошибок Как раз это первый и правильный способ, но именно для CRC, так как он когда-то реализовывался аппаратно  Варианты же образования контрольных сумм с отклонением от этого правила действительно требуют сравнения результатов параллельного подсчёта и переданного значения
--------------------
aka Vit
|
|
|
|
|
Oct 6 2007, 12:20
|
Частый гость
 
Группа: Участник
Сообщений: 169
Регистрация: 26-05-05
Пользователь №: 5 441

|
Цитата(DiMomite @ Oct 6 2007, 14:10)  Еще небольшое уточнение. Есть 2 варианта определения того, что передача прошла без ошибок: первый описали вы, а второй - CRC считается для всех данных+поле CRC, в этом случае результат должен быть равен нулю при отсутствии ошибок (либо если их больше, чем может обнаружить код). Это никак не влияет на саму идею вычисления CRC, но если вы когда то столкнетесь со вторым вариантом реализации, так что бы это вас не смутило. Я не понимаю почему црц должно быть равно 0 во втором варианте(данные+поле CRC) поясните если можно!!! И ещё, В передатчике,если использовать 2 вариант, то я должен сначала посчитать црц по данным, затем дополнить поле данных результатом црц, и потом опять считать црц !? И куда мне деть результат второго црц? В приёмнике чё делать? Распишите плиз 2й вариант а то я запутался!! Спасибо!!
|
|
|
|
|
Oct 6 2007, 12:39
|
Частый гость
 
Группа: Свой
Сообщений: 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 дисках.
|
|
|
|
|
Oct 6 2007, 18:44
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|