一、引言
在工业自动化和物联网等领域,STM32 微控制器和昆仑通态人机界面(HMI)的组合应用十分广泛。为了实现它们之间的数据交换和设备控制,通常采用 Modbus 通信协议。Modbus 是一种简单且通用的通信协议,支持多种物理接口,如 RS-485、RS-232 和 TCP/IP 等,其具有易于实现、开放性和可靠性高等优点,非常适合工业环境下的设备间通信。
二、STM32 与 Modbus 概述
STM32 是意法半导体(STMicroelectronics)推出的一系列高性能、低功耗的微控制器,具有丰富的外设和强大的处理能力,能够满足各种工业控制和通信的需求。而 Modbus 协议主要包括 Modbus RTU(基于二进制)和 Modbus ASCII(基于文本)两种常见的传输模式,以及 Modbus TCP(基于以太网)模式。对于 STM32 与昆仑通态之间的通信,我们可以根据具体的应用场景选择合适的 Modbus 模式。
三、硬件连接
首先,确保 STM32 与昆仑通态设备的物理连接正确。如果使用 RS-485 通信,需要连接 STM32 的 USART 接口和 RS-485 收发器(如 MAX485),并将 RS-485 接口连接到昆仑通态的相应端口。确保连接的线缆长度、终端电阻的配置等符合 RS-485 标准,以保证通信的稳定性和可靠性。
四、STM32 软件实现
以下是一个简单的 STM32 上实现 Modbus RTU 通信的示例代码片段,使用 STM32 的 HAL 库和 FreeModbus 开源库。
#include "stm32f4xx_hal.h"
#include "mb.h"
#include "mbport.h"
// 定义 USART 句柄
UART_HandleTypeDef huart3;
// 初始化 USART 接口
void MX_USART3_UART_Init(void)
{
huart3.Instance = USART3;
huart3.Init.BaudRate = 9600;
huart3.Init.WordLength = UART_WORDLENGTH_8B;
huart3.Init.StopBits = UART_STOPBITS_1;
huart3.Init.Parity = UART_PARITY_NONE;
huart3.Init.Mode = UART_MODE_TX_RX;
huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart3.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart3)!= HAL_OK)
{
Error_Handler();
}
}
// 错误处理函数
void Error_Handler(void)
{
while(1);
}
// Modbus 事件处理函数
eMBErrorCode eMBRegHoldingCB(UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode)
{
eMBErrorCode eStatus = MB_ENOERR;
int iRegIndex;
if ((usAddress >= REG_INPUT_START) && (usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS))
{
iRegIndex = (int)(usAddress - REG_INPUT_START);
switch (eMode)
{
case MB_REG_READ:
while (usNRegs > 0)
{
*pucRegBuffer++ = (unsigned char)(usRegInputBuf[iRegIndex] >> 8);
*pucRegBuffer++ = (unsigned char)(usRegInputBuf[iRegIndex] & 0xFF);
iRegIndex++;
usNRegs--;
}
break;
case MB_REG_WRITE:
while (usNRegs > 0)
{
usRegInputBuf[iRegIndex] = *pucRegBuffer++ << 8;
usRegInputBuf[iRegIndex] |= *pucRegBuffer++;
iRegIndex++;
usNRegs--;
}
break;
}
}
else
{
eStatus = MB_ENOREG;
}
return eStatus;
}
int main(void)
{
HAL_Init();
MX_USART3_UART_Init();
// 初始化 Modbus RTU
eMBInit(MB_RTU, 1, 3, 9600, MB_PAR_NONE);
eMBEnable();
while (1)
{
// 调用 Modbus 处理函数
eMBPoll();
}
}
代码解释:
- 头文件引入:
stm32f4xx_hal.h
是 STM32 的 HAL 库头文件,用于初始化和配置 STM32 的硬件资源。mb.h
和mbport.h
是 FreeModbus 库的头文件,用于实现 Modbus 协议的功能。
- USART 初始化函数:
MX_USART3_UART_Init()
函数使用 HAL 库对 USART3 进行初始化,设置波特率为 9600bps,8 位数据位,1 位停止位,无校验位等。
- 错误处理函数:
Error_Handler()
函数在出现错误时会进入一个无限循环,方便调试和查找问题。
- Modbus 事件处理函数:
eMBRegHoldingCB()
函数是 Modbus 的保持寄存器回调函数,根据不同的操作模式(读或写),对相应的寄存器进行操作。当读取寄存器时,将寄存器数据发送到 Modbus 从机;当写入寄存器时,更新寄存器的值。
- 主函数:
- 在
main()
函数中,首先初始化 HAL 库和 USART3 接口,然后使用eMBInit()
初始化 Modbus RTU 模式,设置从机地址为 1,使用 USART3,波特率为 9600,无校验。接着使用eMBEnable()
启用 Modbus 功能,最后在一个无限循环中调用eMBPoll()
处理 Modbus 通信事件。
- 在
五、昆仑通态配置
在昆仑通态的开发环境中,需要进行以下配置:
- 添加设备:在设备窗口添加一个 Modbus 设备,设置设备的通讯参数,如串口参数(波特率、数据位、停止位、校验位),与 STM32 的设置一致。
- 创建变量:根据需要创建相应的变量,这些变量将与 STM32 中的寄存器对应。例如,创建一个读写寄存器,设置其寄存器地址,数据类型等。
- 画面开发:在画面中添加控件,如按钮、文本框等,将其属性与创建的变量关联,实现数据的显示和控制操作。
六、测试与调试
在完成 STM32 和昆仑通态的配置和编程后,需要进行测试和调试。
- STM32 端调试:可以使用 ST-Link 等调试工具,通过断点和单步执行的方式检查代码是否正常运行,观察变量的值和程序的执行流程。
- 昆仑通态端调试:在昆仑通态的运行环境中,使用其提供的调试工具,检查变量的读写操作是否正确,观察通信状态和数据的更新情况。
七、注意事项
- 确保 STM32 和昆仑通态的波特率、数据位、停止位和校验位设置完全一致,否则会导致通信失败。
- 对于 RS-485 通信,要注意总线的电气特性,避免因总线冲突或终端电阻问题导致通信异常。
- 在处理 Modbus 通信时,要考虑超时时间和重试机制,以应对通信异常的情况。
八、总结
STM32 与昆仑通态之间的 Modbus 通信为工业控制和自动化系统提供了一种简单而有效的数据交换和设备控制的解决方案。通过合理的硬件连接、正确的软件实现和精心的调试,能够实现稳定可靠的通信,满足各种工业应用的需求。通过使用 STM32 的强大处理能力和昆仑通态友好的人机界面开发环境,我们可以方便地构建功能强大的自动化控制系统。
上述代码只是一个基础示例,在实际应用中,可能需要根据具体的需求,如多个从机、不同的寄存器操作、不同的通信模式等进行进一步的扩展和优化。同时,对于不同型号的 STM32 微控制器,其 HAL 库的使用方法可能会有所不同,需要根据具体的芯片手册进行相应的调整。
✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进
❤欢迎关注我的知乎:对error视而不见
代码获取、问题探讨及文章转载可私信。
☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。
标签:modbus,Modbus,huart3,通态,STM32,stm32,UART,Init From: https://blog.csdn.net/duierrorshuobu/article/details/145192683