累加和校验算法(CheckSum算法)「建议收藏」

累加和校验算法(CheckSum算法)「建议收藏」因为外界总会对电路存在或多或少的干扰,对于数字信号,很可能导致传输的数据出现千差万别。对于很多需要传输数据的场合,尤其是一些数据可能会影响一些硬件的动作(诸如嵌入式的一些设备、机器人等),错误的数据可能会带来一些隐性风险,想想都可怕。由于本人是嵌入式相关领域的,平时玩的都是单片机,当然单片机的性能千差万别,不过很多的性能都只能说是勉强够用,毕竟成本考虑。所以今天的校验说法,比较简单,但是有…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

因为外界总会对电路存在或多或少的干扰,对于数字信号,很可能导致传输的数据出现千差万别。对于很多需要传输数据的场合,尤其是一些数据可能会影响一些硬件的动作(诸如嵌入式的一些设备、机器人等),错误的数据可能会带来一些隐性风险,想想都可怕。

由于本人是嵌入式相关领域的,平时玩的都是单片机,当然单片机的性能千差万别,不过很多的性能都只能说是勉强够用,毕竟成本考虑。

所以今天的校验说法,比较简单,但是有效,尤其是一些性能一般的硬件。

说道今日主角:累加和校验算法,又名CheckSum算法。至于出处,这里就不考究了。

这种算法的实现:

发送方:对要数据累加,得到一个数据和,对和求反,即得到我们的校验值。然后把要发的数据和这个校验值一起发送给接收方。

接收方:对接收的数据(包括校验和)进行累加,然后加1,如果得到0,那么说明数据没有出现传输错误。(注意,此处发送方和接收方用于保存累加结果的类型一定要一致,否则加1就无法实现溢出从而无法得到0,校验就会无效)

还是举个例子:

发送方:要发送0xA8,0x50,我们使用unsigned char(8位)来保存累加和,即为0xF8(0b11111000),取反得到校验和为0x07(0b00000111)。然后将这三个数据发送出去。

接收方:如果接收正确,这三个数据的累加和就是(0b11111111),此时加1,则得到的结果为0(实际得到的应该是0b100000000,但是由于是使用unsigned char(8位)来保存累加和,所以高位被截取掉,只剩下了低八位的8个0).

由上面的例子,我们可以知道算法的目的是:使累加和和校验值相加得到一个二进制下每一位都是1的结果,这个结果很明显很好处理,这种算法实现起来也很简单,下面给出C语言的代码示例。

发送方:以下是如何得到校验值的代码,结果就是我们想要的校验值。

uint8_t TX_CheckSum(uint8_t *buf, uint8_t len) //buf为数组,len为数组长度
{ 
    uint8_t i, ret = 0;

    for(i=0; i<len; i++)
    {
        ret += *(buf++);
    }
     ret = ~ret;
    return ret;
}

Jetbrains全家桶1年46,售后保障稳定

接收方:输入已包含发送发发来的校验值,如果函数返回的值如果是0,说明数据正确。

uint8_t RX_CheckSum(uint8_t *buf, uint8_t len) //buf为数组,len为数组长度
{ 
    uint8_t i, ret = 0;

    for(i=0; i<len; i++)
    {
        ret += *(buf++);
    }
     ret = ret;
    return ret+1;
}

更多精彩内容,请关注公众号《嵌入式小散修》。
累加和校验算法(CheckSum算法)「建议收藏」

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210067.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • android错误之MediaPlayer用法的Media Player called in state *「建议收藏」

    用到Media Player,遇到几个问题,记一下用法就不说了,使用的时候最好参考一下mediaPlayer的这张图第一个错误是Media Player called in state 8这个是因为在调用start之前没有prepare,因为我是用了mediaPlayer = MediaPlayer.create(context, R.raw.notice);去初始化的播放器,这个接口说明只要成功

    2022年3月11日
    42
  • LoadRunner11完美激活成功教程「建议收藏」

    LoadRunner11完美激活成功教程「建议收藏」今天装完LoadRunner后,发现怎么都启动不了,最后找了很久的注册码global-100:AEAMAUIK-YAFEKEKJJKEEA-BCJGIweb-10000:AEABEXFR-YTIEKEKJJMFKEKEKWBRAUNQJU-KBYGB很管用了!

    2022年7月22日
    8
  • Linux vim退出命令(保存与不保存)「建议收藏」

    Linux vim退出命令(保存与不保存)「建议收藏」按ESC键跳到命令模式,然后输入::w-保存文件,不退出vim:wfile-将修改另外保存到file中,不退出vim:w!-强制保存,不退出vim:wq-保存文件,退出vim:wq!-强制保存文件,退出vim:q-不保存文件,退出vim:q!-不保存文件,强制退出vim:e!-放弃所有修改,从上次保存文件开始再编辑…

    2022年6月14日
    128
  • python merge函数_pandas replace函数

    python merge函数_pandas replace函数在pandas中如果我们想将两个表格按照某一主键合并,我们需要用到merge函数。pd.merge(dataframe_1,dataframe_2,how=”inner”)参数how有四个选项,分别是:inner、outer、left、right。inner是merge函数的默认参数,意思是将dataframe_1和dataframe_2两表中主键一致的行保留下来,然后合并列。outer是相对于inner来说的,outer不会仅仅保留主键一致的行,还会将不一致的部分填充Nan然后保留下来。

    2022年10月23日
    0
  • 2018手机号码正则表达式

    2018手机号码正则表达式最近发现各大手机运营商又增加了新的号码段,在项目中的判断手机号码的正则表达不能用了,自己搜集了一下,新写了一个正则表达式,希望有帮助。 匹配手机号码的正则表达式: ^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199|(147))\\d{8}$ /***判断是否是手机号**@pa…

    2022年6月3日
    34
  • mac笔记本卡顿怎么办_电脑卡顿不流畅怎么办

    mac笔记本卡顿怎么办_电脑卡顿不流畅怎么办打开活动监视器,(启动台–其他–活动监测器),可以看到耗CPU,内存的具体应用都有哪些。如果能查到就往这方面去停止运行。一般都是图形的操作特别耗内存,可以关闭adboe的一些配置。我出现问题是安装了PS,他的adobe监听实时更新耗了系统70%内存。……

    2022年9月4日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号