MODBUS_RTU通信协议,CRC_16校验码计算程序

线圈代表位操作(bit),表示一个布尔变量,寄存器代表字操作(word),表示一个整型变量或其他复合数据结构。

1.通信协议,写单个线圈(05)

从机地址功能码线圈地址高字节线圈地址低字节写入bit值高字节,线圈电平高低写入bit值低字节,还未知CRC校验高字节CRC校验低字节
0105000000/FF00CRCCRC
00是广播写单个线圈0xFF00-0xFFFF0x00-0xFF对应线圈低/高有的是低字节在前高字节在后

例:01 05 00 01 ff 00 dd fA

2.通信协议,写多个线圈(0F)

从机地址功能码线圈起始地址高字节线圈起始地址低字节写的线圈的个数,高字节写的线圈的个数,低字节写的线圈占的总字节数字节1字节2……CRC校验低字节CRC校验高字节
010F00000000000000……CRCCRC

建一个数组array,

array[] = { 01 , 0F , 00,0000,00 , 00 , 00 , 00 , …… , CRC,CRC  }

00,00  从机的存储线圈的空间,从地址0x0000开始算起;

00,00  从机的存储线圈的空间,从地址0x0000开始算起,写了0x0000个线圈;

00  0x0000 除以8 ,有余数就再加1 ,就是0x00;

字节1,字节2,……,每8个线圈对应一个字节,不足的按一个字节算;

比如,从地址0开始,写8个线圈,线圈的电平是0,0,1,0,0,0,0,0,对应字节1的值是4;

字节1:4
00100000
 线圈0 线圈1 线圈2 线圈3 线圈4 线圈5 线圈6 线圈7

数组就是 01 0F 00 00 00 08 01 04  FF 56

计算的校验值是0x56FF,但要低字节在前,高字节在后。

3.CRC的计算

uint16_t CRC_16( uint8_t *Array , uint8_t ArrayLength )    
{
	uint16_t CRC_16 = 0xffff ;
	uint8_t TEMP;
	
	while( ArrayLength-- )
	{
		
		CRC_16 = CRC_16 ^ (*Array);
		
		for(int x=0;x<8;x++)
		{
			TEMP = CRC_16 & 0x0001;
			CRC_16 = CRC_16 >> 1;
			if( TEMP==1 )
			{
				CRC_16 = CRC_16^0xA001;
			}
			
		}
		
		Array++;
		
	}
	
	return CRC_16;
	
}

.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值