⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 crc.c

📁 avr mega128的源代码串口
💻 C
字号:
#include "crc.h"

#define POLYNOMIAL16    0x1021   //x^16+x^12+x^5+1
#define PRESET_VALUE16  0xFFFF
#define POLYNOMIAL5    0x09<<3  //x^5+x^3+1
#define PRESET_VALUE5  0x09<<3

/*
*str为需要crc编码的字符串;
byLen为整个字符串的长度;
rmd为字符串最后一个字节的有效位数长度
*/
unsigned int caculate_crc16(unsigned char *str,unsigned int byLen,unsigned int rmd)
{
  unsigned int currCrcVlu;
  unsigned int i,j;  
 
  currCrcVlu = PRESET_VALUE16; 
  for(i=0;i<byLen-1;i++)
  {
    currCrcVlu = currCrcVlu^(((unsigned int)str[i])<<8);
    for(j=0;j<8;j++)
    {
      if(currCrcVlu & 0x8000)			
        currCrcVlu = (currCrcVlu<<1)^POLYNOMIAL16;
      else			
        currCrcVlu = (currCrcVlu<<1);
    }
  }
  currCrcVlu = currCrcVlu^(((unsigned int)str[i])<<8);
  for(j=0;j<rmd;j++)
  {
    if(currCrcVlu & 0x8000)			
      currCrcVlu = (currCrcVlu<<1)^POLYNOMIAL16;
    else			
      currCrcVlu = (currCrcVlu<<1);
  }                                                   
  return(~currCrcVlu);
}//test ok
unsigned char caculate_crc5(unsigned char *str)
{
  unsigned char currCrcVlu;
  unsigned int i,j;  
  
  currCrcVlu = PRESET_VALUE5;
  for(i=0;i<4;i++)
  {
    if(i != 3)
    {
      currCrcVlu = currCrcVlu^(str[i]<<3);
      for(j=0;j<5;j++)
      {
        if(currCrcVlu & 0x80)			
          currCrcVlu = (currCrcVlu<<1)^POLYNOMIAL5;
        else			
          currCrcVlu = (currCrcVlu<<1);
      }
    }
    else
    {
      currCrcVlu = currCrcVlu^(str[i]<<6);
      for(j=0;j<2;j++)
      {
        if(currCrcVlu & 0x80)			
          currCrcVlu = (currCrcVlu<<1)^POLYNOMIAL5;
        else			
          currCrcVlu = (currCrcVlu<<1);
      }
    }
  }
  currCrcVlu = (currCrcVlu>>3)&0x1f;
  return(currCrcVlu);
} //test ok

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -