CRC16循环冗余校验 RTU-MODBUS标准 Linux C

1、概述

CRC16循环冗余校验常用在MODBUS协议中,用于校验报文的完整性。CRC16校验值为uint16_t 无符号整形2字节,在MODBUS协议中,低检验字节在前,高校验字节在后,比如校验结果crc16=0x1788,则MODBUS中的校验顺序为 ...0x88 0x17。

以下为自己写的linux C 代码,可以直接用。

2、C程序

/*******************************************************************************
_____ ___ ____  ___   _____    _             _   _             
| ____|_ _|  _ \|_ _| |_   _|__(_)_ __   __ _| | | |_   _  __ _ 
|  _|  | || |_) || |    | |/ __| | '_ \ / _` | |_| | | | |/ _` |
| |___ | ||  _ < | |    | |\__ \ | | | | (_| |  _  | |_| | (_| |
|_____|___|_| \_\___|   |_||___/_|_| |_|\__, |_| |_|\__,_|\__,_|* File Name          : main.c* Description        : This file provides code for crc16 caculation in linuxc.* Author             : jackwang by jiawang16@foxmail.com* Date               : 2018-07-15
*******************************************************************************/
/*! -------------------------------------------------------------------------- */
/*! Include headers */
#include <stdio.h>
#include <string.h>
#include <stdbool.h>/*! -------------------------------------------------------------------------- */
/*! Private function declarations */
static unsigned char Char2Int(char chr,bool *isOK);/*! convert char to int type*/
static unsigned char HexStr2Int(char *str, bool *isOK);/*!convert hexstr to int*/
/*! caculate crc16 of buff-input:arr_buff and length: len */
static unsigned short GenerateCRC16(unsigned char *arr_buff, unsigned short len);/*! -------------------------------------------------------------------------- */
/*! main function defination */
int main(int argc, char* argv[])
{/*! variable define */int ret = 0;int numByte = argc; unsigned char bccVal = 0x00;char inPutbuff[10];unsigned char databuff[1000];unsigned short buffsize = 0;unsigned short crcVal;bool isOK;int Nibb;if(argc == 1){printf("[note]  no params to caculate, please input hex string,splite by space!\r\n");}else{printf("[note]  input %d byte: ",numByte-1);for(int i = 1; i < numByte; i++){printf("%s ",argv[i]);}printf("\r\n");for(int i = 1; i < numByte; i++){memcpy(inPutbuff,argv[i],2);Nibb = HexStr2Int(inPutbuff,&isOK);if(isOK){databuff[i-1] = Nibb;buffsize++;}}crcVal = GenerateCRC16(databuff,buffsize);printf("[note]  crc16 value: 0x%04X\r\n",crcVal);}return 0;
}/*! -------------------------------------------------------------------------- */
/*! Private function definations */
/*! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
static unsigned char Char2Int(char chr,bool *isOK)
{unsigned char nibb1;if(chr >= '0' && chr <= '9'){ nibb1 = chr - '0'; *isOK = true;}else if(chr >= 'a' && chr <= 'f'){ nibb1 = chr - 'a' + 10; *isOK = true;}else if(chr >= 'A' && chr <= 'F'){ nibb1 = chr -'A' + 10; *isOK = true; }else{  printf("[error]  invalid hex str input: %c \r\n",chr); *isOK = false; }return nibb1;
}/*! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
static unsigned char HexStr2Int(char *str, bool *isOK)
{unsigned char nibb1,nibb2;bool isOK1,isOK2;nibb1 = Char2Int(*str, &isOK1);nibb2 = Char2Int(*(str+1),&isOK2);if(isOK1 && isOK2){*isOK = true;return nibb1*16 + nibb2;}else{*isOK = false;return 0;}
} /*! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
static unsigned short GenerateCRC16(unsigned char *arr_buff, unsigned short len)
{unsigned short crc=0xFFFF;unsigned char i, j;for ( j=0; j < len;j++){crc=crc ^*arr_buff++;for ( i=0; i<8; i++) {if( ( crc&0x0001) >0){crc=crc>>1;crc=crc^ 0xa001;}else{ crc=crc>>1;}}}return crc;
}

3、编译

~$ gcc main.c -o getcrc16

4、使用

 
~$ ./getcrc16 01 03 00 04 00 04
~$ [note]  input 6 byte: 01 03 00 04 00 04
~$ [note]  crc16 value: 0xC805

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404951.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第11章 路由器OSPF动态路由配置

实验目标&#xff1a; 一、掌握OSPF协议的配置方法&#xff1b; 二、掌握查看通过动态路由协议OSPF学习产生的路由信息&#xff1b; 三、熟悉广域网线缆连接方式&#xff1b; 技术原理&#xff1a; OSFP开放式最短路径优先协议&#xff0c;是目前网络中最广泛的路由协议之一。属…

Hi3515的开发板 Hi3515 SDK编译出错 提示缺少libpciv.a的解决办法

From: http://zyd87818.blog.163.com/blog/static/17488150120124300261687/ 这是HI3515说明文档的说明 但是我进去编译却通不过&#xff0c;提示错误如下 通过qq群里的好人帮助解决方法如下首先看一下makefile自己看不懂&#xff0c;经高人指点需要修改Makefile.param文件…

[react] React为什么要搞一个Hooks?

[react] React为什么要搞一个Hooks&#xff1f; 动机 Hook 解决了我们五年来编写和维护成千上万的组件时遇到的各种各样看起来不相关的问题。无论你正在学习 React&#xff0c;或每天使用&#xff0c;或者更愿尝试另一个和 React 有相似组件模型的框架&#xff0c;你都可能对这…

有关Botton的用法(二)

关于设置listener监听onClicked事件的步骤分析 Steps: 1.tell android you are interested in listening to a button click 2.bring your xml button inside java 3.tell your java button whose responding when its clicked 4.what should happen when button is clicked 1 …

poj1222

题意&#xff1a;一个01矩阵&#xff0c;表示灯的亮灭状态&#xff0c;每次操作可以改变一个十字形状内的五个灯的状态。问能否将所有灯熄灭。 分析&#xff1a;高斯消元法 对于每个灯的两灭有影响的开关就是它附近十字形内的五个开关。所以对于每个灯可以列一个方程&#xff0…

[react] React Hooks帮我们解决了哪些问题?

[react] React Hooks帮我们解决了哪些问题&#xff1f; React hooks help use get rid of js class and all trouble with this pointer. 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌…

李秋红130705010066

3-9、没有冗余度的信源还能不能压缩&#xff1f;为什么&#xff1f; 解答&#xff1a;可以压缩。这种情况下&#xff0c;不能使用无损压缩&#xff0c;但可以使用有损压缩。 3-10、不相关的信源还能不能压缩&#xff1f;为什么&#xff1f; 解答&#xff1a;可以压缩。对于不相…

iphone开发我的新浪微博客户端-用户登录准备篇(1.1)

首先说一下我这个的实现思路&#xff0c;登录支持多个账号&#xff0c;也就是说可以保存多个微博账号登录的时候选择其中一个登录。多个账号信息保存在sqlite的数据库中&#xff0c; 每一个账号信息就是一条记录, 当用户启动微博客户端的时候去取保存在sqlite数据库中的账号记录…

基于密度的异常值检测方法整理

基于密度的异常值检测方法的原理认为正常样本点所处的类簇密度要高于异常点样本所处的类簇密度。为解决实际异常值检测情况 中出现的问题&#xff0c;有一种基于局部异常因子 LOF 方法。

[react] 有在项目中使用过Antd吗?说说它的好处

[react] 有在项目中使用过Antd吗&#xff1f;说说它的好处 They gave every user a big surprise on Christmas Holiday. 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端…

TCP的流模式与UDP的报文模式对比

1 案例背景 在学习TCP-IP协议详解卷一时&#xff0c;读到介绍TCP协议的部分&#xff0c;发现TCP的首部是没有报文总长度字段的&#xff0c;而在UDP中是有的&#xff0c;对这个问题的思考引出了两者之间的区别。 2 案例分析 TCP报文的格式&#xff1a; TCP首部的格式&a…

GWT 入门介绍

From: http://blog.csdn.net/struts2/article/details/1758122 GWT 入门介绍 GWT使用JSON格式的数据通讯 GWT是 Google Web Toolkit的简称。 GWT是一个以Java语言为工具&#xff0c;以类似Swing的方式编写UI组件&#xff0c;之后通过GWT Compiler编译 为JavaScritp和HTM…

SQL Server 2008空间数据应用系列十一:Bing Maps中呈现GeoRSS订阅的空间数据

友情提示&#xff0c;您阅读本篇博文的先决条件如下&#xff1a; 1、本文示例基于Microsoft SQL Server 2008 R2调测。 2、具备 Transact-SQL 编程经验和使用 SQL Server Management Studio 的经验。 3、熟悉或了解Microsoft SQL Server 2008中的空间数据类型。 4、具备相应&am…

聚类算法的分类整理

1、基于划分的聚类算法 基于划分的聚类算法 主要通过聚类中心的迭代重置&#xff0c;直到达到“簇内点足够近&#xff0c;簇间点足够远”的目标效果&#xff0c;完成样本集的最优化分。其算法优点是时间、空间复杂度低&#xff0c;可以处理大规模数据集。缺点包括容易陷入局部…

[react] 为什么标签里的for要写成htmlFor呢?

[react] 为什么标签里的for要写成htmlFor呢&#xff1f; 为了区别和html自身标签中属性 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

minGW64安装和使用 极简教程

1、下载minGW64 官网下载&#xff1a;https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/我的FTP&#xff1a;a、minGW64 install.exe b、解压免安装版 2、解压 3、添加环境变量 4、CMD 运行gcc 安装完成。 5、使用minGW编译C源码 6、运行

培训总结2

今天&#xff0c;我学习了工具类java.util.包中的几个平时经常用到的几个类&#xff0c;例如ArrayList、HashMap、Hashtable等几个类&#xff0c;在这我总结一下ArrayList的用法。 特征&#xff1a;允许null在内的所有元素&#xff0c;大致上等同于Vector类&#xff0c;但是他是…

GWT 开发入门

From: http://home.cnblogs.com/group/topic/47694.html 在使用GWT开发web程序时&#xff0c;首先得到GWT下载其SDK&#xff0c;目前的最新版为GWT 2.3。 安装插件&#xff0c;目前两大Java IDE&#xff1a; Eclipse 和 NetBeans都有其开发插件&#xff0c;建议使用Eclipse &…

[C#反编译教程]001.Reflector.NET反编译工具 v8.5绿色版+注册机+注册教程

截图 下载地址 Reflector.NET反编译工具 v8.5绿色版注册机 下载地址&#xff1a;http://pan.baidu.com/s/1mgN1Cpi 密码&#xff1a;mx19 简介 .NET Reflector是一个类浏览器和反编译器&#xff0c;.NET Reflector可以分析程序集并向你展示它的所有秘密。.NET 框架向全世界引入…