[STM32]超详细STM32移植freemodbus实现modbusRTU协议

文章介绍了如何在STM32上使用FreeModbus协议栈进行ModBus-RTU开发,包括下载软件包、配置工程、设置协议和寄存器、初始化串口和定时器、定义寄存器变量,以及在主函数中调用相关函数进行数据读写。通过此方法可以简化多命令和多寄存器的处理。
摘要由CSDN通过智能技术生成
  最近在STM32平台上开发DTU网关设备,需要用到RS485接口实现ModBus-RTU协议来进行一些线圈寄存器的控制(继电器开关)和一些保持寄存器的读写(模拟量的读写和一些设备参数配置等),其实通过自己编写函数进行命令解析也可以实现,但是对于多个MODBUS命令及多个不定数寄存器的读写操作略显麻烦,就一次性移植了一下FreeModbus协议栈进行开发。以下是详细过程介绍,希望有需要的可以用到。
一、首先去下载FreeModbus软件包,解压可以看到rtu、tcp、asscii等文件夹,其中ascii与tcp是用不到的,这两个是对应ModBus-asscii与ModBus-tcp开发,functions、include、port文件加是三种协议格式都要用到的共用文件。
目录结构如图:

二、通过MDK的 manage project items操作将整个文件包添加到自己的keil工程下,
MDK结构如图:

三、在mbconfig.h中配置好需要用到的协议类型及寄存器类型等基础配置,寄存器部分根据自己的需要进行配置:
协议类型如图:

 
寄存器配置如图:

   接下来就是重点工作,通过编写功能函数来实现几个主要功能,主要是在portserial.c文件中:
首先在实现串口与定时器的初始化,包括地址、波特率、校验等xMBPortSerialInit( ucPort, ulBaudRate, 8, eParity ) ;
使能失能串口的中断vMBPortSerialEnabl();
在xMBPortSerialPutByte()中和xMBPortSerialGetByte()中调用串口发送函数和串口接收函数;
编写一下串口中断函数,里面分为接收中断和发送中断,实现prvvUARTRxISR();与prvvUARTTxReadyISR();的调用;
再初始化一个定时器xMBPortTimersInit( ( USHORT ) usTimerT35_50us )、xMBPortTimersInit();
编写vMBPortTimersEnable(  )与vMBPortTimersDisable(  )其实就是在里面开启和关闭定时器操作;
需要用到定时器中断,在中断中调用prvvTIMERExpiredISR();整个定时器对为了判断完整的数据帧;
到此处,接口函数就全部写好了。
四、在.c中定义自己的寄存器变量和自己的寄存器其实地址,如线圈和输入寄存器的定义
//线圈起始地址
#define REG_COILS_START       0x0000
//线圈数量
#define REG_COILS_SIZE        16。
//线圈状态
uint8_t ucRegCoilsBuf[REG_COILS_SIZE / 8] = {0x01,0x02};
//输入寄存器起始地址
#define REG_INPUT_START       0x0000
//输入寄存器数量
#define REG_INPUT_NREGS       8
//输入寄存器内容
uint16_t usRegInputBuf[REG_INPUT_NREGS] = {0x1000,0x1001,0x1002,0x1003,0x1004,0x1005,0x1006,0x1007};
//输入寄存器起始地址
uint16_t usRegInputStart = REG_INPUT_START;
五、在主函数main();内调用eMBInit(XX);和eMBEnable();。
六、在主程序循环中调用eMBPoll();就可以实现之前定义的寄存器变量中的数据读写功能。函数执行判断是通过事件判断xMBPortEventGet( &eEvent ) == TRUE;里面主要是通过串口的接收中断来发送事件信息。最后的实现是在eException = xFuncHandlers.pxHandler( ucMBFrame, &usLength );中通过接收不同功能码对于不同类型的寄存器的操作。

 
这样整个移植就算是完成了,最后可以通过Modbus Poll等调试工具与进行Modbus的调试。

  因为Modbus RTU 协议是一种开放协议。允许制造商在其设备中使用通用 Modbus 协议结构,添加自定义功能以访问硬件。这也是为什么这个协议会在多领域普及的原因吧。
    说得不对的地方也欢迎大家指出来。
---------------------
作者:forgot
链接:https://bbs.21ic.com/icview-3272498-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。
STM32F103是一款非常常用的微控制器,它具有丰富的外设接口和功能强大的处理能力。要实现STM32F103上同时运行Modbus RTUModbus TCP,我们可以移植FreeModbus协议栈来实现。 首先,我们需要了解Modbus RTUModbus TCP的基本原理和通信协议Modbus RTU是一种串口通信协议,而Modbus TCP是基于以太网的通信协议。它们之间的通信方式和数据格式略有不同。 在移植FreeModbus时,我们可以使用STM32F103上的通用串口外设来实现Modbus RTU的通信。我们需要编写串口中断处理函数来接收和发送Modbus RTU帧。同时,我们还需要实现Modbus TCP的通信功能。这可以通过STM32F103上的以太网接口来完成。我们需要编写TCP/IP协议栈的相关代码来处理Modbus TCP的通信。 在移植FreeModbus时,我们需要进行以下步骤: 1. 配置STM32F103的串口和以太网外设。我们需要设置串口的波特率、数据位、停止位等参数,以及配置以太网接口的IP地址和端口号。 2. 编写串口接收中断处理函数。当接收到串口数据时,我们需要解析Modbus RTU帧,提取出功能码和数据内容。 3. 编写串口发送函数。根据Modbus协议,我们需要根据功能码和数据内容生成Modbus RTU帧,并发送到串口。 4. 编写TCP/IP协议栈。我们需要编写用于处理Modbus TCP通信的TCP/IP协议栈代码。这包括解析TCP报文、提取出Modbus TCP报文、根据功能码和数据内容生成响应报文等。 5. 整合以上功能。将串口接收中断处理函数、串口发送函数和TCP/IP协议栈整合到一个主循环中,以实现同时运行Modbus RTUModbus TCP。 通过以上步骤,我们可以在STM32F103上实现同时运行Modbus RTUModbus TCP的功能。这样,我们就可以通过串口和以太网来实现与其他设备的通信。同时,我们还可以根据实际需求,对FreeModbus进行修改和优化,以满足项目的具体要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值