最近在摄像头采集的数据清晰度上需要加强,则在每一帧传输的数据包后边加了CRC校验和。CRC校验和有16位的,也有32位的。至于CRC校验和算法原理,我是在百度上学习的,其实网上有很多这种资料。简单的说就是CRC校验和就是将一段二进制数据进行加密(乘以一个多项式),然后得到一个校验码。将这个校验码添加在这段二进制数据后边就行了。然后接收方在接收到数据之后,再对这个校验码进行解码。

下面我就将今天的demo代码简单的注释一下:

在发送方的buffer[22]中,前二十个数据为要发送的数据,而后两位即buffer[20]和buffer[21]中的数据就是函数int CalCrc(int crc, const char *buf, int len)产生的CRC校验和。代码如下:

int main()
{
    ] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x01, 0x02, 0x03, 0x04};
    , buffer, );//crc为16位校验码
    buffer[] = (char)crc;//取校验码低八位
    buffer[] = ();//取校验码高八位
}

在接收方,将接收到的buffer[22]中的所有数据带入函数int CalCrc(int crc, const char *buf, int len)中进行计算,若返回值为0,则说明接收的数据是正确无误的。其实在操作工程中可以使用网络抓包软件进行监控和验证。

, buffer, );
)
{
  printf("数据传输正确");
}

整个demo的代码如下:

int CalCrc(int crc, const char *buf, int len)
{
    unsigned int byte;
    unsigned char k;
    unsigned short ACC,TOPBIT;
//    unsigned short remainder = 0x0000;
    unsigned short remainder = crc;
    TOPBIT = 0x8000;
    ; byte < len; ++byte)
    {
        ACC = buf[byte];
        remainder ^= (ACC <<);
        ; k > ; --k)
        {
            if (remainder & TOPBIT)
            {
                remainder = (remainder << ) ^0x8005;
            }
            else
            {
                remainder = (remainder << );
            }
        }
    }
    remainder=remainder^0x0000;
    return remainder;
}
int main(int argc, _TCHAR* argv[])
{
    ] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x01, 0x02, 0x03, 0x04};
    , buffer, );//计算得到的16位CRC校验码
    buffer[] = (char)crc;//取校验码的低八位
    buffer[] = ();//取校验码的高八位
//接收方在接收到buffer中的数据时,代入CalCrc进行计算,若result的值为0,则说明数据传输过程无误
    , buffer, );
    ;
}

c语言实现CRC校验和的更多相关文章

  1. CRC校验的问题(c语言实现CRC校验和)

    1. 前面的数 7A 01 00,计算的结果是0X4920 2. 那么把数据CRC加上 3. 测试代码,计算出来的结果对不上,什么情况?可是我把参考模型的全部都选了一遍,也对不上其中一个!!! 4.  ...

  2. 求CRC校验和的低位和高位的两种方式

    方式1 unsigned ; // 校验和 ]; memcpy(tstCRCChecksum,&shrCRCCheckSum,); // shrCRCCheckSum:216D LOGI(]) ...

  3. CRC校验和网络通信中writen、readn函数

    1.对网络传输的数据进行CRC32校验. #include <stdint.h> #include <stdio.h> #include <string.h> st ...

  4. CRC、反码求和校验 原理分析

    3月份开始从客户端转后台,算是幸运的进入全栈工程师的修炼阶段.这段时间一边是老项目的客户端加服务器两边的维护和交接,一边是新项目加加加班赶工,期间最长经历了连续工作三天只睡了四五个小时的煎熬,人生也算 ...

  5. 千兆网数据CRC检验和过滤

    项目简述 本次项目在计算机将图像数据信息通过千兆网发送给FPGA后,由于接收到的数据可能混乱和无效,需要对数据CRC校验和无效包过滤. 项目原理及框图 对iddr_ctrl模块的输入数据和使能信号,分 ...

  6. [转]Patch文件结构详解

    N久不来 于是不知道扔在哪儿于是放这里先 如果你觉得碍事的话 帮我扔到合适的版块去.. 导读这是一篇说明文 它介绍了标准冒险岛更新文件(*.patch;*.exe)的格式文章的最后附了一段C#的参考代 ...

  7. 模拟Modbus协议问题

    问题: 在嵌入式系统开发中,Modbus协议是工业控制系统中广泛应用的一种协议.本题用来简单模拟Modbus协议,只需根据条件生成符合该协议的数据帧,并解析所获取的数据.假设设备使用的协议发送数据格式 ...

  8. python模块介绍- binascii 二进制和ASCII转换

    python模块介绍-binascii二进制和ASCII转换 目录 项目简介 简介: Uu编码 Binhex编码 Base64编码 QP码 CRC校验和 二进制转换 其他实例 项目简介 Python中 ...

  9. uIP中国的协议文件:Ch01

    uIP0.9 参考 by Doxygen 1.3.3 Tue Oct 7 15:51:00 2003 译: fishOnFly(鱼在飞) uIP-refman中文pdf下载 第1章  uIP TCP/ ...

随机推荐

  1. (转) Parameter estimation for text analysis 暨LDA学习小结

    Reading Note : Parameter estimation for text analysis 暨LDA学习小结 原文:http://www.xperseverance.net/blogs ...

  2. BZOJ5251:[九省联考2018]劈配——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5251 https://loj.ac/problem/2477  <-可以看数据 https: ...

  3. YBT 5.1 区间类动态规划

    题解在代码中 石子合并[loj 10147] /* dp[i][j]=max or min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]) i<=k& ...

  4. 我们自己写的solr查询的代码作为search项目中的dao

    我们自己写的solr查询的代码作为search项目中的dao,但是启动时会报错: 其实就是说 searchServiceImpl 中我们 Autowired 的 SearchDao 类 spring ...

  5. XML 树结构,语法规则,元素,属性,验证及其解析

    XML 文档形成了一种树结构,它从"根部"开始,然后扩展到"枝叶". 一个 XML 文档实例 XML 文档使用简单的具有自我描述性的语法: <?xml v ...

  6. Codeforces Round #344 (Div. 2) B

    B. Print Check time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  7. C#学习之泛型继承和静态成员

    想要理解这里有必要先将泛型类学习充分.这里讲解的是泛型类继承类的类型和静态成员. 在前面C#学习之泛型中,创建的LinkList<T>类实现了IEnumerable<T>接口. ...

  8. lightoj 1341

    lightoj 1341  Aladdin and the Flying Carpet 链接:http://lightoj.com/volume_showproblem.php?problem=134 ...

  9. FreeRTOS - 中断使用注意

    原文地址:http://www.cnblogs.com/god-of-death/p/6886823.html 注意点: 1.首先要将中断的嵌套全部设置为抢占优先级. 2.将freertos系统内核中 ...

  10. linux 命令后台运行(转载)

    原文连接:https://www.cnblogs.com/lwm-1988/archive/2011/08/20/2147299.html 有两种方式: 1. command & : 后台运行 ...