STM32WB15单BLE Service下多特征值传输问题:加速度计Z轴数据异常
BLE双特征读取问题:加速度计Z轴数据始终为0的排查与解决
问题描述
我尝试读取同一BLE Service下的两个特征值(加速度计Z轴与激光测距传感器),目前激光测距数据SensorHeightValue(int16_t类型)可正常读取,但加速度计Z轴数据AccelValueZ始终为0。相关代码如下:
void MPU6050_Receive_Sensor_Data(void){ double xAccel ,yAccel ,zAccel; mpu6050_get_measurement(&xAccel, &yAccel, &zAccel); P2P_Server_App_Context.SensorControl.MPU6050AccelValueX = xAccel; P2P_Server_App_Context.SensorControl.MPU6050AccelValueY = yAccel; P2P_Server_App_Context.SensorControl.MPU6050AccelValueZ = zAccel; P2PS_STM_App_Update_Char(P2P_READ1_CHAR_UUID, (uint8_t *)&P2P_Server_App_Context.SensorControl.MPU6050AccelValueZ); if((P2P_Server_App_Context.SensorControl.MPU6050AccelValueZ <= 100) && (P2P_Server_App_Context.SensorControl.MPU6050AccelValueZ >= -100)){ VL53L1X_Receive_Sensor_Data_Action(); } return; } void VL53L1X_Receive_Sensor_Data(void){ P2P_Server_App_Context.SensorControl.SensorHeightValue = vl53l1x_get_measurement(); P2PS_STM_App_Update_Char(P2P_READ_CHAR_UUID, (uint8_t *)&P2P_Server_App_Context.SensorControl.SensorHeightValue); // P2PS_STM_App_Update_Char(P2P_READ1_CHAR_UUID, (uint8_t *)&P2P_Server_App_Context.SensorControl.MPU6050AccelValueZ); return; }
核心问题排查与修复
1. 数据类型不匹配(最可能原因)
- 你用
double类型存储加速度值,但如果MPU6050AccelValueZ是int16_t类型,直接赋值double会导致截断:比如MPU6050输出的加速度是±1g左右(对应double值±1.0),转成int16_t会直接变成0。 - 修复方式:根据MPU6050的量程将
double类型的g值转换为int16_t格式。例如量程为±2g时,1g对应int16_t的16384(因为2^15=32768,对应±2g):// 替换原赋值逻辑 int16_t zAccel_int = (int16_t)(zAccel * 16384.0); P2P_Server_App_Context.SensorControl.MPU6050AccelValueZ = zAccel_int;
2. BLE特征配置与数据传输不匹配
- 确认
P2P_READ1_CHAR_UUID对应的BLE特征定义:如果特征的长度是2字节(对应int16_t),但你传递的是double类型的指针(8字节),手机端只会读取前2字节,而double类型的小数部分前两字节大概率是0,导致显示为0。 - 确保
P2PS_STM_App_Update_Char传递的数据长度与特征定义一致:更新加速度Z轴特征时,长度应设为sizeof(int16_t)(如果特征是int16_t类型)。
3. 原始加速度数据有效性验证
- 在
mpu6050_get_measurement调用后,添加串口打印输出zAccel的值,确认传感器本身是否输出有效数据:
如果原始数据就是0,问题出在MPU6050的硬件连接、驱动初始化或校准,与BLE无关。printf("Z轴原始加速度:%f\n", zAccel);
4. 手机端读取逻辑
- 确保手机端正确识别两个特征的UUID:
P2P_READ_CHAR_UUID(测距)和P2P_READ1_CHAR_UUID(加速度Z轴)。 - 若使用BLE通知机制,需同时订阅两个特征的通知;若主动读取,需分别发起两个特征的读请求。
- 解析数据时匹配硬件端类型:测距数据按
int16_t解析,加速度Z轴数据如果是转换后的int16_t,同样按16位整数解析(注意端序,通常BLE用小端模式)。
内容的提问来源于stack exchange,提问作者Bilaltan
相关产品推荐
相关产品推荐

