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

ANT+ FE-C写入用户配置页55后设备阻力无变化问题排查

蓝牙FE-C写入Data Page 55配置无响应问题排查

我尝试通过蓝牙FE-C向智能骑行训练设备写入用户配置数据(Data Page 55,0x37),但无论调整数值甚至设为最大值,设备阻力都没有变化。怀疑是数据处理逻辑出错,附上WriteUserConfiguration和CreateFECUserConfiguration的代码,请求帮忙排查问题。

private async Task WriteUserConfiguration(GattCharacteristic characteristic)
{
    DataWriter writer = new DataWriter();
    
    byte[] bytes = CreateFECUserConfiguration();
    
    writer.WriteBytes(bytes);
    
    var valResult = await characteristic.WriteValueAsync(writer.DetachBuffer());
    if (valResult == GattCommunicationStatus.Success)
    {
        Debug.WriteLine("Write UserConfiguration Successful");
    }
}
    

// create values for testing, will be provided by the user later on
private static byte[] CreateFECUserConfiguration()
{
    byte[] bytes = new byte[13]; // size of message
    UInt16 userWeight = (ushort)(655.34 / 0.01); // 0-655.34
    byte[] userWeightBytes = BitConverter.GetBytes(userWeight);
    
    byte bicycleWheelDiameterOffset = 10; // 0-10, 0.5 byte
    UInt16 bicycleWeight = 50 * 20; // 0 – 50, * 20, 1.5 byte

    // start merging bicycle wheel diameter offset and bicycle weight + putting them in the right order
    byte[] tempWheelDiameterOffset = new byte[1] { bicycleWheelDiameterOffset };
    BitArray bicycleWheelDiameterOffsetBits = new BitArray(tempWheelDiameterOffset);


    byte[] testbicycleWeightBytes = BitConverter.GetBytes(bicycleWeight);
    BitArray testBicycleWeight = new BitArray(testbicycleWeightBytes);


    bool[] tempBicycleWeightPartTwo = new bool[8] { testBicycleWeight[4], testBicycleWeight[5], testBicycleWeight[6], testBicycleWeight[7], testBicycleWeight[8], testBicycleWeight[9], testBicycleWeight[10], testBicycleWeight[11] };
    BitArray bicycleWeightBitsTwo = new BitArray(tempBicycleWeightPartTwo);


    bool[] mergeBitsAsBools = new bool[8] { testBicycleWeight[0], testBicycleWeight[1], testBicycleWeight[2], testBicycleWeight[3], bicycleWheelDiameterOffsetBits[0], bicycleWheelDiameterOffsetBits[1], bicycleWheelDiameterOffsetBits[2], bicycleWheelDiameterOffsetBits[3] };
    BitArray tempMergeWheelDiameterOffsetPlusBicycleWeight = new BitArray(mergeBitsAsBools);

    byte[] wheelDiameterOffsetPlusBicycleWeight = new byte[1];
    byte[] bicycleWeightByteTwo = new byte[1];

    tempMergeWheelDiameterOffsetPlusBicycleWeight.CopyTo(wheelDiameterOffsetPlusBicycleWeight, 0);
    bicycleWeightBitsTwo.CopyTo(bicycleWeightByteTwo, 0);
    //end merging


    byte bicycleWheelDiameter = (byte)(0.5 / 0.01); // 0 – 2.54m
    byte gearRatio = (byte)(1 / 0.03); // 0.03 – 7.65
        
        
    bytes[0] = 0xA4;
    bytes[1] = 0x09; // lenght
    bytes[2] = 0x4F; // message type
    bytes[3] = 0x05; // channel
        
    bytes[4] = 0x37; // Page Number 55
    bytes[5] = userWeightBytes[0]; // User Weight LSB
    bytes[6] = userWeightBytes[1]; // User Weight MSB
    bytes[7] = 0xFF; // Reserved for future use
    bytes[8] = wheelDiameterOffsetPlusBicycleWeight[0]; // Bicycle Wheel Diameter Offset 0,5 byte + Bicycle Weight LSN (probably typo in documentation -> LSB?) 0,5 byte
    bytes[9] = bicycleWeightByteTwo[0]; // BicycleWeight MSB
    bytes[10] = bicycleWheelDiameter; // Bicycle Wheel Diameter
    bytes[11] = gearRatio; // Gear Ration
    bytes[12] = ComputeChecksum(bytes); // Method to calcute checksum
        
    return bytes;
}

参考规范:

  • Ant+ FE-C Data Page 55(0x37)格式定义
  • Ant+消息格式结构

潜在问题排查点

1. 字节序与位映射错误

  • 用户重量字节序颠倒:BitConverter.GetBytes在小端系统返回小端字节,但Ant+协议通常要求大端序(MSB在前)。当前代码把LSB放在bytes[5]、MSB放在bytes[6],会导致数值完全错误,设备无法识别。
  • 自行车重量位拆分逻辑错误:BitArray的索引从最低位(LSB)开始计数,原代码拆分的testBicycleWeight[4-11]并非正确的高8位。同时,轮径偏移和重量低4位的合并顺序搞反了——文档要求轮径偏移占高4位,重量低4位占低4位,但当前代码是反过来的。

2. 字段计算不符合规范

  • 用户重量超出合理范围:代码中计算得到65534(对应655.34kg),远超正常人体重,设备可能直接忽略该无效值。正常应该是用户体重(kg)×100,比如65kg对应6500。
  • 轮径数值异常:计算得到的50(对应0.5米)不符合真实自行车轮径(通常1.9-2.1米,对应190-210),设备可能不认可该配置。
  • 保留字段值错误:文档要求Reserved字段设为0x00,当前设为0xFF可能导致设备拒绝解析该配置页。

3. 消息格式与校验问题

  • 消息长度字段错误:bytes[1] = 0x09需对照Ant+消息格式确认是否正确——长度字段通常指页号之后的数据字节数,若包含校验和则长度应为9,否则可能为8,错误的长度会导致设备丢弃消息。
  • 校验和未验证:ComputeChecksum方法未提供,需确认是否符合Ant+的校验规则(一般是页号到数据末尾的字节异或或求和取反),校验错误会导致设备忽略消息。

4. 设备交互流程问题

  • 确认设备是否处于可配置状态(比如未启动骑行模式),部分设备需要先完成初始化流程才能接收配置。
  • 部分设备需要在写入配置后发送生效命令,单纯写入Data Page不会立即触发阻力调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 16:18:20