您现在所在的是:

串口通信

回帖:8个,阅读:3120 [上一页] [1] [下一页]
1041
2002yuhuaide
文章数:53
年度积分:50
历史总积分:1041
注册时间:2004/3/9
发站内信
发表于:2005/6/4 13:15:00
#0楼
[size=4] 各位大哥:
  小弟请教个问题,在CRC校验时, 最后是把CRC寄存器高低字节交换.
请问怎么实现高低字节交换呢??  [/size]
  本人实在太笨了,看了无数 源代码,就是没看懂怎么交换过来的.
我有个想法是:把寄存器右移8位得到一个结果,然后把这个结果和 左移8位的结果 想加.
想加的结果是否就是 把高低字节交换了>???

906
joininthefun
文章数:3
年度积分:50
历史总积分:906
注册时间:2005/6/8
发站内信
发表于:2005/6/8 11:36:00
#1楼
你用什么语言,如果事高级语言可以用循环移位指令
1041
2002yuhuaide
文章数:53
年度积分:50
历史总积分:1041
注册时间:2004/3/9
发站内信
发表于:2005/6/8 14:01:00
#2楼
用BASIC语言!  好象还没循环移位指令.
我用右移位(/2)做出来了,不过是在十进制下.
1179
fyxr
文章数:101
年度积分:50
历史总积分:1179
注册时间:2004/12/17
发站内信
发表于:2005/6/19 14:35:00
#3楼
转换成字符串,再高低位互换。
1171
newsmart
文章数:117
年度积分:50
历史总积分:1171
注册时间:2001/4/2
发站内信
发表于:2005/6/20 19:50:00
#4楼
使用如下语句:
    unsigned short crcc;
    crcc=CRC16CalString(StrToBeParity);
    StrHaveBeParity[0]=crcc&0xff;
    StrHaveBeParity[1]=crcc/0X100;
    StrHaveBeParity[2]='\0';
1171
newsmart
文章数:117
年度积分:50
历史总积分:1171
注册时间:2001/4/2
发站内信
发表于:2005/6/20 19:52:00
#5楼
//----------------------------------------------------------------------------
//本函数为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;
}
1171
newsmart
文章数:117
年度积分:50
历史总积分:1171
注册时间:2001/4/2
发站内信
发表于:2005/6/20 19:58:00
#6楼
//-----------------------------------------------------------------------------
//以下位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();
}
//---------------------------------------------------------------------------
1171
newsmart
文章数:117
年度积分:50
历史总积分:1171
注册时间:2001/4/2
发站内信
发表于:2005/6/20 19:58:00
#7楼
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';
1171
newsmart
文章数:117
年度积分:50
历史总积分:1171
注册时间:2001/4/2
发站内信
发表于:2005/6/20 19:59:00
#8楼
有需要本人自编的各种校验码的程序的给我发邮件。这里无法发附件。

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

78.0005