|
crc 8, Нужна помощь |
|
|
|
Jan 28 2011, 16:11
|
Участник

Группа: Участник
Сообщений: 27
Регистрация: 24-11-10
Пользователь №: 61 153

|
Все добрый день! необходимо написать программу, простенькую, для расчета контрольной суммы по алгоритму crc8.Собственно говоря, я в С++ только только начал разбираться  , но вот появилась такая задача и можно сказать зашился. Хочу, что бы просто в командной строке вводишь данные и сразу выдает ответ. Данные hex. Алгоритм программы таков public class CRC8 { private static int getCrc(int oneByte, int crc){ int i = oneByte ^ crc; crc = 0; if((i & 0x01)>0) crc ^= 0x5e; if((i & 0x02)>0) crc ^= 0xbc; if((i & 0x04)>0) crc ^= 0x61; if((i & 0x08)>0) crc ^= 0xc2; if((i & 0x10)>0) crc ^= 0x9d; if((i & 0x20)>0) crc ^= 0x23; if((i & 0x40)>0) crc ^= 0x46; if((i & 0x80)>0) crc ^= 0x8c; return crc; } byte[] bytes = {(byte)0x31,(byte)0xFF,(byte)0x06}; System.out.printf("crc=%X\n",CRC8.getCrc4Array(bytes)); Сразу скажу, что возможно он отличается от привычных всем, ибо этот алгоритм разработан производителями переферийнного устройства и, подсчитывая crc в ручную, у меня не совпадало значение моего crc со значением производителя  . Я писал им support  , но они отказываются мне помогать.
|
|
|
|
2 страниц
< 1 2
|
 |
Ответов
(15 - 25)
|
Feb 7 2011, 16:08
|
Участник

Группа: Участник
Сообщений: 27
Регистрация: 24-11-10
Пользователь №: 61 153

|
ну да...данные вбиваются с клавиатуры. Так точнее мне будет понятен режим работы устройства. А для этого необходимо с ним пообщаться. )) Конечно, я бы хотел снабдить терминал уже готовым калькулятором crc, но пока со своими навыками программирования, думаю это задача пока для меня неразрешима)
Сообщение отредактировал nokepp - Feb 7 2011, 16:09
|
|
|
|
|
Feb 7 2011, 16:15
|
Местный
  
Группа: Свой
Сообщений: 443
Регистрация: 22-07-06
Из: Украина, г. Харьков
Пользователь №: 19 006

|
Цитата(nokepp @ Feb 7 2011, 18:08)  ну да...данные вбиваются с клавиатуры. Так точнее мне будет понятен режим работы устройства. А для этого необходимо с ним пообщаться. )) Конечно, я бы хотел снабдить терминал уже готовым калькулятором crc, но пока со своими навыками программирования, думаю это задача пока для меня неразрешима) Чтож, по поводу ввода с клавиатуры могу только отослать к чтению буваря. Это элементарнейшая вещь, и разжевывать ее нет никакого желания. Посоветую только не вводить сразу многобайтные значения типа 0xed13a632, а делать ввод побайтно: 0x32 0xa6 0x13 0xed. Соответственно первый байт ложить в buf[0], второй в buf[1] и так далее.
|
|
|
|
|
Feb 7 2011, 16:20
|
Участник

Группа: Участник
Сообщений: 27
Регистрация: 24-11-10
Пользователь №: 61 153

|
Цитата(defunct @ Feb 7 2011, 19:13)  Вы часом не так присваиваете: buf[i] = "333"; <-- вот тут три байта присваиваю, а дурной компилятор ошибку выдает да нет....я примерно понимаю, о чем идет речь. ))) buf[i]= {0x03 0x03 0x03} или в бинарном будет нагляднее видно, что 3 байта. А кстати какая разница, как записывать. По идее она должна считать до 8 байт или я что-то все же не понял? Цитата(defunct @ Feb 7 2011, 19:13)  если так, то советую бросить затею с CRC и почитать для начала какую-нить книжку по C. Уже читаю Герберт Шилдт)))но понимаете для меня эта задача стоит ребром и ее необходимо решить. Я уже писал, что взялся не по силам, но просто так я не хочу сдаваться.
|
|
|
|
|
Feb 7 2011, 17:15
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 1-02-11
Из: Днепропетровск
Пользователь №: 62 622

