本文与双轴摇杆篇共用一个工程,传输的数据是摇杆xy轴的两个四位ADC采样值
Cubemx+stm32f103c8t6-双轴摇杆篇
所用蓝牙模块为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 */三、结语
学无止境,希望每一位读者都能够有所收获,有不足之处也欢迎大家在评论区留言或私信