精华内容
下载资源
问答
  • CRC校验码计算方法.pdf

    2019-09-17 23:56:41
    CRC校验码计算方法pdf,CRC校验码计算方法
  • 模2除法(CRC校验码计算)

    万次阅读 多人点赞 2018-09-10 17:53:30
    鉴于网上的讲解自己好不容易才看懂…所以自己整理了一下, 也方便大家能够理解 如果有不对或者不准确的地方,恳请大家指出... 模2加减法 模2除法需要用到模2加减法,关于模2加减法,其实就是异或操作,...计算如下: ...

    鉴于网上的讲解自己好不容易才看懂…所以整理了一下, 也方便大家能够理解

    模2加减法

    模2除法需要用到模2加减法,关于模2加减法,其实就是异或操作,规则如下:

    //不需要考虑进位和借位
    0 ± 0 = 0
    1 ± 1 = 0
    0 ± 1 = 1
    1 ± 0 = 1: 1101 ± 1001 = 0100
    计算如下:
    		  1 1 0 1 
    		± 1 0 0 1 
    		-----------
    		  0 1 0 0
    

    简记:同为0,异为1


    模2除法:

    规则:假设被除数X,和除数P,余数R

    1. X除以P(对X和P做模2加减法),当前X首位为1时,商1,为0时商0

    2. 所得余数R去除首位(即左移一位):

      若R第一位为0,将其作为新的被除数,除以0,此时其首位为0,商即为0
      若R第一位为1,将其作为新的被除数,除以P,此时其首位为1,商即为1

    3. 重复第2步直到R位数少于P位数


    例:1111000对除数1101做模2除法:

    先说结果: 商1011111

    整体运算

          1 0 1 1     //商
    ---------------
    1 1 1 1 0 0 0     //被除数,注意首位为1
    1 1 0 1	          //被除数首位为1,除以除数
    ---------------
      0 1 0 0 0 0     //余数去除首位,作为新的被除数
      0 0 0 0         //被除数首位为0,除以0
    ---------------
        1 0 0 0 0     //余数去除首位,作为新的被除数
        1 1 0 1       //被除数首位为1,除以除数  
    ---------------
          1 0 1 0     //余数去除首位,作为新的被除数
          1 1 0 1     //被除数首位为1,除以除数
    ---------------
            1 1 1     //余数,此时余数位数少于除数,不能继续除了
    

    分步分析

    第一步(每一步其实都是模2加减法运算):
          1         //商
    -------------
    1 1 1 1 0 0 0   //被除数,注意首位为1
    1 1 0 1	        //除数
    -------------
    0 0 1 0 0 0 0   //余数,模2运算后结果
    

    商的第一位:被除数首位为1,商为1(只要被除数首位非0,商就是1)

    第二步:余数去除首位(左移一位),当第一位为0时,除以0;为1时,除以除数。
          1 0        //商
    ---------------
      0 1 0 0 0 0    //余数去除首位,作为新的被除数
      0 0 0 0        //被除数首位为0,除以0
    ---------------
      0 1 0 0 0 0    //余数,模2运算后结果
    

    商的第二位:被除数首位为0,商为0(只要被除数首位是0商就是0)

    第三步
          1 0 1      //商
    ----------------
        1 0 0 0 0    //余数去除首位,作为新的被除数
        1 1 0 1      //被除数首位为1,除以除数
    ----------------
        0 1 0 1 0    //余数,模2运算后结果
    

    商的第三位:被除数首位为1,商为1

    第四步
          1 0 1 1     //商
    ----------------
          1 0 1 0     //余数去除首位,作为新的被除数
          1 1 0 1     //被除数首位为1,除以除数
    ----------------
          0 1 1 1     //余数,此时余数位数(这里的0要忽略掉,不参与下一轮,因为最上面的被除数后面
          			  //没有数可以给这里往后补一位了)少于除数位数,不能继续除了
    

    商的第四位:被除数首位为1,商为1
    此时不能继续做除法,计算结束

    得到最终结果: 商1011111
    展开全文
  • MODBUS-RTU-CRC校验码计算 MODBUS-RTU-CRC校验码计算 MODBUS-RTU-CRC校验码计算 MODBUS-RTU-CRC校验码计算
  • 本例提供了CRC校验码计算与判断函数,从CRC4到CRC16任意计算,生成多项式由一个整数表示,可以自由定制。
  • CRC校验码计算公式

    千次阅读 2018-12-07 10:22:07
    CRC校验码计算公式 int CRC_Check(char *m_Data,short m_Size) { int i0,i1; char CRC16Lo,CRC16Hi; //CRC寄存器 char SaveHi,SaveLo; CRC16Lo = 0xFF; CRC16Hi = 0XFF; for(i0=0;i0<m_Size;i0++...

    CRC校验码计算公式
    int CRC_Check(char *m_Data,short m_Size)
    {
    int i0,i1;
    char CRC16Lo,CRC16Hi; //CRC寄存器
    char SaveHi,SaveLo;
    CRC16Lo = 0xFF;
    CRC16Hi = 0XFF;
    for(i0=0;i0<m_Size;i0++)
    {
    CRC16Lo = CRC16Lo ^ *(m_Data+i0); //每一个数据与CRC寄存器进行异或
    for(i1=0;i1<8;i1++)
    {
    SaveHi = CRC16Hi;
    SaveLo = CRC16Lo;
    CRC16Hi >>=1; //高位右移一位
    CRC16Lo >>=1; //低位右移一位
    if((SaveHi & 1) == 1) //如果高位字节最后一位为1
    {
    CRC16Lo |=0x80; //则低位字节右移后前面补1
    }
    if((SaveLo & 1) == 1) //如果LSB为1,则与多项式码进行异或
    {
    CRC16Hi ^=0XA0;
    CRC16Lo ^=1;
    }
    }
    }
    return ( CRC16Hi << 8 )| CRC16Lo;
    }

    展开全文
  • CRC校验码计算(Modbus) /***** CRC校验码计算公式 *****/ #include "stdafx.h" #include "float.h" #include <iostream> using namespace std; #define uchar unsigned char #define uint unsigned ...

    CRC校验码计算(Modbus)

    #include "StdAfx.h"
    #include "stdafx.h"
    #include "SerialPort.h"  
    #include "core/core.hpp"  
    #include "highgui/highgui.hpp"  
    #include "imgproc/imgproc.hpp"     
    #include "iostream"
    #include <iostream>
    #include <opencv2/opencv.hpp>
    #include <opencv2/nonfree/nonfree.hpp>     
    #include <time.h>
    #include <windows.h>
    #include <math.h>
    
    using namespace std;
    using namespace cv; 
    
    SYSTEMTIME sys_time;	//声明系统时钟
    
    unsigned int CRC16_Modbus(unsigned char *buf, int len)
    {
        unsigned int crc = 0xFFFF;
        for (int pos = 0; pos < len; pos++)
        {
            crc ^= (unsigned int)buf[pos]; // XOR byte into least sig. byte of crc
            for (int i = 8; i != 0; i--)   // Loop over each bit
            {
                if ((crc & 0x0001) != 0)   // If the LSB is set
                {
                    crc >>= 1; // Shift right and XOR 0xA001
                    crc ^= 0xA001;
                }
                else // Else LSB is not set
                {
                    crc >>= 1;    // Just shift right
                }
            }
        }
     
        //高低字节转换
        crc = ((crc & 0x00ff) << 8) | ((crc & 0xff00) >> 8);
        return crc;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	CSerialPort mySerialPort;//首先将之前定义的类实例化
    	int length = 8;//定义传输的长度
    	if (!mySerialPort.InitPort(3, CBR_9600, 'N', 8, 1, EV_RXCHAR))//是否打开串口,3就是你外设连接电脑的com口,可以在设备管理器查看,然后更改这个参数
    	{
    		std::cout << "initPort fail !" << std::endl;
    		//return 0;
    	}
    	else
    	{
    		std::cout << "initPort success !" << std::endl;
    	}
    	
    	unsigned char bytes[8]=		{0x03,0x06,0x00,0x00,0x00,0x01,0x49,0xE8};
    	bytes[0] = 0x03;
    	bytes[1] = 0x06;
    	bytes[2] = 0x00;
    	bytes[3] = 0x07;
    	double w = 1280;
    	double phy = 60;
    	double time0 = static_cast<double>(getTickCount());//开始计时
    	float a = 180.0*atan2(50*tan(phy*3.1415926/360),w/2)/3.1415926;		//对边比临边
    	time0 = ((double)getTickCount()-time0)/getTickFrequency();
        std::cout<<"                      耗时:  "<<time0<<"S"<<endl;
    	bytes[4] = 0x00;
    	bytes[5] = a*1000/360;
    	auto crc = CRC16_Modbus(bytes,6);
    	bytes[6] = crc >> 8;
    	bytes[7] = crc & 0xff;
    	printf("%02x\n",bytes[4]);	
    	printf("%02x\n",bytes[7]);
    	//
    	unsigned char forward3[]=		{0x03,0x06,0x00,0x00,0x00,0x01,0x49,0xE8};
    	unsigned char reverse3[]=		{0x03,0x06,0x00,0x01,0x00,0x01,0x18,0x28};
    	unsigned char stop3[]=		{0x03,0x06,0x00,0x02,0x00,0x01,0xE8,0x28};
    	unsigned char forward2[]=		{0x02,0x06,0x00,0x00,0x00,0x01,0x48,0x39};
    	unsigned char reverse2[]=		{0x02,0x06,0x00,0x01,0x00,0x01,0x19,0xF9};
    	unsigned char stop2[]=		{0x02,0x06,0x00,0x02,0x00,0x01,0xE9,0xF9};
    	//
    	unsigned char check_speed[]=		{0x01,0x03,0x00,0x05,0x00,0x01,0x94,0x0B};
    	unsigned char check_pulse_num[]=		{0x01,0x03,0x00,0x07,0x00,0x01,0x35,0xCB};
    	unsigned char count[]=		{0x01,0x03,0x00,0x04,0x00,0x01,0xC5,0xCB};
    	//
    	unsigned char set_speed[]=		{0x01,0x06,0x00,0x05,0x00,0xFF,0xD9,0x8B};
    
    	unsigned char set_pulse_num[]=		{0x02,0x06,0x00,0x07,0x00,0x00,0x38,0x38};
    	unsigned char set_pulse_250[]=		{0x02,0x06,0x00,0x07,0x00,0xFA,0xB8,0x7B};
    	unsigned char set_pulse_83[]=		{0x03,0x06,0x00,0x07,0x00,0x53,0x97,0xD4};
    	unsigned char set_pulse_166[]=		{0x03,0x06,0x00,0x07,0x00,0xA6,0xB9,0x93};
    
    	unsigned char set_count[]=		{0x01,0x06,0x00,0x04,0x00,0x00,0xC8,0x0B};
    	
    	cout<<bytes<<endl;
    	cout<<a<<endl;
    
    	//cout << mySerialPort.WriteData(forward2, length) << endl;//这个函数就是给串口发送数据的函数,temp就是要发送的数组。
    	//Sleep(1000);
    	//cout << mySerialPort.WriteData(stop2, length) << endl;//这个函数就是给串口发送数据的函数,temp就是要发送的数组。
    	//Sleep(20);
    	//cout << mySerialPort.WriteData(reverse2, length) << endl;//这个函数就是给串口发送数据的函数,temp就是要发送的数组。
    	//Sleep(1000);
    	//cout << mySerialPort.WriteData(stop2, length) << endl;//这个函数就是给串口发送数据的函数,temp就是要发送的数组。
    	//Sleep(20);
    	//cout << mySerialPort.WriteData(forward2, length) << endl;//这个函数就是给串口发送数据的函数,temp就是要发送的数组。
    	//Sleep(1000);
    	//cout << mySerialPort.WriteData(stop2, length) << endl;//这个函数就是给串口发送数据的函数,temp就是要发送的数组。
    	//Sleep(20);
    	//cout << mySerialPort.WriteData(reverse2, length) << endl;//这个函数就是给串口发送数据的函数,temp就是要发送的数组。
    	//Sleep(1000);
    	//cout << mySerialPort.WriteData(stop2, length) << endl;//这个函数就是给串口发送数据的函数,temp就是要发送的数组。
    	//Sleep(15);
    	//cout << mySerialPort.WriteData(reverse2, length) << endl;//这个函数就是给串口发送数据的函数,temp就是要发送的数组。
    	//Sleep(1000);
    	//cout << mySerialPort.WriteData(stop2, length) << endl;//这个函数就是给串口发送数据的函数,temp就是要发送的数组。
    	//Sleep(20);
    	//cout << mySerialPort.WriteData(forward2, length) << endl;//这个函数就是给串口发送数据的函数,temp就是要发送的数组。
    	//Sleep(1000);
    	//cout << mySerialPort.WriteData(stop2, length) << endl;//这个函数就是给串口发送数据的函数,temp就是要发送的数组。
    	
    	system("pause");
    	return 0;
    }
    
    展开全文
  • CRC校验码计算过程

    2021-05-19 17:13:10
    namespace CRC { class Program { static void Main(string[] args) { byte[] date = { 0x01, 0x05, 0x00, 0x... //要计算CRC校验的数据 byte[] crc = new byte[2]; //用来保存CRC效验 crc = GetCRC(date)...

    namespace CRC
    {
        class Program
        {
            static void Main(string[] args)
            {
                byte[] date = { 0x01, 0x05, 0x00, 0x00, 0xFF, 0x00 };   //要计算CRC校验的数据
                byte[] crc = new byte[2];    //用来保存CRC效验码
                crc = GetCRC(date);         //得到data的CRC码
                foreach (var item in crc)   
                {
                    Console.Write(item.ToString("X2") + "  ");    //打印出CRC码
                }
                Console.WriteLine();
                Console.ReadKey();
            }


            public static byte[] GetCRC(byte[] byteData)   //计算CRC校验的数据方法
            {
                byte[] CRC = new byte[2];

                UInt16 wCrc = 0xFFFF;
                for (int i = 0; i < byteData.Length; i++)
                {
                    wCrc ^= Convert.ToUInt16(byteData[i]);
                    for (int j = 0; j < 8; j++)
                    {
                        if ((wCrc & 0x0001) == 1)
                        {
                            wCrc >>= 1;
                            wCrc ^= 0xA001;    //异或多项式
                        }
                        else
                        {
                            wCrc >>= 1;
                        }
                    }
                }

                CRC[1] = (byte)((wCrc & 0xFF00) >> 8);    //高位在后
                CRC[0] = (byte)(wCrc & 0x00FF);               //低位在前
                return CRC;

            }
        }
    }

    展开全文
  • C#串口通讯CRC校验码计算
  • 1.CRC-16/MODBUS(最通用) 2.CRC-16/CCITT-FALSE 支持以上CRC校验计算方式(分查表法和计算法),原代码可执行,能正确输出结果。需要的朋友可以直接 引用到自己项目中。谢谢支持。
  • CRC校验码计算小工具

    2017-04-18 00:30:26
    *本程序是为MODBUS协议而写的,所以最后是两位CRC检验,高位在后,低位在前。 *使用十分的方便。
  • CRC校验码计算工具

    2009-05-30 13:41:30
    本人做的CRC校验工具,本为自己调试MODBUS现场总线用,现发上来和大家分享下。
  • MATLAB CRC校验码计算

    热门讨论 2009-12-08 21:12:23
    输入校验多项式和二进制信号,输出校验码,其实编写很简单
  • CRC计算时只用8个数据位,起始位及停止位,如有奇偶校验位也包括奇偶校验位,都不参与CRC计算CRC计算方法是: 1、加载一值为0XFFFF的16位寄存器,此寄存器为CRC寄存器。 2、把第一个8位二进制数据(即通讯...
  • 【Modbus】 RTU CRC校验码计算方法

    万次阅读 2017-08-09 14:38:29
    附:Modbus RTU CRC校验码计算方法 在CRC计算时只用8个数据位, 起始位及停止位,如有奇偶校验位也包括奇偶校验位 ,都不参与CRC计算。 CRC计算方法是: 1、  加载一值为0XFFFF的16位...
  • 模2加减法 (按位异或操作,相同则0,不同则1) 0 ± 0 = 0 1 ± 1 = 0 0 ± 1 = 1 1 ± 0 = 1 例子:1011 ± 1000 计算过程: 1 0 1 1 ± 1 0 0 0 ------------ 0 0 1 1 结果:1011 ± 1000 = 0011 模2除法: 跟...
  • 用软件实现 CRC 校验码计算很难满足高速数据通信的要求 ,基于硬件的实现方法中 ,有串行经典算法 LFSR 电路 以及由软件算法推导出来的其它各种并行计算方法。以经典的LFSR 电路为基础 ,研究了按字节并行计算 CRC 校验...
  • 鉴于网上的讲解自己好不容易才看懂…所以整理了一下, 也方便大家能够理解 模2加减法 模2除法需要用到模2加减法,关于模2加减法,其实就是异或操作,规则如下: ...计算如下: 1 1 0 1 ± 1 0 0 1 -...
  • CRC校验码计算器

    2017-03-19 20:22:38
    CRC校验码计算工具(8位,16位,32位均可计算)
  • CRC16校验码计算工具

    2018-01-07 18:16:51
    做串口通讯时经常计算CRC校验码,有了这个小公举,调试非常方便
  • CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据...CRC校验码计算过程: 1,先约定
  • CRC校验码计算

    千次阅读 2020-01-10 12:59:27
    在发送端,先把数据划分为组,假定每组k个比特,假定一个待传送的数据M(k位),CRC运算就是在数据M的后面添加供差错检测用的n位冗余,然后构成一个帧发送出去,一共发送(k+1)位。在所要发送的数据后面增加n位的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,118
精华内容 447
关键字:

crc校验码计算