Modbus 传感器开发:STM32F030 串口测试(H5 中转 USB 转 485 方案)
·
目录
- 一、前言
- 二、测试方案设计:H5 作为 USB 转 485 中转
- 三、STM32H5 端代码实现:双向数据转发
- 四、STM32F030 端代码实现:串口收发 + LED 控制
- 五、测试验证:PC→H5→F030 控制流程
- 六、总结
- 七、结尾
一、前言
上一篇笔记完成了 STM32F030 串口的面向对象封装与 RS485 适配代码开发,本次需对该串口功能进行实际测试。因缺少独立的 USB 转 485 模块,我们借助兼具 485 接口与 USB 接口的 STM32H5 开发板作为中转设备:将 F030 开发板的串口 1(RS485)与 H5 的串口 4(RS485)相连,H5 的 USB 接口与 PC 相连,使 H5 充当 “USB 转 485 模块”,最终实现 PC 与 F030 的串口通信测试。
二、测试方案设计:H5 作为 USB 转 485 中转
核心连接逻辑:
- 硬件连接:STM32F030 串口 1(RS485) ↔ STM32H5 串口 4(RS485);STM32H5 USB 接口 ↔ PC;F030 通过板载 USB 供电;
- 数据流向:PC 下发指令→H5 USB→H5 串口 4(RS485)→F030 串口 1(RS485);F030 响应数据→H5 串口 4→H5 USB→PC,实现双向透传。
三、STM32H5 端代码实现:双向数据转发
H5 端需创建两个 FreeRTOS 任务,分别实现 “读 485 写 USB”“读 USB 写 485” 的双向数据转发,任务创建前先完成 USB、485 串口设备的初始化:
代码原作者韦东山
// 任务1:读取RS485(串口4)数据,转发至USB串口
static void RS485toUSB( void *pvParameters )
{
// 获取USB串口、RS485串口(串口4)设备结构体
struct UART_Device *pUSBUART = GetUARTDevice("usb");
struct UART_Device *pRS485UART = GetUARTDevice("uart4");
uint8_t data; // 存储单字节收发数据
while (1)
{
// 阻塞读取RS485串口数据(超时无限等待)
if (0 == pRS485UART->RecvByte(pRS485UART, &data, portMAX_DELAY))
{
// 将读取到的数据转发至USB串口(超时100ms)
pUSBUART->Send(pUSBUART, &data, 1, 100);
}
}
}
// 任务2:读取USB串口数据,转发至RS485(串口4)
static void USBtoRS485( void *pvParameters )
{
// 获取USB串口、RS485串口(串口4)设备结构体
struct UART_Device *pUSBUART = GetUARTDevice("usb");
struct UART_Device *pRS485UART = GetUARTDevice("uart4");
uint8_t data; // 存储单字节收发数据
while (1)
{
// 阻塞读取USB串口数据(超时无限等待)
if (0 == pUSBUART->RecvByte(pUSBUART, &data, portMAX_DELAY))
{
// 将读取到的数据转发至RS485串口(超时100ms)
pRS485UART->Send(pRS485UART, &data, 1, 100);
}
}
}
// FreeRTOS初始化函数:完成串口设备初始化
void MX_FREERTOS_Init(void) {
// 获取USB串口、RS485串口(串口4)设备结构体
struct UART_Device *pUSBUART = GetUARTDevice("usb");
struct UART_Device *pRS485UART = GetUARTDevice("uart4");
// 初始化USB串口:波特率115200、无校验、8数据位、1停止位
pUSBUART->Init(pUSBUART, 115200, 'N', 8, 1);
// 初始化RS485串口(串口4):参数与USB串口一致
pUSBUART->Init(pRS485UART, 115200, 'N', 8, 1);
}
四、STM32F030 端代码实现:串口收发 + LED 控制
基于上一篇完成的串口封装代码,F030 端创建测试任务,核心逻辑为 “接收串口数据并回发,根据数据指令控制对应 LED 翻转”,以此验证串口收发功能:
void StartDefaultTask(void *argument)
{
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
// 获取串口1设备结构体
struct UART_Device *pdev = GetUARTDevice("uart1");
// 初始化串口1:波特率115200、无校验、8数据位、1停止位
pdev->Init(pdev, 115200, 'N', 8, 1);
uint8_t data; // 存储接收的单字节数据
int levels[3] = {0}; // 存储3个LED的电平状态(初始为0)
while (1)
{
// 阻塞读取串口1数据(超时无限等待)
if (0 == pdev->RecvByte(pdev, &data, portMAX_DELAY))
{
// 将接收的数据回发(验证发送功能)
pdev->Send(pdev, &data, 1, 100);
// 根据接收的数据控制对应LED翻转
switch (data)
{
case 1:
{
// 控制PB11引脚LED(红灯)翻转
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, levels[0]);
levels[0] = !levels[0];
break;
}
case 2:
{
// 控制PB12引脚LED(绿灯)翻转
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, levels[1]);
levels[1] = !levels[1];
break;
}
case 3:
{
// 控制PB13引脚LED(蓝灯)翻转
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, levels[2]);
levels[2] = !levels[2];
break;
}
}
}
}
/* USER CODE END StartDefaultTask */
}
五、测试验证:PC→H5→F030 控制流程
1. 烧录与连接
- 通过调试器将代码分别烧录至 STM32H5、STM32F030 开发板;
- 硬件连接:H5 的 USB 接口与 PC 相连,H5 串口 4(RS485)与 F030 串口 1(RS485)相连,F030 通过板载 USB 供电。
2. 测试现象
PC 向 H5 发送指定指令,可实现对 F030 板载 LED 的精准控制:
- 发送指令
01:F030 红灯(PB11)熄灭 / 点亮; - 发送指令
02:F030 绿灯(PB12)熄灭 / 点亮; - 发送指令
03:F030 蓝灯(PB13)熄灭 / 点亮。
该流程完整实现了 “PC→H5(中控)→F030(下位机)” 的层级控制,验证了 F030 串口收发功能的有效性。
发送03控制蓝灯熄灭 / 点亮的测试效果如下:

六、总结
- 借助 STM32H5 开发板实现 USB 转 485 中转,解决了测试中缺少专用转换模块的问题;
- H5 端双向转发任务实现了 PC 与 F030 的数据透传,保障通信链路闭环;
- F030 端通过 “串口收发 + LED 控制” 验证了串口封装代码的有效性;
- 完成了 PC→H5→F030 的层级控制流程,为后续 Modbus 传感器开发奠定基础。
七、结尾
本次测试通过 H5 中转的创新方案,成功验证了 STM32F030 串口收发功能的稳定性,实现了 PC 对下位机的远程 LED 控制,完整跑通了低成本 Modbus 传感器的基础通信链路。这套中转测试方案无需额外硬件,可直接复用至各类嵌入式串口测试场景。感谢各位的阅读,持续关注本系列笔记,一起完成低成本 Modbus 传感器从串口测试到协议落地的全流程开发!
更多推荐
所有评论(0)