实现基本串口回传

This commit is contained in:
OPTOC
2025-08-20 11:28:11 +08:00
parent 0bd610ccd4
commit c704bbd24b
7 changed files with 338 additions and 6 deletions

View File

@@ -7,7 +7,7 @@ list(APPEND incs "../components/system/source/shell")
list(APPEND incs "drivers/data_port/usb-host")
list(APPEND incs "drivers/data_port/ble_spp")
list(APPEND incs "drivers/data_port/socket_inet")
list(APPEND incs "drivers/sertrf")
list(APPEND srcs "app_main.c")
@@ -26,6 +26,10 @@ list(APPEND srcs "config/app_log.c")
list(APPEND srcs "utils/crc.c")
list(APPEND srcs "utils/sb_aes.c")
list(APPEND srcs "drivers/sertrf/sertrf.c")
list(APPEND srcs "drivers/sertrf/device.c")
if(CONFIG_BUILD_BLE)
list(APPEND srcs "drivers/data_port/ble_spp/ble_spp_server.c")
list(APPEND srcs "drivers/data_port/ble_spp/ble_spp_server_shell.c")

View File

@@ -20,7 +20,7 @@
/* 驱动 */
#include "drivers/ws2812_spi/ws2812_spi.h"
#include "drivers/ws2812_spi/ws2812_spi_shell.h"
#include "drivers/sertrf/sertrf.h"
/* 通用模块 */
#include "button/button.h"
@@ -66,7 +66,9 @@ void work_app_main(void *arg)
// lib_shell_register(); // 静态库接口命令
/* 初始化按键检测和控制 */
btn_attach(&g_cfg_board->key_reset, _change_mode_event_button, EVENT_PRESS_UP | EVENT_PRESS_DOWN | EVENT_LONG_PRESS_HOLD);
// btn_attach(&g_cfg_board->key_reset, _change_mode_event_button, EVENT_PRESS_UP | EVENT_PRESS_DOWN | EVENT_LONG_PRESS_HOLD);
sertrf_init();
/* 启动 shell */
os_thread_sleep(100);

View File

@@ -64,13 +64,13 @@ void ble_server_shell_register(void)
sb_data_port_start(s_cm.port_ble_cmd);
sb_data_port_start(s_cm.port_ble_val);
// ble cmd通道读取
os_work_create(&s_cm.s_work_hdl_cmd, "work-read", _work_read_handler, s_cm.port_ble_cmd, OS_PRIORITY_LOWEST);
os_work_submit(default_os_work_q_hdl, &s_cm.s_work_hdl_cmd, 0);
// ble 数据通道读取
os_work_create(&s_cm.s_work_hdl_val, "work-read", _work_read_handler, s_cm.port_ble_val, OS_PRIORITY_LOWEST);
os_work_submit(default_os_work_q_hdl, &s_cm.s_work_hdl_val, 0);
// 速度
os_work_create(&s_cm.s_speed_work_hdl, "work-speed", _work_speed_handler, NULL, OS_PRIORITY_LOWEST);
os_work_submit(default_os_work_q_hdl, &s_cm.s_speed_work_hdl, 0);
}

117
app/drivers/sertrf/device.c Normal file
View File

