登录
首页 串口通信 串口通信
回帖 发帖
正文

主题:关于CRC校验问题请教

点击:3167 回复:8

[size=4] 各位大哥:
  小弟请教个问题,在CRC校验时, 最后是把CRC寄存器高低字节交换.
请问怎么实现高低字节交换呢??  [/size]
  本人实在太笨了,看了无数 源代码,就是没看懂怎么交换过来的.
我有个想法是:把寄存器右移8位得到一个结果,然后把这个结果和 左移8位的结果 想加.
想加的结果是否就是 把高低字节交换了>???
05-06-04 13:15
你用什么语言,如果事高级语言可以用循环移位指令
05-06-08 11:36
用BASIC语言!  好象还没循环移位指令.
我用右移位(/2)做出来了,不过是在十进制下.
05-06-08 14:01
转换成字符串,再高低位互换。
05-06-19 14:35
使用如下语句:
    unsigned short crcc;
    crcc=CRC16CalString(StrToBeParity);
    StrHaveBeParity[0]=crcc&0xff;
    StrHaveBeParity[1]=crcc/0X100;
    StrHaveBeParity[2]='\0';
05-06-20 19:50
//----------------------------------------------------------------------------
//本函数为CRC16校验函数,针对单字符进行校验,返回16位的校验位
unsigned short  __fastcall TForm1::CRC16CalChar(unsigned short CRC,unsigned char Data)
{
 int i;
 unsigned char LowBit;
 CRC=CRC^Data;
 for(i=0;i<8;i++)
   {
    LowBit=CRC&0x01;
    CRC=CRC>>1;
    CRC=CRC&0x7fff;
    if(LowBit==0x01)
      CRC=CRC^0xa001;
    CRC=CRC&0xffff;
   }
 return CRC;
}
//--------------------------------------------------------------------------------
//本函数为CRC16校验函数,针对字符串进行校验,返回16位的校验位
unsigned short  __fastcall TForm1::CRC16CalString(unsigned char Data[1000])
{
 unsigned short CRC=0xffff;
 int Length=0;
 while(Data[Length]!='\0')
  {
   CRC=CRC16CalChar(CRC,Data[Length]);
   Length++;
  }
 return CRC;
}
05-06-20 19:52
//-----------------------------------------------------------------------------
//以下位CRC32校验的程序:
unsigned int __fastcall  TForm1::Reflect(unsigned int ref,char ch)
{
unsigned int value=0;
for(int i=1;i<=ch;i++)
  {
   if(ref&1)
     value|=1<<(ch-i);
   ref>>=1;
  }
return value;
}
//-----------------------------------------------------------------------------
unsigned int __fastcall  TForm1::Create_CRC32(unsigned char *text)
{
 unsigned int CRC32=0xffffffff;
 int len;
 unsigned char *buffer;
 len=strlen(text);
 buffer=text;
 while(len--)
   CRC32=(CRC32>>8)^CRC32_Table[(CRC32& 0xff)^(*buffer++)];
 return CRC32^0xffffffff;
}
void __fastcall TForm1::SpeedButton3Click(TObject *Sender)
{
TOKRightDlg *OKRightDlg=new TOKRightDlg(Application);
OKRightDlg->ShowModal();
OKRightDlg->Free();
}
//---------------------------------------------------------------------------
05-06-20 19:58
crc32的使用如下:
     int crc32;
     AnsiString crcss;
     AnsiString temp;
     char *EndPtr;
     StrHaveBeParity[0]=0x00;
     crc32=Create_CRC32(StrToBeParity);
     crcss=IntToHex(crc32,8);
     for(int ww=0;ww<4;ww++)
      {
       temp=crcss.SubString(ww*2+1,2);
       StrHaveBeParity[ww]=strtol(temp.c_str(),&EndPtr,16);
      }
     StrHaveBeParity[4]='\0';
05-06-20 19:58
有需要本人自编的各种校验码的程序的给我发邮件。这里无法发附件。
05-06-20 19:59

工控新闻

更多新闻资讯