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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> crc 8, Нужна помощь
nokepp
сообщение Feb 7 2011, 16:08
Сообщение #16


Участник
*

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



ну да...данные вбиваются с клавиатуры. Так точнее мне будет понятен режим работы устройства. А для этого необходимо с ним пообщаться. ))
Конечно, я бы хотел снабдить терминал уже готовым калькулятором crc, но пока со своими навыками программирования, думаю это задача пока для меня неразрешима)

Сообщение отредактировал nokepp - Feb 7 2011, 16:09
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 7 2011, 16:13
Сообщение #17


кекс
******

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



Цитата(nokepp @ Feb 7 2011, 18:03) *
переменной buf[i] я присваиваю значение в 3 байта...и выскакивают какие-то ошибки.

Вы часом не так присваиваете:
buf[i] = "333"; <-- вот тут три байта присваиваю, а дурной компилятор ошибку выдает

если так, то советую бросить затею с CRC и почитать для начала какую-нить книжку по C.
Go to the top of the page
 
+Quote Post
Artem_Petrik
сообщение Feb 7 2011, 16:15
Сообщение #18


Местный
***

Группа: Свой
Сообщений: 443
Регистрация: 22-07-06
Из: Украина, г. Харьков
Пользователь №: 19 006



Цитата(nokepp @ Feb 7 2011, 18:08) *
ну да...данные вбиваются с клавиатуры. Так точнее мне будет понятен режим работы устройства. А для этого необходимо с ним пообщаться. ))
Конечно, я бы хотел снабдить терминал уже готовым калькулятором crc, но пока со своими навыками программирования, думаю это задача пока для меня неразрешима)

Чтож, по поводу ввода с клавиатуры могу только отослать к чтению буваря. Это элементарнейшая вещь, и разжевывать ее нет никакого желания.

Посоветую только не вводить сразу многобайтные значения типа 0xed13a632, а делать ввод побайтно: 0x32 0xa6 0x13 0xed. Соответственно первый байт ложить в buf[0], второй в buf[1] и так далее.


Go to the top of the page
 
+Quote Post
nokepp
сообщение Feb 7 2011, 16:20
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 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.



Уже читаю Герберт Шилдт)))но понимаете для меня эта задача стоит ребром и ее необходимо решить. Я уже писал, что взялся не по силам, но просто так я не хочу сдаваться.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Feb 7 2011, 16:26
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(nokepp @ Feb 7 2011, 19:20) *
buf[i]= {0x03 0x03 0x03}
Это Вы в каком месте программы делаете?

Код
unsigned char buf[8]={0x03, 0x03, 0x03};
Go to the top of the page
 
+Quote Post
Dnepr33
сообщение Feb 7 2011, 17:15
Сообщение #21


Участник
*

Группа: Участник
Сообщений: 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) sm.gif
и поработать с обработкой массива
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 или нечто сверхвысокоуровневое - можно человеку только посочувствовать sm.gif
Ну а ввод с терминала - там еще упр.последовательности пролетают sm.gif
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 7 2011, 22:58
Сообщение #22


кекс
******

Группа: Свой
Сообщений: 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-ми.

Цитата
Уже читаю Герберт Шилдт

Книга хорошая, прочитайте ее всю бегло - множество вопросов должно отпасть.
Go to the top of the page
 
+Quote Post
nokepp
сообщение Feb 10 2011, 15:41
Сообщение #23


Участник
*

Группа: Участник
Сообщений: 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
=(
Go to the top of the page
 
+Quote Post
Палыч
сообщение Feb 10 2011, 15:47
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(nokepp @ Feb 10 2011, 18:41) *
но почему-то компилятор ругается и пишет что оператор не имеет результата. и в итоге при любом пакете данных crc=0
Текст функции crc8 приведите
Go to the top of the page
 
+Quote Post
Artem_Petrik
сообщение Feb 10 2011, 17:18
Сообщение #25


Местный
***

Группа: Свой
Сообщений: 443
Регистрация: 22-07-06
Из: Украина, г. Харьков
Пользователь №: 19 006



надо не
Код
for(i=0;i++;i<8)
а
Код
for(i=0;i<8;i++)
Go to the top of the page
 
+Quote Post
nokepp
сообщение Feb 11 2011, 09:49
Сообщение #26


Участник
*

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



Всем спасибо огромное за терпение и помощь. Программа работает и crc соответствует действительности yeah.gif ТОлько одно но. Если например вводишь 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();
        }


И еще раз. Всем спасибо огромное за помощь!!! wink.gif
Go to the top of the page
 
+Quote Post

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

 


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


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