#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_UART_Receive_DMA(&huart4,uart_dma_rx_buf,UART_DMA_RX_BUF_SIZE); __HAL_UART_ENABLE_IT(&huart4,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(&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_UART_RxCpltCallback(UART_HandleTypeDef *huart) //{ // if(huart->Instance == UART4) // { // 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 uint8_t flag; // 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; } } } } #ifdef TEST //定义在app_thread.h中 // BLE接收任务 void ble_rx_task_entry(ULONG thread_input) { HCBle_InitDMAReception(); HCBle_SendData("BLE RX 任务已启动\r\n"); while(1) { // 处理接收到的数据 HCBle_ExtractAndParseFrame(); tx_thread_sleep(10); } } void ble_tx_task_entry(ULONG thread_input) { BLE_Message msg; HCBle_SendData("BLE TX 任务已启动\r\n"); while(1) { if (tx_queue_receive(&ble_tx_queue, &msg, TX_WAIT_FOREVER) == TX_SUCCESS) { // HCBle_SendData("%s", msg.data); HCBle_SendData("#{\"lat\":%.6f,\"lon\":%.6f,\"angle\":%.2f}\n", 23.123456, 113.654321, 95.0); } } } #endif