Files
ManGoWalk_STM32/fun/HCBle.c

140 lines
2.9 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传输完成中断
**/
// 外部变量引入区
extern UART_HandleTypeDef huart1;
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;
//初始化DMA接收函数
void HCBle_InitDMAReception(void)
{
HAL_UART_Receive_DMA(&huart1,uart_dma_rx_buf,UART_DMA_RX_BUF_SIZE);
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE); //使用空闲中断
}
// 发送数据
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(&huart1,(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(&huart1, (uint8_t *)HC_Send_Data, strlen(HC_Send_Data));
#endif
}
// 对于发送数据 可以加入一个DMA
// 蓝牙数据接收
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
if(rx_data == '\n')
{
if(rx_index > 0)
{
HC_Recevie[rx_index] = '\0';
data_received = 1;
rx_index = 0; //我认为接收完字符串后 把字符传给别的处理后 需要清除这里的字符串 memset
}else if(rx_index < RX_DataSize - 1)
{
}else
{
rx_index = 0; //缓冲区溢出,重置
memset(HC_Recevie,'\0',RX_DataSize);
}
}
HAL_UART_Receive_IT(huart,&rx_data,1);
}
}
// 接下来就是定义 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);
//SetMotorSpeed(cmd.LeftSpeed, cmd.RightSpeed); 后续加入
}
in_frame = 0;
idx = 0;
}
} else {
// 超出缓冲区,强制重启
in_frame = 0;
idx = 0;
}
}
}
}