单片机模块化程序: CRC校验

前言

  这一节说明一下数据传输中常用的CRC校验

  所谓CRC校验,说白了就是对数据做下计算,然后把计算结果放到最后面

  平时用的最多的算是CRC16

直接上菜

计算CRC

/**
* @brief calculate CRC
* @param *modbusdata: Source data address
* @param length: data length
* @param
* @retval CRC16 Value
* @example
**/
int crc16_modbus(u8 *modbusdata, int length)
{
  int i, j;
  int crc = 0xffff;//0xffff or 0
  for (i = 0; i < length; i++)
  {
    crc ^= modbusdata[i];
    for (j = 0; j < 8; j++)
    {
      if ((crc & 0x01) == 1)
      {
        crc = (crc >> 1) ^ 0xa001;
      }
      else
      {
        crc >>= 1;
      }
    }
  }

  return crc;
}

  

判断接收的数据CRC是否正确

/**
* @brief check CRC for data
* @param *modbusdata: Read data address
* @param length: Read data length
* @param
* @retval 1:CRC16 OK
* @example
**/
int crc16_flage(u8 *modbusdata, int length)
{
  int Receive_CRC=0,calculation=0;

  if(length<=2)
  {
    return 0;
  }

  Receive_CRC = crc16_modbus(modbusdata, length-2);
  calculation = modbusdata[length-2];
  calculation <<= 8;
  calculation += modbusdata[length-1];
  if(calculation != Receive_CRC)
  {
    return 0;
  }
  return 1;
}

发送的数据加上CRC

  我想发送 01 00 55 aa 数据

    

  最终发送的数据

    

  说明:

  1.最后两位 F7 和 BE就是经过CRC16计算之后的数据;高位在前,低位在后

  2.整个数据发给另一个设备以后,另一个设备用同样的方式计算 01 00 55 aa 的CRC16值

  然后判断下自己计算的值是不是 F7,BE

判断接收的数据CRC是否正确

  

  

