校验和checksum和CRC校验的简便算法

2020-09-17  本文已影响0人  刘小白DOER

    最近写串口编程真是写臭了,写的有点恶心。一是确实设备好多都是串口,484居多。二是觉得有些设备厂家的协议太累赘,单是看它的协议资料都要很久,中间还要转换ascii码等等。笔者目前见过的串口协议列举如下,从复杂(恶心)程度排列。

1、某大型空调厂家的485协议。设备默认地址4,一改地址就通信故障,空调直接用不了!那好吧,我默认你的地址,改波特率和其他设备串起来组成总线。NO,没有修改波特率的命令,不给你修改。而且还有头部校验Lcheck、中间命令转ascii码。

2、某导航设备的232协议。一本协议书翻下来,居然不知道怎么发送命令,也不知道按什么格式解析,最后只有通过自带蹩脚的软件抓包才发现原来命令是这样,协议解析格式还是从那个软件的配置里面找到的。所有一本协议书是有什么用吗!而且按照协议还需要自己串口命令完成握手,还需要单字节06确认等等。最烦的是,协议是crc校验,按照正常的算法居然算不准确,按照它给的算法all the same。命令中间部分也需要转ascii码,虽然协议分析比较难,但是相对于直接把路堵死的某空调协议,还是略输一筹!

3、某发电机厂家的485协议,其实这个是第一次写的程序,但是让人不爽的是寄存器地址列好给你,只在很隐秘的地方告诉你,寄存器地址要减1,因为是从0开始的。看你协议的人谁不知道地址是从0开始的,你非要编成1开始,还要自己减1 ,可麻烦了我好久。

    当然,除了某空调外,其他都是体力活,费屁股。设备协议除了自家定义的外,大部分工控协议是modbus,校验码大多是CRC和校验和。本文就用labview来展示一下怎么简便的算出校验和checksum以及CRC校验。

校验和checksum

    精髓就是转U16,只保留低16位的数据,逻辑简单,贴合校验和原理,可以省下很多代码。校验和笔者见过的的场所是网络中数据帧、空调协议、充电机协议。

和校验算法

CRC循环冗余校验

    利用公式节点来计算,避免labview的数据线混乱。原理部分就不说了,网上一大堆,笔者给出的是自己一直使用的crc。CRC校验笔记见过的有发电机设备协议、传感器协议、电源协议(电总协议)、雷达协议、服务器串口协议、UPS协议。

上一篇下一篇

猜你喜欢

热点阅读