给从机下发不同的指令,从机去履行不同的操作,这个便是判别一下功用码即可,和咱们前边学的有用串口例程是相似的。多机通讯,无非便是添加了一个设备地址判别罢了,难度也不大。咱们找了一个 Modbus 调试精灵,经过设置设备地址,读写寄存器的地址以及数值数量等参数,能够直接代替串口调试帮手,比较便利的下发多个字节的数据,如图18-7所示。咱们先来就图中的设置和数据来对 Modbus 做进一步的剖析,图中的数据来自于调试精灵与咱们接下来要讲的例程之间的交互。
图18-7 Modbus 调试精灵
如图,咱们的 USB 转 RS485 模块虚拟出的是 COM5,波特率9600,无校验位,数据位是8位,1位中止位,设备地址假设为1。
写寄存器的时分,假设咱们要把01写到一个地址是0000的寄存器地址里,点一下“写入”,就会呈现发送指令:01 06 00 00 00 01 48 0A。咱们来剖析一下这帧数据,其间01是设备地址,06是功用码,代表写寄存器这个功用,后边跟00 00表明的是要写入的寄存器的地址,00 01便是要写入的数据,48 0A便是 CRC 校验码,这是软件主动算出来的。而依据 Modbus 协议,当写寄存器的时分,从机成功完结该指令的操作后,会把主机发送的指令直接回来,咱们的调试精灵会接纳到这样一帧数据:01 06 00 00 00 01 48 0A。
假设咱们现在要从寄存器地址0002开端读取寄存器,而且读取的数量是2个。点一下“读出”,就会呈现发送指令:01 03 00 02 00 02 65 CB。其间01是设备地址,03是功用码,代表读寄存器这个功用,00 02便是读寄存器的开始地址,后一个00 02便是要读取2个寄存器的数值,65 CB便是 CRC 校验。而接纳到的数据是:01 03 04 00 00 00 00 FA 33。其间01是设备地址,03是功用码,04代表的是后边读到的数据字节数是4个,00 00 00 00分别是地址00 02和00 03的寄存器内部的数据,而 FA 33 便是 CRC 校验了。
好像越来越明亮了,所谓的 Modbus 通讯协议,无非便是主机下发了不同的指令,从机依据指令的判别来履行不同的操作罢了。因为咱们的开发板没有 Modbus 功用码那么多相应的功用,咱们在程序中界说了一个数组 regGroup[5],相当于5个寄存器,此外又界说了第6个寄存器,操控蜂鸣器,经过下发不同的指令咱们改动寄存器组的数据或许改动蜂鸣器的开关状况。在 Modbus 协议里寄存器的地址和数值都是16位的,即2个字节,咱们默许高字节是 0x00,低字节便是数组 regGroup 对应的值。其间地址 0x0000 到 0x0004 对应的便是 regGroup数组中的元素,咱们写入的一起把数字又显现到 1602 液晶上,而 0x0005 这个地址,写入 0x00,蜂鸣器就不响,写入任何其它数值,蜂鸣器就报警。咱们单片机的首要作业也便是解析串口接纳的数据履行不同操作。 /*Lcd1602.c 文件程序源代码***/ (此处省掉,可参阅之前章节的代码) /****RS485.c 文件程序源代码*****/ (此处省掉,可参阅之前章节的代码) /****CRC16.c 文件程序源代码****/
/*CRC16核算函数,ptr-数据指针,len-数据长度,回来值-核算出的CRC16数值*/unsignedintGetCRC16(unsignedchar*ptr