前言 因为外界总会对电路存在或多或少的干扰,对于数字信号,很可能导致传输的数据出现千差万别。 对于很多需要传输数据的场合,尤其是一些数据可能会影响一些硬件的动作(诸如嵌入式的一些设备、机器人等),错误的数据可能会带来一些隐性风险,想想都可怕。 由于本人是嵌入式相关领域的,平时玩的都是单片机,当然单片机的性能千差万别,不过很多的性能都只能说是勉强够用,毕竟成本考虑。 所以今天的校验算法,比较简单,但是有效,尤其是一些性能一般的硬件。 说道今日主角:累加和校验算法,又名CheckSum算法。至于出处,这里就不考究了。 累加和校验算法的实现发送方: 对要数据累加,得到一个数据和,对和求反,即得到我们的校验值。然后把要发的数据和这个校验值一起发送给接收方。 接收方: 对接收的数据(包括校验和)进行累加,然后加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 < len; i++) { ret += *(buf++); } ret = ~ret; return ret; } 接收方:输入已包含发送发发来的校验值,如果函数返回的值如果是0,说明数据正确。 U8 RX_CheckSum(U8 *buf, U8 len) //buf为数组,len为数组长度{ U8 i, ret = 0; for (i = 0; i < len; i++) { ret += *(buf++); } ret = ret; return ret+1; } |
各位朋友,有没有STM32F0系列教程,最好是汇编语言的。
一种基于STM32 指定串口 自定义printf 的方法
官方列表中STM32F1系列单片机支持FOC的双电机控制的SDK是哪个版本。
ARM汇编教程或者文档推荐
1.STMCWB 最新版本是否支持绝对值编码器?只能通过MCLIB库手动增加吗?2.基于ST FOC库的磁编码器(SPI出绝对角度信息)只跑速度环和电流环最简单
STM32_ImageProcessingLibrary中有类似于opencv中的findContours函数吗?
STM32H750自带的SPI BootLoader烧录疑问
我用ST MCU 做的电机控制器,大家多交流交流
有没有官方,面向OV系列摄像头的驱动?
广州招募嵌入式软件工程师。