@@ -0,0 +1,117 @@
#include "device.h"
#include "config/board_config.h"
uint8_t device_init(device_t *port)
{
uint8_t res = DEVICE_OK;
#if UART_ENABLE
res = uart_init(&port->init_device);
if(res)
{
SYS_LOG_WRN("device start uart error");
return DEVICE_UART_ERROR;
}
#endif
#if BLE_ENABLE
res = ble_init(&port->init_device);
if(res)
{
SYS_LOG_WRN("ble init error");
return DEVICE_BLE_ERROR;
}
#endif
#if WIFI_ENABLE
res = wifi_init(&port->init_device);
if(res)
{
SYS_LOG_WRN("wifi init error");
return DEVICE_WIFI_ERROR;
}
#endif
//默认选择串口
res = embedded_device_choice(port, DATA_PORT_TYPE_UART);
if(res == DEVICE_EMBEDDED_ERROR)
{
SYS_LOG_ERR("embedded device choice error");
}
return DEVICE_OK;
}
uint8_t uart_init(init_device_t *port)
{
// port->uart_port = sb_uart_port_bind(g_cfg_board->uart_fc.id, g_cfg_board->uart_fc.br, g_cfg_board->uart_fc.pin_txd.pin, g_cfg_board->uart_fc.pin_rxd.pin, g_cfg_board->uart_fc.irq_prior, 1024, 0, NULL);
port->uart_port = sb_uart_port_bind(1, 115200, 0, 10, 21, 1024, 0, NULL);
if(port->uart_port == NULL)
{
SYS_LOG_WRN("uart init error");
return 1;
}
if(sb_data_port_start(port->uart_port))
{
SYS_LOG_WRN("uart start error");
return 1;
}
return DEVICE_OK;
}
uint8_t ble_init(init_device_t *port)
{
return DEVICE_OK;
}
uint8_t wifi_init(init_device_t *port)
{
return DEVICE_OK;
}
uint8_t embedded_device_choice(device_t *port, uint8_t type)
{
//端口与PC一致
if(port->pc_device_type == type)
{
SYS_LOG_WRN("pc Port consistency");
return DEVICE_WRN_EMBEDDED_TYPE;
}
port->embedded_device_type = type;
switch (port->embedded_device_type)
{
case DATA_PORT_TYPE_UART:
port->embedded_device = port->init_device.uart_port;
break;
case DATA_PORT_TYPE_WIFI:
port->embedded_device = port->init_device.wifi;
break;
case DATA_PORT_TYPE_BLE_CMD:
port->embedded_device = port->init_device.ble_spp_server_cmd;
break;
case DATA_PORT_TYPE_BLE_VAL:
port->embedded_device = port->init_device.ble_spp_server_val;
break;
default:
break;
}
if(port->embedded_device == NULL)
{
SYS_LOG_WRN("embedded device choice error");
return DEVICE_EMBEDDED_ERROR;
}
return DEVICE_OK;
}
int embedded_device_read(device_t *port, void *buffer, uint32_t length)
{
return sb_data_port_read(port->embedded_device, buffer, length, 0);
}
int embedded_device_write(device_t *port, void *buffer, uint32_t length)
{
return sb_data_port_write(port->embedded_device, buffer, length, 0);
}
uint32_t embedded_device_get_rx_length(device_t *port)
{
return sb_data_port_get_rx_length(port->embedded_device);
}

131
app/drivers/sertrf/device.h Normal file
View File

