Files
ManGoWalk_STM32/fun/HCBle.c

184 lines
4.6 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "HCBle.h"
/**
提示: 虽然 BLE 以及 GPS都是DMA+ UART接收但是它们都有所不同
BLE --- DMA + IDLE 中断 循环 DMA + 空闲中断触发处理 UART IDLE
GPS --- DMA +固定长度 + TC中断 设置固定长度 DMA DMA传输完成中断
#{
"lat": 23.123456,
"lon": 113.654321,
"angle": 95.0
}\n
**/
// 外部变量引入区
extern UART_HandleTypeDef huart4;
extern DMA_HandleTypeDef handle_GPDMA1_Channel5;
extern DMA_HandleTypeDef handle_GPDMA1_Channel4;
/*
变量定义区
*/
char HC_Send_Data[128];
uint8_t HC_Recevie[RX_DataSize]; // 蓝牙接收缓存
volatile uint16_t rx_index = 0; //作为接收字符串指针
volatile uint8_t data_received = 0; // 0 --- 未接收 1 --- 接收
uint8_t rx_data; //接收字符
// dma
uint8_t uart_dma_rx_buf[UART_DMA_RX_BUF_SIZE];
RingBuffer ble_rx_ring = {0}; //初始化
MotorCommand cmd;
LocationData current_location = {0};
float imu_angle = 0.0f;
//初始化DMA接收函数
void HCBle_InitDMAReception(void)
{
HAL_UARTEx_ReceiveToIdle_DMA(&huart4, uart_dma_rx_buf, UART_DMA_RX_BUF_SIZE);
// 只需要直接打开 串口空闲接收
// HAL_UARTEx_RxEventCallback --- 到时候会回调
}
// 发送数据
void HCBle_SendData(char *p,...)
{
va_list ap;
va_start(ap,p);
vsprintf(HC_Send_Data,p,ap);
va_end(ap);
// 编译控制
#ifdef DEBUG_EN
// 信息输出接口
HAL_UART_Transmit(&huart4,(uint8_t *)HC_Send_Data,strlen(HC_Send_Data),100);
// HAL_UART_Transmi(&huart1,(uint8_t *)formatBuf,strlen(formatBuf),1);
// 对于没有使用中断的串口发送,是需要加入一个阻塞的
#else
HAL_UART_Transmit_DMA(&huart4, (uint8_t *)HC_Send_Data, strlen(HC_Send_Data));
#endif
}
// 对于发送数据 可以加入一个DMA
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
if (huart->Instance == UART4)
{
uint16_t data_len = UART_DMA_RX_BUF_SIZE - __HAL_DMA_GET_COUNTER(huart->hdmarx);
for (uint16_t i = 0; i < data_len; i++)
{
ble_rx_ring.buffer[ble_rx_ring.head] = uart_dma_rx_buf[i];
ble_rx_ring.head = (ble_rx_ring.head + 1) % RING_BUFFER_SIZE;
}
// memset(uart_dma_rx_buf, '\0', data_len);
// 将接收到的数据 uart_rx_buf[0..Size-1] 拷贝到环形缓冲区等处理逻辑
HAL_UARTEx_ReceiveToIdle_DMA(&huart4, uart_dma_rx_buf, UART_DMA_RX_BUF_SIZE);
// 重新启动接收HAL库自动做了
}
}
// 接下来就是定义 Json数据处理 以及 发送数据给手机App
// Json数据解析 后续使用到Thread x 进行解析
void HCBle_ExtractAndParseFrame(void)
{
static char json_buf[128];
static int idx = 0;
static int in_frame = 0;
while (ble_rx_ring.tail != ble_rx_ring.head)
{
char c = ble_rx_ring.buffer[ble_rx_ring.tail];
ble_rx_ring.tail = (ble_rx_ring.tail + 1) % RING_BUFFER_SIZE;
// 帧开始:#
if (c == '#') {
idx = 0;
in_frame = 1;
json_buf[idx++] = c;
}
else if (in_frame) {
if (idx < sizeof(json_buf) - 1) {
json_buf[idx++] = c;
// 帧结束:\n
if (c == '\n') {
json_buf[idx] = '\0';
// ? JSON处理
if (strstr(json_buf, "leftSpeed") && strstr(json_buf, "rightSpeed")) {
sscanf(json_buf, "#{\"leftSpeed\":%d,\"rightSpeed\":%d}", &cmd.LeftSpeed, &cmd.RightSpeed);
tx_event_flags_set(&system_events,EVENT_BLE_COMMAND_RECEIVED,TX_OR);
//SetMotorSpeed(cmd.LeftSpeed, cmd.RightSpeed); 后续加入
HCBle_SendData("左=%d, 右=%d\r\n", cmd.LeftSpeed, cmd.RightSpeed);
}
in_frame = 0;
idx = 0;
}
} else {
// 超出缓冲区,强制重启
in_frame = 0;
idx = 0;
}
}
}
}
// BLE接收任务
void ble_rx_task_entry(ULONG thread_input)
{
HCBle_InitDMAReception();
HCBle_SendData("BLE RX 任务已启动\r\n");
while(1)
{
// 处理接收到的数据
HCBle_ExtractAndParseFrame(); //提取并解析JSON命令
tx_thread_sleep(10); //每10ms轮询1次
}
}
// "#{\"lat\":%.6f,\"lon\":%.6f,\"angle\":%.2f}\n",23.123456, 113.654321, 95.0);
// HCBle_SendData("#{\"lat\":%.6f,\"lon\":%.6f,\"angle\":%.2f}\n",
// current_location.lat, current_location.lon, current_location.angle);
void ble_tx_task_entry(ULONG thread_input) {
BLE_Message msg;
HCBle_SendData("BLE TX 任务已启动\r\n");
while(1) {
HCBle_SendData("fuck");
if (tx_queue_receive(&ble_tx_queue, &msg, TX_WAIT_FOREVER) == TX_SUCCESS) {
switch (msg.msg_type)
{
case 1: // 周期性定位上报
HCBle_SendData("#{\"lat\":%.6f,\"lon\":%.6f,\"angle\":%.2f}\n",23.123456, 113.654321, 95.0);
break;
case 2: // ACK 或提示类
HCBle_SendData("%s", msg.data);
break;
default:
HCBle_SendData("未知类型消息\n");
break;
}
}
}
}