基于STM32F407+dp83848实现ModbusTCP从站移植

文章目录

一、背景

在先前已经通过cubemx实现以太网,并且能ping通,现在需要在此基础上移植freemodbus从机程序。

上一期:
【LWIP学习】dp83848与STM32f407re的接线并实现ping通

二、参考教程与实验材料

2.1 参考教程

博客:
基于STM32F767通过STM32CubeMX实现ModbusTCP从站(后续)

教程配套代码:
F7_ModbusTCP

此次移植非常顺利,感谢博主

2.2 实验准备

freemodbus官网或Github链接:FreeModbus源码

三、移植过程

  1. 确保当前工程能ping通,并且打开了串口

  2. 将mudbus文件夹放入工程,找到下载包内demo/STR71XTCP/Port文件夹,单独拿出来放到ModbusPort文件夹下。

    如图:

  3. 将之前下载的MosbusPort和modbus内的文件加到工程里,其中需要加的文件有

  4. 编译之后发现有错,下载教程中给的代码,依照代码进行修改。

    按我的回忆,修改了以下内容:

    4.1 portevent.c 全部改成了博主的写的

    4.2 porttcp.c 注释了vMBPortEventClose( );等函数

    4.3 port.h全部改成博主给的

    4.4 由于没放入acii和rtu相关文件,会报错找不到函数,把支持给关闭,修改mbconfig.h

    所有的修改都可以参考博主给的代码

  5. 没有使能操作系统,添加在main.c文件添加如下代码

  6. 添加user_mb_app.c和user_mb_app.h在这里写回调函数,复制博主的ModbusCB.c文件

  7. 编译成功

  8. 下载后能ping通

  9. 使用modbus poll测试,能读取保持寄存器

    9.1 modbus poll配置

    选择TCP连接,我的stm32配置的ip是192.168.1.111server port没改,还是502

    连接后的现象表示能成功读取寄存器,但是不能写保持寄存器

  10. 完善user_mb_app.c和user_mb_app.h

    写入以下代码,可以实现读和写保持寄存器

user_mb_app.c

c 复制代码
/**
  ******************************************************************************
  * @文件   
  * @作者 
  * @版本
  * @日期
  * @概要
  ******************************************************************************
  * @注意事项
  *
  *
  *
  ******************************************************************************
  */  

/* 头文件		--------------------------------------------------------------*/
#include "mb.h"
#include "user_mb_app.h"

/* 私有数据类型 --------------------------------------------------------------*/

/* 保持寄存器缓冲区 */
USHORT usSRegHoldBuf[S_REG_HOLDING_NREGS];

/* 私有定义 	--------------------------------------------------------------*/
/* 私有宏定义 	--------------------------------------------------------------*/
/* 私有变量 	--------------------------------------------------------------*/
/* 私有函数声明 --------------------------------------------------------------*/

/**
  * @功能
  * @参数
  * @返回值
  */
eMBErrorCode
eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs )
{
    eMBErrorCode    eStatus = MB_ENOERR;

    return eStatus;
}

eMBErrorCode
eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode )
{
	eMBErrorCode    eStatus = MB_ENOERR;
	int i=0;
	USHORT usRegValue;
	

	/* 检查地址范围 */
	if( (usAddress < 1) || (usAddress + usNRegs > S_REG_HOLDING_NREGS + 1) )
	{
		return MB_ENOREG;  // 地址超出范围
	}
	
	if( eMode == MB_REG_READ )
	{
		/* 读取模式:将寄存器值写入缓冲区(大端字节序) */
		for(i=0; i<usNRegs; i++)
		{
			*pucRegBuffer = usSRegHoldBuf[i+usAddress-1] >> 8;      // 高字节
			pucRegBuffer++;
			*pucRegBuffer = usSRegHoldBuf[i+usAddress-1] & 0xff;    // 低字节
			pucRegBuffer++;
		}
	}
	else if( eMode == MB_REG_WRITE )
	{
		/* 写入模式:从缓冲区读取数据并写入寄存器(大端字节序) */
		for(i=0; i<usNRegs; i++)
		{
			// 从缓冲区读取大端字节序数据
			usRegValue = (*pucRegBuffer << 8);  // 高字节
			pucRegBuffer++;
			usRegValue |= (*pucRegBuffer & 0xff); // 低字节
			pucRegBuffer++;
			
			// 写入到寄存器数组
			usSRegHoldBuf[i+usAddress-1] = usRegValue;
		}
	}
	else
	{
		eStatus = MB_EINVAL;  // 无效的模式
	}
	
    return eStatus;
}

eMBErrorCode
eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode )
{

	return MB_ENOREG;
}

eMBErrorCode
eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete )
{

	return MB_ENOREG;
}

/**
  * @}
  */


/*******************文件结尾**************************************************/

user_mb_app.h

c 复制代码
#ifndef USER_MB_APP_H
#define USER_MB_APP_H

/* 保持寄存器数量定义 */
#define S_REG_HOLDING_NREGS                      400

#endif /* USER_MB_APP_H */

四、实验结果

读取保持寄存器 03

写入保持寄存器 16

五、源码分享

蓝奏:4.modbustcp移植

相关推荐
LCG米19 小时前
STM32硬件CRC外设实测:多项式固定陷阱、CRC-32校验不匹配根因与软件查表法耗时对比落地
stm32·单片机·嵌入式硬件
女神下凡1 天前
芯参谋(85):Linux_PPI_NAND_驱动开发指南
linux·运维·arm开发·驱动开发·单片机·嵌入式硬件·设计规范
Zw-awa1 天前
从 CH340 到 HC-05 和 HC-06:让小车脱离电脑
stm32
何粥学1 天前
Vivado 2024.2 开发记录(AC820 Zynq-7020)——软件使用,点亮led灯
单片机·嵌入式硬件·zynq
Sakura_j_h_1 天前
51 单片机驱动四位数码管:动态扫描、限流电阻与消影的取舍
单片机·嵌入式硬件·51单片机·嵌入式·数码管·动态扫描·限流电阻
世微 如初1 天前
24V 输入转 9V/0.8A 输出:基于 AP5190 的 LED 降压恒流驱动方案设计与 BOM 清单
驱动开发·芯片·led电源驱动·降压恒流ic
HANDY092001 天前
从“不照人”到“剂量达标”:扇叶遮挡式UV-C空气消毒的工程边界与可验证评估框架
开发语言·人工智能·嵌入式硬件·智能家居
飞凌嵌入式1 天前
千次静电放电试炼,守住飞凌嵌入式硬件可靠底线
嵌入式硬件
mg6682 天前
安卓玩机工具----告别面具!SukiSU Ultra 内核级 Root 与终极隐藏实战指南
驱动开发·root系统
Zw-awa2 天前
从 CPU 搬运到自动搬运:DMA、空闲中断和两块缓冲
stm32