博客
关于我
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/

你可能感兴趣的文章
Pandas数据结构之DataFrame常见操作
查看>>
pandas整合多份csv文件
查看>>
pandas某一列转数组list
查看>>
Pandas模块,我觉得掌握这些就够用了!
查看>>
Pandas玩转文本处理!
查看>>
SpringBoot 整合 Mybatis Plus 实现基本CRUD功能
查看>>
pandas的to_sql方法中使用if_exists=‘replace‘
查看>>
Springboot ppt转pdf——aspose方式
查看>>
pandas读取csv编码utf-8报错
查看>>
pandas读取parquet报错
查看>>
pandas读取数据用来深度学习
查看>>
Pandas进阶大神!从0到100你只差这篇文章!
查看>>
spring5-介绍Spring框架
查看>>
pandas,python - 如何在时间序列中选择特定时间
查看>>
Spring 框架之 AOP 原理深度剖析
查看>>
Pandas:如何按列元素的组合分组,以指示基于不同列的值的同现?
查看>>
Pandas:将一列与数据帧的所有其他列进行比较
查看>>
PANDA:基于多列对数据表的行运行计算,并将输出存储在新列中
查看>>
PandoraFMS 监控软件 SQL注入漏洞复现
查看>>
PandoraFMS 监控软件 任意文件上传漏洞复现
查看>>