博客
关于我
CRC16循环冗余校验 RTU-MODBUS标准 Linux C
阅读量:205 次
发布时间:2019-02-28

本文共 2580 字,大约阅读时间需要 8 分钟。

1、概述

CRC16循环冗余校验是一种常用的数据完整性校验方法,尤其在MODBUS协议中应用广泛。CRC16校验值为16位无符号整数,通常以两个字节表示,低检验字节在前,高检验字节在后。例如,若校验值为0x1788,则MODBUS报文中校验顺序为...0x88 0x17。

2、C程序实现

以下是实现CRC16校验的Linux C代码示例:

```c/****************************************************************************** * 文件名称: main.c * 描述: 提供CRC16校验的Linux实现 * 作者: jackwang * 日期: 2018-07-15 ******************************************************************************/#include
#include
#include

static unsigned char Char2Int(char chr, bool *isOK);static unsigned char HexStr2Int(char *str, bool *isOK);static unsigned short GenerateCRC16(unsigned char *arr_buff, unsigned short len);

int main(int argc, char *argv) {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] 无输入参数,请输入要校验的字节数据,按空格分隔。\r\n");} else {    printf("[note] 输入 %d 个字节的数据:", 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校验值为:0x%04X\r\n", crcVal);}return 0;

}

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] 无效的Hex字符输入:%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 *arrBuff, unsigned short len) {unsigned short crc = 0xFFFF;unsigned char i, j;

for (j = 0; j < len; ++j) {    crc = crc ^ *arrBuff++;    for (i = 0; i < 8; ++i) {        if ((crc & 0x0001) > 0) {            crc = crc >> 1;            crc = crc ^ 0xA001;        } else {            crc = crc >> 1;        }    }}return crc;

}

3、编译

可以使用以下命令编译程序:

```bashgcc main.c -o getcrc16```

4、使用示例

运行程序时,按照以下格式输入Hex字节数据:

```bash./getcrc16 01 03 00 04 00 04```

输出结果为:

```bash[note] 输入 6 字节的数据:01 03 00 04 00 04[note] CRC16校验值为:0xC805```

转载地址:http://qbwp.baihongyu.com/

你可能感兴趣的文章
PostgreSQL 10.0 preview 变化 - pg_xlog,pg_clog,pg_log目录更名为pg_wal,pg_xact,log
查看>>
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 15章 并行查询_15.2. 何时会用到并行查询?...
查看>>
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 9 章 函数和操作符_9.23. 行和数组比较
查看>>
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 21 章 数据库角色
查看>>
Postgresql 12.9如何配置允许远程连接
查看>>
PostgreSQL 9.6 同步多副本 与 remote_apply事务同步级别 应用场景分析
查看>>
Postgresql CopyManager 流式批量数据入库
查看>>
PostgreSQL cube 插件 - 多维空间对象
查看>>
PostgreSQL Daily Maintenance - cluster table
查看>>
PostgreSQL on Linux 最佳部署手册
查看>>
PostgreSQL Oracle 兼容性之 - pipelined
查看>>
PostgreSQL Point-In-Time Recovery (Incremental Backup)
查看>>
postgresql Streaming Replication监控与注意事项
查看>>
postgresql 不需要付费_使用数据传输在PostgreSQL执行 外部连接运算符
查看>>
postgresql 主从配置_生产环境postgresql主从环境配置
查看>>
postgresql 函数&存储过程 ; 递归查询
查看>>
PostgreSQL 分组聚合查询中 filter 子句替换 case when
查看>>
PostgreSQL 同步流复制锁瓶颈分析
查看>>
PostgreSQL 备份与还原命令 pg_dump
查看>>
Postgresql 外部表插件postgres_fdw的安装和使用
查看>>