3.27_433:添加UART2调试打印、IO监控、指令解析和继电器控制模块。

能够接收UART2指令控制继电器开关,或向UART2发送四路IO输入状态,并使用轮询方式检测IO状态进行及时反馈。
This commit is contained in:
2026-03-27 10:09:13 +08:00
parent f548593c59
commit 71027ebc46
76 changed files with 6789 additions and 1803 deletions

274
docs/integration_guide.md Normal file
View File

@ -0,0 +1,274 @@
/**
******************************************************************************
* @file integration_guide.md
* @brief 应用层模块集成指南
* @author Application Layer
* @version 1.0
******************************************************************************
* @attention
* 本文档说明如何将uart2_print、io_monitor、cmd_parser、relay_control
* 四个模块集成到现有工程中。
******************************************************************************
*/
# 应用层模块集成指南
## 一、文件清单
### 新增文件
| 文件路径 | 说明 |
|---------|------|
| `Core/Inc/uart2_print.h` | UART2打印模块头文件 |
| `Core/Src/uart2_print.c` | UART2打印模块实现 |
| `Core/Inc/io_monitor.h` | IO监控模块头文件 |
| `Core/Src/io_monitor.c` | IO监控模块实现 |
| `Core/Inc/cmd_parser.h` | 指令解析模块头文件 |
| `Core/Src/cmd_parser.c` | 指令解析模块实现 |
| `Core/Inc/relay_control.h` | 继电器控制模块头文件 |
| `Core/Src/relay_control.c` | 继电器控制模块实现 |
### 需要修改的文件
| 文件路径 | 修改内容 |
|---------|---------|
| `Core/Src/main.c` | 添加头文件引用、初始化调用、主循环任务 |
| `Core/Src/usart.c` | 添加UART2接收中断处理 |
| `Core/Src/stm32f1xx_it.c` | 添加UART2接收缓冲变量 |
---
## 二、main.c 修改说明
### 2.1 在 `USER CODE BEGIN Includes` 区域添加
```c
/* USER CODE BEGIN Includes */
#include "rf433.h"
#include "rf433_config.h"
#include "rf433_hal.h"
/* 应用层模块头文件 */
#include "uart2_print.h"
#include "io_monitor.h"
#include "cmd_parser.h"
#include "relay_control.h"
#if (RF433_MODE == RF433_MODE_TX) || (RF433_MODE == RF433_MODE_BOTH)
#include "rf433_tx_app.h"
#endif
#if (RF433_MODE == RF433_MODE_RX) || (RF433_MODE == RF433_MODE_BOTH)
#include "rf433_rx_app.h"
#endif
/* USER CODE END Includes */
```
### 2.2 在 `USER CODE BEGIN PV` 区域添加
```c
/* USER CODE BEGIN PV */
static uint8_t uart2_rx_byte = 0;
/* USER CODE END PV */
```
### 2.3 在 `USER CODE BEGIN 2` 区域修改
```c
/* USER CODE BEGIN 2 */
/* 初始化应用层模块 */
UART2_Print_Init();
IO_Monitor_Init();
CmdParser_Init();
Relay_Init();
/* 启动UART2接收中断 */
HAL_UART_Receive_IT(&huart2, &uart2_rx_byte, 1);
/* 初始化RF433模块 - 使用默认配置 */
rf433_init(NULL);
/* 启动UART接收 - 使用rf433_hal中的临时变量 */
HAL_UART_Receive_IT(&huart1, &rf433_uart_rx_tmp, 1);
/* 根据配置模式初始化TX/RX应用层 */
#if (RF433_MODE == RF433_MODE_TX) || (RF433_MODE == RF433_MODE_BOTH)
/* TX模式初始化 */
rf433_tx_app_init(NULL);
rf433_tx_app_start(RF433_DEFAULT_TX_COUNT, RF433_DEFAULT_TX_INTERVAL);
#endif
#if (RF433_MODE == RF433_MODE_RX) || (RF433_MODE == RF433_MODE_BOTH)
/* RX模式初始化 */
rf433_rx_app_init(NULL);
rf433_rx_app_start();
#endif
/* 打印启动信息 */
UART2_Print_Printf("\r\n========================================\r\n");
UART2_Print_Printf("E32-433TBH-SC Application Started\r\n");
UART2_Print_Printf("System Clock: %d MHz\r\n", SystemCoreClock / 1000000);
UART2_Print_Printf("========================================\r\n");
/* USER CODE END 2 */
```
### 2.4 在 `USER CODE BEGIN 3` 区域修改
```c
/* USER CODE BEGIN 3 */
/* 应用层任务处理 */
UART2_Print_Task();
IO_Monitor_Task();
CmdParser_Task();
#if (RF433_MODE == RF433_MODE_TX) || (RF433_MODE == RF433_MODE_BOTH)
/* TX任务 */
rf433_tx_app_task();
#endif
#if (RF433_MODE == RF433_MODE_RX) || (RF433_MODE == RF433_MODE_BOTH)
/* RX任务 */
rf433_rx_app_task();
#endif
/* USER CODE END 3 */
```
### 2.5 在 `USER CODE BEGIN 4` 区域添加
```c
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART1)
{
/* 调用RF433模块的UART接收回调 */
rf433_hal_uart_rxcplt_callback();
}
else if (huart->Instance == USART2)
{
/* 喂入指令解析器 */
CmdParser_FeedByte(uart2_rx_byte, HAL_GetTick());
/* 重新启动接收 */
HAL_UART_Receive_IT(&huart2, &uart2_rx_byte, 1);
}
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART2)
{
/* 调用UART2打印模块的发送完成回调 */
UART2_Print_TxCpltCallback();
}
}
/* USER CODE END 4 */
```
---
## 三、usart.c 修改说明
### 3.1 删除原有的 `HAL_UART_RxCpltCallback` 函数
原有的回调函数在 `USER CODE BEGIN 1` 区域,需要删除:
```c
/* USER CODE BEGIN 1 */
// 删除以下代码
// void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
// {
// if (huart->Instance == USART1)
// {
// rf433_hal_uart_rxcplt_callback();
// }
// }
/* USER CODE END 1 */
```
改为:
```c
/* USER CODE BEGIN 1 */
/* UART回调函数已移至main.c统一管理 */
/* USER CODE END 1 */
```
---
## 四、Keil工程配置
### 4.1 添加源文件到工程
1. 打开Keil工程 `MDK-ARM/project.uvprojx`
2. 在Project窗口中右键点击 `Application/User/Core` 分组
3. 选择 `Add Existing Files...`
4. 添加以下文件:
- `Core/Src/uart2_print.c`
- `Core/Src/io_monitor.c`
- `Core/Src/cmd_parser.c`
- `Core/Src/relay_control.c`
### 4.2 添加头文件路径
1. 点击工程设置图标(魔术棒)
2. 切换到 `C/C++` 标签页
3.`Include Paths` 中确认 `Core/Inc` 已在路径中
---
## 五、测试验证
### 5.1 编译工程
编译应无错误,如有警告请检查:
- 头文件路径是否正确
- 源文件是否已添加到工程
### 5.2 下载运行
下载程序后通过串口调试助手连接UART2115200bps应看到
```
========================================
E32-433TBH-SC Application Started
System Clock: 72 MHz
========================================
[UART2] Init OK, buffer size: 256
[IO] Init OK, initial states: 0x00
[CMD] Init OK
[RELAY] Init OK, state=OFF
```
### 5.3 指令测试
发送以下指令测试:
```
$RL,1,1*FF\r\n 打开继电器1
$RL,1,0*FF\r\n 关闭继电器1
$DI,0*FF\r\n 查询所有DI状态
$DI,1*FF\r\n 查询DI1状态
$ECHO*FF\r\n 心跳测试
```
---
## 六、注意事项
1. **不要修改HAL初始化代码**`MX_GPIO_Init``MX_USARTx_UART_Init` 等函数由CubeMX生成不应手动修改
2. **中断优先级**UART1优先级为0UART2优先级为1UART3优先级为2已按计划配置
3. **调试开关**:各模块开头有 `DEBUG_xxx`设为1启用调试日志设为0禁用
4. **缓冲区大小**`UART2_TX_BUFFER_SIZE` 默认256字节可根据需要调整
5. **去抖参数**`IO_DEBOUNCE_COUNT` 默认3次`IO_SCAN_PERIOD_MS` 默认10ms