一、概述

上篇文章描述了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);   //计算要返回数据的CRC
    Modbus.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下载

基于STM32F407Hal库的ModbusSlave从机处理函数RTU,支持功能码030616资源-CSDN下载

更多推荐