当前位置:文档之家› 单独传感器标准MODBUS485通讯协议

单独传感器标准MODBUS485通讯协议

A、读取数据(标准modbus协议)

地址默认为0x01,可以更改

1、读取数据

主机呼:

0103 00 0000 01 840A

从机答:

0103 02 XX XX XX XX

上面02,XX等均为一个字节。数据为两个字节,高位字节在前。每帧的开头和结尾至少有3。5个字节时间的间隔.

2。读设备地址

0020 CRC (4个字节)(读取:00 20 0068)

00 20 Adress CRC (5个字节)

3.写设备地址

00 10 Adress CRC (5个字节)(地址设为01:00 10 01 BD C0)

00 10CRCﻩ(4个字节)(返回:00 1000 7C)

说明: 1.读写地址命令的地址位必须是00。

2。Adress为1个字节,范围为0-255。

用户在为主机编程时,除了站号(地址)和CRC校验码之外,其它字节的字符均采用上面的内容不变。主机格式中的读取点数为01。从机回答帧中的功能码(03)和读单元字节数(01)不变。

计算CRC码的步骤:

1、预置16位寄存器为十六进制FFFF(即全为1)。称此寄存器为CRC寄存器;

2、把第一个8位数据与16位CRC寄存器的低位相异或,把结果放于CRC寄存器;

3、把寄存器的内容右移一位(朝低位),用0填补最高位,并检查右移后的移出位;

4、如果最低位为0:重复第3步(再次移位)

如果最低位为1:CRC寄存器与多项式A001(10100000 0000 0001)进行异或;

5、重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;

6、重复步骤2到步骤5,进行下一步8位数据的处理;

7、最后得到的CRC寄存器即为CRC码;

8、将CRC结果放入信息帧时,将高低位交换,低位在前。

//************************************************************************************************

//**名称:CRC16

//**说明:CRC效验函数

//**形参:*p效验帧的指针帧长 datalen

//**返回值:效验字

//************************************************************************************************

unsignedint CRC16(unsigned char * p, uint16 datalen )

{

unsigned char CRC16Lo,CRC16Hi,CL,CH,SaveHi,SaveLo;

int i,Flag;

CRC16Lo =0xFF; CRC16Hi= 0xFF;

CL = 0x01; CH= 0xA0;

for(i=0;i

CRC16Lo ^=*(p+i);//每一个数据与CRC寄存器进行异或

for(Flag=0;Flag<8;Flag++)

{

SaveHi = CRC16Hi; SaveLo=CRC16Lo;

CRC16Hi〉〉= 1;CRC16Lo >>= 1 ; //高位右移一位,低位右移一位if ((SaveHi &0x01) ==0x01) //如果高位字节最后一位为1 CRC16Lo|=0x80 ; //则低位字节右移后前面补1否则自动补0

if ((SaveLo&0x01) ==0x01) //如果LSB为1,则与多项式码进行异或

{ CRC16Hi^= CH;CRC16Lo ^= CL;}

}

return (CRC16Hi<〈8)|CRC16Lo;(返回后再进行高低位转换) }

相关主题