@@ -0,0 +1,131 @@
#pragma once
#include "../data_port/uart/uart_port.h"
#include "../data_port/sb_data_port.h"
#include "../data_port/ble_spp/ble_spp_server.h"
#include "../data_port/ble_spp/ble_spp_client.h"
#include "../data_port/socket_inet/socket_inet_server_shell.h"
#include "../data_port/socket_inet/wifi.h"
#include "sys_log.h"
#define UART_ENABLE 1
#define BLE_ENABLE 0
#define WIFI_ENABLE 0
enum DEVICE_ERROR
{
DEVICE_OK = 0,
DEVICE_UART_ERROR,
DEVICE_BLE_ERROR,
DEVICE_WIFI_ERROR,
DEVICE_EMBEDDED_ERROR,
DEVICE_PC_ERROR,
DEVICE_WRN_EMBEDDED_TYPE = 110,
DEVICE_WRN_PC_TYPE
};
enum DATA_PORT_TYPE
{
DATA_PORT_TYPE_UART = 1,
DATA_PORT_TYPE_WIFI,
DATA_PORT_TYPE_BLE_CMD,
DATA_PORT_TYPE_BLE_VAL
};
typedef struct
{
sb_data_port_t* uart_port;
sb_data_port_t* ble_spp_server_cmd;
sb_data_port_t* ble_spp_server_val;
sb_data_port_t* ble_spp_client_cmd;
sb_data_port_t* ble_spp_client_val;
sb_data_port_t* wifi;
}init_device_t;
typedef struct
{
uint8_t embedded_device_type;
uint8_t pc_device_type;
sb_data_port_t* embedded_device;
sb_data_port_t* pc_device;
init_device_t init_device;
// int (*embedded_read)(device_t *port, void *buffer, uint32_t length);
// int (*embedded_write)(device_t *port, const void *data, uint32_t size);
}device_t;
/**
* @brief 初始化设备
*
* @param port 由对应的驱动提供的绑定接口获得的句柄
* @retval 0 成功
*/
uint8_t device_init(device_t *port);
/**
* @brief UART 初始化
*
* @param port 由对应的驱动提供的绑定接口获得的句柄
* @retval 0 成功
*/
uint8_t uart_init(init_device_t *port);
/**
* @brief 蓝牙 初始化
*
* @param port 由对应的驱动提供的绑定接口获得的句柄
* @retval 0 成功
*/
uint8_t ble_init(init_device_t *port);
/**
* @brief WIFI 初始化
*
* @param port 由对应的驱动提供的绑定接口获得的句柄
* @retval 0 成功
*/
uint8_t wifi_init(init_device_t *port);
/**
* @brief 嵌入式设备数据接口
*
* @param port 由对应的驱动提供的绑定接口获得的句柄
* @param type 对应的数据接口类型
* @retval 0 成功
*/
uint8_t embedded_device_choice(device_t *port, uint8_t type);
/**
* @brief PC OR 手机数据接口
*
* @param port 由对应的驱动提供的绑定接口获得的句柄
* @param type 对应的数据接口类型
* @retval 0 成功
*/
uint8_t pc_device_choice(device_t *port, uint8_t type);
/**
* @brief 嵌入式设备数据接口读操作
*
* @param port 由对应的驱动提供的绑定接口获得的句柄
* @param buffer 读取数据缓存
* @param length 读取数据长度
* @retval < 0 操作失败或在指定的时间内未满足指定的操作长度
* @retval >= 0 实际已缓存的长度
*/
int embedded_device_read(device_t *port, void *buffer, uint32_t length);
/**
* @brief 嵌入式设备数据接口写操作
*
* @param port 由对应的驱动提供的绑定接口获得的句柄
* @param data 写入数据
* @param size 写入数据长度
* @retval < 0 操作失败或在指定的时间内未满足指定的操作长度
* @retval >= 0 实际已缓存的长度
*/
int embedded_device_write(device_t *port, void *buffer, uint32_t length);
/**
* @brief 嵌入式设备数据接口写操作
*
* @param port 由对应的驱动提供的绑定接口获得的句柄
* @param data 写入数据
* @param size 写入数据长度
* @retval 缓存中可读取的字节数
*/
uint32_t embedded_device_get_rx_length(device_t *port);

View File

@@ -0,0 +1,41 @@
#include "sertrf.h"
sertrf_t sertrf;
void sertrf_init(void)
{
uint8_t res = 0;
res = device_init(&sertrf.device);
if(!res)
{
SYS_LOG_WRN("device init error");
}
sertrf_start();
}
void sertrf_start(void)
{
os_thread_create(&sertrf.embedded_thread,
"embedded_thread",
embedded_thread,
NULL,
4096,
20);
}
void embedded_thread(void* arg)
{
while(true)
{
uint32_t embedded_size = embedded_device_get_rx_length(&sertrf.device);
if(embedded_size > 0)
{
uint8_t data[embedded_size];
embedded_device_read(&sertrf.device, data, embedded_size);
SYS_LOG_INF("data : %s", data);
embedded_device_write(&sertrf.device, data, embedded_size);
}
//需要添加一些延时,否则会卡死,导致看门狗复位
// vTaskDelay(( TickType_t ) 1000 / configTICK_RATE_HZ);
os_thread_sleep(1);
}
}

View File

@@ -0,0 +1,37 @@
#pragma once
#include "device.h"
typedef struct
{
device_t device;
os_thread_t embedded_thread;
}sertrf_t;
/**
* @brief 模块初始化
*/
void sertrf_init(void);
/**
* @brief 模块启动
*/
void sertrf_start(void);
/**
* @brief 模块停止
*/
void sertrf_stop(void);
/**
* @brief 模块数据查看
*/
void sertrf_status(void);
/**
* @brief embedded thread
*/
void embedded_thread(void* arg);