上位机(C# / JAVA)CRC16校验程序

  /// <summary>
  /// calculate CRC
  /// </summary>
  /// <param name="modbusdata">Source data address</param>
  /// <param name="length">data length</param>
  /// <returns></returns>
  private int crc16_modbus(byte[] modbusdata, int length)
  {
    int i, j;
    int crc = 0xffff; //0xffff or 0
    try
    {
      for (i = 0; i < length; i++)
      {
        crc ^= modbusdata[i]&0xff;
        for (j = 0; j < 8; j++)
        {
          if ((crc & 0x01) == 1)
          {
            crc = (crc >> 1) ^ 0xa001;
          }
          else
          {
            crc >>= 1;
          }
        }
      }
    }
    catch (Exception)
    {
      throw;
    }
    return crc;
  }

  /// <summary>
  ///
  /// </summary>
  /// <param name="modbusdata"></param>
  /// <param name="length"></param>
  /// <returns></returns>
  private int crc16_flage(byte[] modbusdata, int length)
  {
    int Receive_CRC = 0, calculation = 0;//接收到的CRC,计算的CRC
    if(length<=2) return 0;
    Receive_CRC = crc16_modbus(modbusdata, length-2);
    calculation = modbusdata[length -2];
    calculation <<= 8;
    calculation += modbusdata[length-1];
    if (calculation != Receive_CRC)
    {
      return 0;
    }
    return 1;
  }

  注:对于上位机byte类型需要&0xff

    

    

    

扩展

  大部分设备的CRC16计算方式,这个地方是 0xffff, 但是也有0的情况

  

原文地址:https://www.cnblogs.com/yangfengwu/p/12117491.html

时间: 2024-10-18 00:50:10

单片机模块化程序: CRC校验的相关文章

单片机模块化程序: 数据缓存封包-环形队列实现

前言 在上一节只是稍微说了下数据缓存 https://www.cnblogs.com/yangfengwu/p/11769059.html 这节为了可以让大家直接应用起来,我封装了下. 咱们平时发送数据的时候最希望的是可以有个缓存,每次把要发送的数据存到缓存里面 需要发送的时候咱就去缓存里面去取 而且咱希望咱的缓存可以存储多条数据 发送的时候按照先进先出的原则把数据提取出来发出去 使用说明 一,注意,这一节是对上一节的封装,请先看上一节 不过LoopList做了下改动 然后增加了 BufferM

单片机模块化程序: 数据缓存封包-内存管理实现

前言 上一节使用的是环形队列实现的数据缓存 这节使用内存管理实现 内存管理使用的是 μC/OS-II 里面的内存管理程序 使用说明(第一种) 一,内存管理意味着有许多的内存块 然后每个内存块有固定的长度 内存块的长度假设定义的足够大,可以放入每条数据 原文地址:https://www.cnblogs.com/yangfengwu/p/12238511.html

CRC校验程序3:通过窗体程序打开txt文件获取数据源,进行逐字节CRC校验

在上一篇中,生成输出的CRC.exe将要成为这个窗体应用的内置模块. 新建一个windows窗体应用程序,叫做CRClick.将应用程序CRC.exe从Console应用程序中找到,复制到CRClick文件夹的Debuge文件夹下.同时还有测试用的Test.txt. 打开窗体设计页面,插入两个Textbox和一个按钮,长度Textbox用来显示被校验的文件的绝对路径,短Textbox显示最终校验码.按钮激发选择文件的窗口.设计如下: 对于按钮的触发事件,我们生成一个OpenFileDialog控

CRC校验程序2:通过命令提示符加载文本文档作为数据源进行CRC校验,输出校验码

将CRC校验函数封装在类中,通过控制台传参(文件的相对路径),进行CRC校验. 1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 8 namespace CRC 9 { 10 class Program 11 { 12 static void Main(s

VB下的CRC校验程序

随着计算机技术的不断发展,在现代工业中,利用微机进行数据通讯的工业控制 应用得也越来越广泛.由于传输距离.现场状况等诸多可能出现的因素影响,计算机与受控设备之间的 通讯数据常会发生无法预测的错误.为了防止错误所带来的影响,一般在通讯时 采取数据校验的办法,而循环冗余码校验是最常用的校验方法之一.在实际使用 的各种现场总线协议中,数据帧的校验一般都采用这种检验方式. 一. 循环冗余码校验原理 循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC.它是利 用除法及余

CRC校验程序1:CRC循环冗余校验码计算

CRC全称Cyclic Redundancy Check,中文称为循环冗余检查.它是一种数据传输检错的机制,能够对数据进行多项式计算,并将得到的结果与接收设备共享,保证数据传输的正确性和完整性. 算法流程如下: 1. Load a 16-bit register with FFFF hex (all ‘1’s). Call this the CRC register. 2. Exclusive OR the first 8-bit byte of the message with the low

CRC校验方法

1.循环校验码(CRC码): 是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定. 2.生成CRC码的基本原理: 任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应.例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111. 标准CRC生成多项式如下表: 名称          生成多项式              简记式*   标准引用 CRC-4       

CRC校验的实现

[好长时间没更blog了::>_<::] 计算机网络课学习了CRC校(jiao)验的基本原理,不过课上学的那点东西只够做考试题的= =,于是想试试写一个对文件CRC校验的小程序 先来回顾下CRC校验的最基本原理: 核心思想:其实和hash很像...就是mod 设M是源文件,G是校验用的一串数(由CRC标准指定) 首先将M通过加校验变成N,以满足N mod G==0   (其中mod就是课本上那个模二不进位除法) 然后将N通过网络发送出去,在destination收到数据包Q destinati

基于STM32的CRC校验说明

///***************************************************************************** //下面是test.c里面的函数 ///***************************************************************************** ///////////////////////////////////////////////////////////////////////