MODOBUS RTU协议参考代码
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
uint8_t g_test[8] = {0x01,0x06,0x00,0x02,0x40,0x40,0x00,0x00};
int crc16_modbus(uint8_t *data, uint8_t length);
int main(void){
int flag = crc16_modbus(g_test, 8); // 直接传递 g_test,不需要取地址
for (int i = 0; i < 8; i++) {
printf("g_test[%d] = 0x%02X\n", i, g_test[i]);
}
return 0;
}
int crc16_modbus(uint8_t *data, uint8_t length)
{
int detection = 0;
if ((data[length-2] == 0) && (data[length-1] == 0))
{
// printf("CRC detection!\n");
detection = 1;
length -= 2;
}
uint16_t uCRC = 0xFFFF; /* 初始值为0xFFFF */
for(uint8_t num = 0; num < length; num++)
{
uCRC = (data[num]) ^ uCRC; /* 把数据与16位的CRC寄存器的低8位相异或,结果存放于CRC寄存器。 */
for(uint8_t x = 0; x < 8; x++) /* 循环8次 */
{
if(uCRC & 0x0001) /*判断最低位为:“1” */
{
uCRC = uCRC >> 1; /* 先右移 */
uCRC = uCRC ^ 0xA001; /* 再与0xA001异或 */
}
else /* 判断最低位为:“0” */
{
uCRC = uCRC >>1 ; /* 右移 */
}
}
}
if (detection) {
data[length] = uCRC & 0x00FF; /* 取出CRC校验结果的低八位 */
data[length+1] = (uCRC & 0xFF00) >> 8; /* 取出CRC校验结果的高八位 */
}
return uCRC == 0;
}
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果