The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Помогите. Вычисление CRC"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Помогите. Вычисление CRC"
Сообщение от Alex emailИскать по авторуВ закладки on 03-Янв-02, 12:29  (MSK)
Помогите pls.

Есть дока на устройство:

Генерирующий полином :

СRC-CCITT = X16 + X12 + X5 + 1
...
LSB в первом байте текста является старшим управляющим битом для вычисления CRC .

и остаток передается немедленно на линиию , начиная со старшего управляющего бита.

Например , вычисление СRC, написанное на языке "C".

/* Младший управляющий бит в 'crc' : */
/* старший управляющий коэффициент при вычислении CRC */

  int calcrc(ptr,count)
unsigned char *prt ;
int count ;
{
  int crc,i;

  crc=0;
  while(--count>=0) {
   crc=crc^(int)*ptr++;
   for(i=0;i<8;++i) {
    if(crc&1)
    crc=crc>>1^0x8408;
    else
    crc=crc>>1;
   }
  }
  return(crc&0xffff);
  }
---------------------------

Смотрю монитором порта, получаю:
для блока данных:
CC 39 39 0E 02 52 30 30 30 31 30 31 30 39 39 39 39 39 39 39 39 39 39

CRC - 88 C2
для блока данных:
CC 39 39 0E 02 52 30 30 30 31 30 31 30 31
31 31 31 31 31 31 31 31 31

CRC - 33 0D                 

Ну не как не получается по этомй примеру таких CRC.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "RE: Помогите. Вычисление CRC"
Сообщение от MarBug emailИскать по авторуВ закладки on 04-Янв-02, 16:37  (MSK)
1. Может эта программа не соответствует алгоритму вычисления CRC? Может стоит посчитать вручную и сверить с выводом програмки:


#include <stdio.h>


int calcrc(unsigned char* ptr, int count)
{
    int crc, i, num;
    crc=0;
    while(--count>=0)
    {
        printf("count=%d  ", count);
        printf("crc=0x%X  ", crc);
        num= *(ptr);
        printf("num=0x%X  ", num);
        crc=crc^num;
        printf("crc^num=0x%X  ", crc);
        for(i=0;i<8;++i)
        {
            printf("i=%d ", i);
            if(crc&1)
            {
                crc=crc>>1^0x8408;
            }
            else
            {
                crc=crc>>1;
            }
            printf("crc>>?=0x%X  ", crc);
        }
        ptr= ptr+1;
        printf("\n");
    }
    return(crc&0xffff);
}


int main()
{
    int _Tmp__Rslt_int;
    unsigned char
        _Tmp__B1[]= {
    0xCC, 0x39, 0x39, 0x0E, 0x02,
    0x52, 0x30, 0x30, 0x30, 0x31,
    0x30, 0x31, 0x30, 0x39, 0x39,
    0x39, 0x39, 0x39, 0x39, 0x39,
    0x39, 0x39, 0x39 };

    _Tmp__Rslt_int= calcrc(_Tmp__B1, (sizeof(_Tmp__B1)) );
    printf("crc= %X", _Tmp__Rslt_int);
    printf("\n");
    
    return 0;
}

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "RE: Помогите. Вычисление CRC"
Сообщение от Soldier Искать по авторуВ закладки on 17-Янв-02, 12:39  (MSK)
>   crc=crc^(int)*ptr++;

Voobsche to u vas ptr eto ukazatel' na char (razmer=1).
Poetomu ptr++ znachi ptr+1, a ne ptr+2. T.e. esli peredat', skazhem 4 byta 0,1,2,3, to eto budet primerno sleduyuschee ( v zavismosti ot razmere int v baitah - pod DOS-om eto 2, a pod Linux - 4, koroche sizeof(int)):

1. crc=crc^(0+256*1+...);
2. crc=crc^(1+2*256+...);
3. crc=crc^(2+3*256+...);
4. crc=crc^(3+?*256+...);

Ili tak i nado? Ili ya s boduna chto to naputal?


  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру