良许Linux教程网 干货合集 累加和校验算法在嵌入式中的应用

累加和校验算法在嵌入式中的应用

前言

由于外界干扰的存在,电路常常会引起数字信号传输中出现各种差错。

对于许多需要进行数据传输的场合,特别是一些可能影响硬件操作的数据传输(如嵌入式设备、机器人等),错误的数据可能带来潜在的风险,这令人不寒而栗。

作为嵌入式领域的从业者,我主要使用单片机进行开发,但要注意的是,单片机的性能各不相同,很多性能只能说勉强够用,因为成本是一个必须考虑的因素。

因此,我们今天要介绍的是一种简单而有效的校验方法,特别适用于性能一般的硬件。

接下来,我将重点介绍累加和校验算法,也被称为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语言的代码示例。

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

U8 TX_CheckSum(U8 *buf, U8 len) //buf为数组,len为数组长度
{ 
    U8 i, ret = 0;
 
    for (i = 0; i return ret;
}

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

U8 RX_CheckSum(U8 *buf, U8 len) //buf为数组,len为数组长度
{ 
    U8 i, ret = 0;
 
    for (i = 0; i return ret+1;
}

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部