You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的值,确认传感器本身是否输出有效数据:
    printf("Z轴原始加速度:%f\n", zAccel);
    
    如果原始数据就是0,问题出在MPU6050的硬件连接、驱动初始化或校准,与BLE无关。

4. 手机端读取逻辑

  • 确保手机端正确识别两个特征的UUID:P2P_READ_CHAR_UUID(测距)和P2P_READ1_CHAR_UUID(加速度Z轴)。
  • 若使用BLE通知机制,需同时订阅两个特征的通知;若主动读取,需分别发起两个特征的读请求。
  • 解析数据时匹配硬件端类型:测距数据按int16_t解析,加速度Z轴数据如果是转换后的int16_t,同样按16位整数解析(注意端序,通常BLE用小端模式)。

内容的提问来源于stack exchange,提问作者Bilaltan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 04:40:42