|
Цитата(Artem_Petrik @ Feb 7 2011, 18:15)  Чтож, по поводу ввода с клавиатуры могу только отослать к чтению буваря. Это элементарнейшая вещь, и разжевывать ее нет никакого желания.
Посоветую только не вводить сразу многобайтные значения типа 0xed13a632, а делать ввод побайтно: 0x32 0xa6 0x13 0xed. Соответственно первый байт ложить в buf[0], второй в buf[1] и так далее. На мой взгляд надо взять для начала небольшой компилятор - напр. Borland-C++ (даже 1.0)  и поработать с обработкой массива char ms[] = {0x01, 0x04, 0x55 . . . . . . .}; int i, sz_ms = sizeof(ms); for(i=0;i<sz_ms;i++) printf("%.2X", ms[i]); calc_CRC8(ms, sz_ms); А если это Java или нечто сверхвысокоуровневое - можно человеку только посочувствовать  Ну а ввод с терминала - там еще упр.последовательности пролетают
|
|
|
|
|
Feb 7 2011, 22:58
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(nokepp @ Feb 7 2011, 18:20)  да нет....я примерно понимаю, о чем идет речь. ))) buf[i]= {0x03 0x03 0x03} или в бинарном будет нагляднее видно, что 3 байта. при объявлении массива, число в квадратных скобочках задает его размер - т.е. число элементов. Далее при обращении к этому массиву число в квадратных скобочках обозначает уже не число элементов, а порядковый номер элемента ("И"ндекс потому собсно и обзывают его "i"). Объявляем массив из трех элементов, обычно так: char buf[ 3 ]; если требуется сразу проинициализировать элементы массива, то пишем сразу при объявлении: char buf = {10, 20, 30}; после объявления переобъявить его с целью изменения размера - нельзя, можно только обращаться к его элементам. Любой массив начинается с элемента с номером 0. Для объявленного и проинициализированного выше массива из 3-х элементов buf[0] <--- элемент с номером 0, равен 10 buf[1] <--- элемент с номером 1, равен 20 buf[2] <--- элемент с номером 2, равен 30 buf[i] - это элемент массива buf с номером i пример заполнить массив из 8-ми элементов числами 0, 1, 2, 3, 4, 5, 6, 7: Код char buf[ 8 ]; // объявить массив из 8-ми элементов char i;
for(i = 0; i < 8; i++) { buf[ i ] = i; // присвоить i-му элементу массива число i } Цитата А кстати какая разница, как записывать. По идее она должна считать до 8 байт или я что-то все же не понял? Большая - при расчете CRC количество символов тоже важно. В примере который вам дали считается CRC для сообщения из строго 8 байт. И даже если массив у вас из 3-х элементов, там все равно CRC посчитается для 8-ми. Цитата Уже читаю Герберт Шилдт Книга хорошая, прочитайте ее всю бегло - множество вопросов должно отпасть.
|
|
|
|
|
Feb 10 2011, 15:41
|
Участник

Группа: Участник
Сообщений: 27
Регистрация: 24-11-10
Пользователь №: 61 153

|
Вроде подразобрался, но все равно возникают трудности. В общем я занес в массив данные, и в теле функции работает цикл for. Код unsigned char crc=0; unsigned char i; for(i=0;i++;i<8) { crc=crc8(buf[i],crc); } но почему-то компилятор ругается и пишет что оператор не имеет результата. и в итоге при любом пакете данных crc=0 =(
|
|
|
|
|
Feb 10 2011, 17:18
|
Местный
  
Группа: Свой
Сообщений: 443
Регистрация: 22-07-06
Из: Украина, г. Харьков
Пользователь №: 19 006

|
надо не Код for(i=0;i++;i<8) а Код for(i=0;i<8;i++)
|
|
|
|
|
Feb 11 2011, 09:49
|
Участник

Группа: Участник
Сообщений: 27
Регистрация: 24-11-10
Пользователь №: 61 153

|
Всем спасибо огромное за терпение и помощь. Программа работает и crc соответствует действительности  ТОлько одно но. Если например вводишь 3 байта данных а не 8, то необходимо задать другие параметры для цикла for.(чтобы i изменялось до того количества байт данных, которые введены.Но это уже не так страшно и можно над этим подумать.Например сделать, что бы i изменялось именно до того числа, которое соответствует количеству воодимых данных. В конце привожу код программы(только здесь именно для 3 байт)...вдруг кому-нибудь еще понадобиться. Код #include <conio.h> #include <stdlib.h> #include <stdio.h> #include <iostream>
unsigned char crc8(unsigned char data, unsigned char crc) { unsigned char i=data^crc; crc=0;
if(i & 0x01) crc^=0x5e; if(i & 0x02) crc^=0xbc; if(i & 0x04) crc^=0x61; if(i & 0x08) crc^=0xc2; if(i & 0x10) crc^=0x9d; if(i & 0x20) crc^=0x23; if(i & 0x40) crc^=0x46; if(i & 0x80) crc^=0x8c; return crc; }
void main (void) { unsigned char buf[8]={0x31,0xFF,0x06}; unsigned char crc=0; unsigned char i; for(i=0;i<3;i++) { crc=crc8(buf[i],crc); } printf("crc naketa=0x%x",crc);
getch(); } И еще раз. Всем спасибо огромное за помощь!!!
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|