当前位置:
文档之家› 单独传感器标准MODBUS485通讯协议
单独传感器标准MODBUS485通讯协议
//*****************************************************************************
*******************
//**名
称:CRC16
//**说
明:CRC 效验函数
//**形
参:*p 效验帧的指针 帧长 datalen
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 步(再次移位)
{
unsigned char CRC16Lo,CRC16Hi,CL,CH,SaveHi,SaveLo;
int i,Flag;
CRC16Lo = 0xFF; CRC16Hi = 0xFF;
CL = 0x01;
CH = 0xA0;
for(i=0;i<datalen;i++)
{
CRC16Lo ^=*(p+i);//每一个数据与 CRC 寄存器进行异或
for(Flag=0;Flag<8;Flag++)
{
SaveHi = CRC16Hi; SaveLo = CRC16Lo;
CRC16Hi >>= 1 ;CRC16Lo >>= 1 ; //高位右移一位,低位右移一位
if ((SaveHi & 0x01) == 0x01) //如果高位字节最后一位为 1
如果最低位为 1:CRC 寄存器与多项式 A001(1010 0000 0000 0001)进行异或; 5、重复步骤 3 和 4,直到右移 8 次,这样整个 8 位数据全部进行了处理; 6、重复步骤 2 到步骤 5,进行下一步 8 位数据的处理; 7、最后得到的 CRC 寄存器即为 CRC 码; 8、将 CRC 结果放入信息帧时,将高低位交换,低位在前。
传感器分辨率是 0.1,则当前温度应该除以 10,即为 15.5 度。 温度是有负数的,我们传感器返回的负数是以十六进制补码的形式表示,例
如: 返回:01 03 02 FF 65 39 9F FF 65 即为温度数据,是十六进制整数,换算成十进制是-155,我们的温度
传感器分辨率是 0.1,则当前温度应该除以 10,即为-15.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。
485 口通信协议采用 Modbus 通信协议 传感器和显示器均作为从机
数据字节格式: 起始位 1
数据位 8
波特率:9600
绵阳市湘蜀电子科技有限公司
停止位 1
读取数据(标准 modbus 协议) 地址默认为 0x01,可以更改
1、读取数据 主机呼:
01 03
代码 01 03 00 00
00 01
84 0A
CRC16Lo |=0x80 ; //则低位字节右移后前面补 1 否则自动补 0
if ((SaveLo & 0x01) == 0x01) //如果 LSB 为 1,则与多项式码进行异或
{ CRC16Hi ^= CH; CRC16Lo ^= CL; }
}
}
return (CRC16Hi<<8)|CRC16Lo;(返回后再进行高低位转换)
}
//**返 回 值:效验字
绵阳市湘蜀电子科技有限公司
//*****************************************************************************
*******************
unsigned int CRC16(unsigned char * p, uint16 datalen )
00 00 00 01 84 0A
功能定义 站号(地址)
功能码 起始地址
读取点数
CRC 校验码,前低后高
备注
单独传感器起始地址固 定为 0
即为读取的寄存器,单独 传感器只读取一个寄存
器
从机答: 01 03 02 XX XX XX XX
代码 01 03 02 XX XX XX XX
功能定义 站号(地址)
功能码 读单元字节 数据(前高后低) CRC 校验码
Baidu Nhomakorabea
备注 十六进制整数
上面 02,XX 等均为一个字节。数据为两个字节,高位字节在前。每帧的开 头和结尾至少有 3.5 个字节时间的间隔。
绵阳市湘蜀电子科技有限公司
如读取温度传感器的值: 发送:01 03 00 00 00 01 84 0A 返回:01 03 02 00 9B F9 EF 00 9B 即为温度数据,是十六进制整数,换算成十进制是 155,我们的温度