嵌入式学习(45)-基于STM32F407Hal库的Modbus Slave从机程序
一、概述
上篇文章描述了Modbus Master的程序,本篇讲述Modbus Slave
嵌入式学习(44)-基于STM32F407Hal库的Modbus Master主机程序。-CSDN博客
二、应用
void Modbus_Slave_Function03()
{static uint16_t RegAddr, Reglen, crc,SlaveAddr;static uint8_t i, j;SlaveAddr=Modbus.Rebuf[0];//获取从机地址//得到要读取寄存器的首地址RegAddr = Modbus.Rebuf[2] * 256 + Modbus.Rebuf[3]; //读取的首地址//得到要读取寄存器的数据长度Reglen = Modbus.Rebuf[4] * 256 + Modbus.Rebuf[5]; //读取的寄存器个数//发送回应数据包i = 0;Modbus.Txbuf[i++] = Modbus.SlaveAddr; //ID号:发送本机设备地址Modbus.Txbuf[i++] = 0x03; //发送功能码Modbus.Txbuf[i++] = ((Reglen * 2) % 256); //返回字节个数for (j = 0; j < Reglen; j++) //返回数据{//reg是提前定义好的16位数组(模仿寄存器)Modbus.Txbuf[i++] = Reg[RegAddr + j] / 256; //高位数据Modbus.Txbuf[i++] = Reg[RegAddr + j] % 256; //低位数据}crc = Modbus_CRC16(Modbus.Txbuf, i); //计算要返回数据的CRCModbus.Txbuf[i++] = crc / 256; //校验位高位Modbus.Txbuf[i++] = crc % 256; //校验位低位//数据包打包完成// 开始返回Modbus数据
// RS485_TX_ENABLE;//这是开启485发送Modbus_rs485_send_data(Modbus.Txbuf,i);
void Modbus_Slave_Function06(void)
{static uint16_t RegAddr, Reglen, crc,SlaveAddr,Data;static uint8_t i, j;RegAddr = Modbus.Rebuf[2] * 256 + Modbus.Rebuf[3]; //得到要修改的地址Data = Modbus.Rebuf[4] * 256 + Modbus.Rebuf[5]; //修改后的值(要写入的数据)Reg[RegAddr] = Data; //修改本设备相应的寄存器//以下为回应主机i = 0;Modbus.Txbuf[i++] = Modbus.SlaveAddr; //本设备地址Modbus.Txbuf[i++] = 0x06; //功能码Modbus.Txbuf[i++] = RegAddr / 256; //写入的地址Modbus.Txbuf[i++] = RegAddr % 256;Modbus.Txbuf[i++] = Data / 256; //写入的数值Modbus.Txbuf[i++] = Data % 256;crc = Modbus_CRC16(Modbus.Txbuf, i); //获取crc校验位Modbus.Txbuf[i++] = crc / 256; //crc校验位加入包中Modbus.Txbuf[i++] = crc % 256;Modbus_rs485_send_data(Modbus.Txbuf,i); }
三、参考代码
STM32F407基于Hal库实现ModbusSlave程序资源-CSDN下载