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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

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

1、读取数据

主机呼:

01 03 00 00 00 01 84 0A

从机答:

01 03 02 XX XX XX XX

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

2. 读设备地址

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

00 20 Adress CRC ( 5 个字节)

3. 写设备地址

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

00 10 CRC ( 4 个字节)(返回:00 10 00 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(1010 0000 0000 0001)进行异或;

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

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

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

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

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

*******************

//** 名称

:CRC16

//* * 说明

CRC效验函数

//* * 形参

*p 效验帧的指针帧长

datalen

//* * 返回值:效验字

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

unsigned int 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 A=*(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 A= CH; CRC16LO A= CL; }

}

}

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

Welcome To Download !!!

相关文档
最新文档