
本文与双轴摇杆篇共用一个工程传输的数据是摇杆xy轴的两个四位ADC采样值Cubemxstm32f103c8t6-双轴摇杆篇所用蓝牙模块为HC-05开始前需配置好主从机模块配置具体内容可以看下文。HC-05蓝牙模块学习笔记一、cubemax配置1、主机2、从机二、代码1、主机发送7个字节到从机包括两个帧头四个数据字节以及一个校验位uint16_t x_raw adc_buf[0]; uint16_t y_raw adc_buf[1]; if(abs((int16_t)x_raw - JOY_MID) DEAD_ZONE) x_raw JOY_MID; //简单消除死区 if(abs((int16_t)y_raw - JOY_MID) DEAD_ZONE) y_raw JOY_MID; bt_tx_buf[0] 0xAA; //帧头1 bt_tx_buf[1] 0x55; //帧头2 bt_tx_buf[2] (x_raw 8) 0xFF; //X轴高字节 bt_tx_buf[3] x_raw 0xFF; //X轴低字节 bt_tx_buf[4] (y_raw 8) 0xFF; //Y轴高字节 bt_tx_buf[5] y_raw 0xFF; //Y轴低字节 //校验位前6字节累加取低8位进行校验 bt_tx_buf[6] bt_tx_buf[0]bt_tx_buf[1]bt_tx_buf[2]bt_tx_buf[3]bt_tx_buf[4]bt_tx_buf[5]; //串口2阻塞发送 HAL_UART_Transmit(huart2,bt_tx_buf,7,HAL_MAX_DELAY); HAL_Delay(20); //小延时避免拥堵2、从机变量定义主函数部分每接收一字节进入串口回调函数joy_rx_ok表示接收到完整的一帧且完成数据处理HAL_UART_Receive_IT(huart2,rx_byte,1); //开启串口2接收中断 while (1) { /* USER CODE BEGIN 3 */ if(joy_rx_ok) { joy_rx_ok 0; //预留空位用于调用处理好的数据 } HAL_Delay(10); } /* USER CODE END 3 */串口回调函数对接收到的每个字节进行处理/* USER CODE BEGIN 4 */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef*huart) { if(huart-Instance USART2) { uint8_t d rx_byte; if(frame_sync 0) { if(d 0xAA) frame_sync 1; } else if(frame_sync 1) { if(d 0x55) { frame_sync 2; frame_idx 0; } else frame_sync 0; } else if(frame_sync 2) { frame_buf[frame_idx] d; if(frame_idx 5) { uint8_t sum 0xAA 0x55 frame_buf[0] frame_buf[1] frame_buf[2] frame_buf[3]; if(sum frame_buf[4]) { joy_rx_x ((uint16_t)frame_buf[0] 8) | frame_buf[1]; joy_rx_y ((uint16_t)frame_buf[2] 8) | frame_buf[3]; joy_rx_ok 1; } frame_sync 0; } } HAL_UART_Receive_IT(huart2,rx_byte,1); } } /* USER CODE END 4 */三、结语学无止境希望每一位读者都能够有所收获有不足之处也欢迎大家在评论区留言或私信