3.24_433_RX版本:封装RF433模块,完成开机进入TX/RX模式并在开发板验证成功
This commit is contained in:
239
Core/Src/rf433_tx_app.c
Normal file
239
Core/Src/rf433_tx_app.c
Normal 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) */
|
||||
Reference in New Issue
Block a user