generated from Template/H563ZI-HAL-CMake-Template
133 lines
2.7 KiB
C
133 lines
2.7 KiB
C
#include "HCBle.h"
|
|
|
|
// 外部变量引入区
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|