3.24_433_RX版本:封装RF433模块,完成开机进入TX/RX模式并在开发板验证成功

This commit is contained in:
2026-03-24 16:59:20 +08:00
commit e439dd465e
1311 changed files with 692196 additions and 0 deletions

239
Core/Src/rf433_tx_app.c Normal file
View File

@ -0,0 +1,239 @@
/**
******************************************************************************
* @file rf433_tx_app.c
* @brief RF433 TX应用层实现
******************************************************************************
*/
#include "rf433_config.h"
#if (RF433_MODE == RF433_MODE_TX) || (RF433_MODE == RF433_MODE_BOTH)
#include "rf433_tx_app.h"
#include "rf433.h"
#include "main.h"
#include <stdio.h>
#include <string.h>
/* ============================================================================
* 私有变量
* ============================================================================ */
static rf433_tx_app_t g_tx_app = {0};
/* ============================================================================
* 私有函数声明
* ============================================================================ */
/**
* @brief 构造数据包
* @param buffer 数据包缓冲区
* @param buffer_size 缓冲区大小
* @param total_count 总次数
* @param current_count 当前序号
* @return 实际数据包长度
*/
static uint16_t tx_build_packet(uint8_t *buffer, uint16_t buffer_size,
uint32_t total_count, uint32_t current_count);
/**
* @brief 控制LED_TX指示灯
* @param state 0: 关闭, 1: 打开
*/
static void tx_led_control(uint8_t state);
/* ============================================================================
* 私有函数实现
* ============================================================================ */
static uint16_t tx_build_packet(uint8_t *buffer, uint16_t buffer_size,
uint32_t total_count, uint32_t current_count)
{
if (buffer == NULL || buffer_size < 16) {
return 0;
}
// 数据包格式: "TX.总次数.当前序号."
// 例如: "TX.010.001."
int len = snprintf((char *)buffer, buffer_size, "TX.%03lu.%03lu.",
total_count, current_count);
return (len > 0) ? (uint16_t)len : 0;
}
static void tx_led_control(uint8_t state)
{
// LED_TX控制 - 使用gpio.c中定义的函数
if (state) {
gpio_led_tx_on(); // 打开LED_TX
} else {
gpio_led_tx_off(); // 关闭LED_TX
}
}
/* ============================================================================
* 公共API实现
* ============================================================================ */
rf433_error_t rf433_tx_app_init(const rf433_register_t *config)
{
if (config == NULL) {
return RF433_ERROR;
}
// 初始化TX应用结构体
memset(&g_tx_app, 0, sizeof(rf433_tx_app_t));
g_tx_app.state = TX_STATE_INIT;
g_tx_app.is_running = false;
// 保存配置
memcpy(&g_tx_app.config, config, sizeof(rf433_register_t));
// 配置RF433模块
rf433_error_t ret = rf433_set_config(&g_tx_app.config);
if (ret != RF433_OK) {
return ret;
}
// 设置为透明传输模式
ret = rf433_set_work_mode(RF433_WORK_MODE_TRANSPARENT);
if (ret != RF433_OK) {
return ret;
}
return RF433_OK;
}
rf433_error_t rf433_tx_app_start(uint32_t count, uint32_t interval_ms)
{
if (count == 0 || interval_ms == 0) {
return RF433_ERROR;
}
g_tx_app.total_count = count;
g_tx_app.send_count = 0;
g_tx_app.send_interval_ms = interval_ms;
g_tx_app.last_send_time = 0;
g_tx_app.state = TX_STATE_INIT;
g_tx_app.is_running = true;
return RF433_OK;
}
rf433_error_t rf433_tx_app_stop(void)
{
g_tx_app.is_running = false;
g_tx_app.state = TX_STATE_IDLE;
tx_led_control(0);
return RF433_OK;
}
rf433_error_t rf433_tx_app_manual_send(uint8_t *data, uint16_t length)
{
if (data == NULL || length == 0) {
return RF433_ERROR;
}
// 发送数据
rf433_error_t ret = rf433_transmit(data, length);
if (ret == RF433_OK) {
// LED闪烁指示
tx_led_control(1);
HAL_Delay(50);
tx_led_control(0);
}
return ret;
}
void rf433_tx_app_task(void)
{
if (!g_tx_app.is_running) {
return;
}
uint32_t current_time = HAL_GetTick();
switch (g_tx_app.state) {
case TX_STATE_INIT:
// 初始化完成,进入发送状态
g_tx_app.state = TX_STATE_SENDING;
break;
case TX_STATE_SENDING:
// 检查是否达到发送次数
if (g_tx_app.send_count >= g_tx_app.total_count) {
g_tx_app.state = TX_STATE_IDLE;
tx_led_control(0);
break;
}
// 检查发送间隔
if (current_time - g_tx_app.last_send_time >= g_tx_app.send_interval_ms) {
// 构造数据包
uint8_t packet[32];
uint16_t packet_len = tx_build_packet(packet, sizeof(packet),
g_tx_app.total_count,
g_tx_app.send_count + 1);
if (packet_len > 0) {
// 发送数据
rf433_error_t ret = rf433_transmit(packet, packet_len);
if (ret == RF433_OK) {
g_tx_app.send_count++;
g_tx_app.last_send_time = current_time;
// LED闪烁指示
tx_led_control(1);
HAL_Delay(50);
tx_led_control(0);
}
}
g_tx_app.state = TX_STATE_WAITING;
}
break;
case TX_STATE_WAITING:
// 等待一段时间后继续发送
if (current_time - g_tx_app.last_send_time >= g_tx_app.send_interval_ms) {
g_tx_app.state = TX_STATE_SENDING;
}
break;
case TX_STATE_IDLE:
// 空闲状态,不做任何操作
break;
default:
g_tx_app.state = TX_STATE_IDLE;
break;
}
}
tx_state_t rf433_tx_app_get_state(void)
{
return g_tx_app.state;
}
uint32_t rf433_tx_app_get_send_count(void)
{
return g_tx_app.send_count;
}
uint32_t rf433_tx_app_get_total_count(void)
{
return g_tx_app.total_count;
}
void rf433_tx_app_reset_count(void)
{
g_tx_app.send_count = 0;
g_tx_app.last_send_time = 0;
if (g_tx_app.is_running) {
g_tx_app.state = TX_STATE_SENDING;
}
}
#endif /* (RF433_MODE == RF433_MODE_TX) || (RF433_MODE == RF433_MODE_BOTH) */