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

请求解析Broadcom 4775x GPS模块自定义二进制响应

解码Broadcom 4775x GPS模块二进制响应方案

核心协议说明

你遇到的b0 00开头、b0 XX结尾的二进制流,是Broadcom的**CSP(Chip Serial Protocol)**私有帧格式,这是Pixel 6搭载的Broadcom GPS模块的标准通信协议,而非通用NMEA格式。

帧结构拆解

CSP帧的固定格式如下:

  • 帧头:0xB0 0x00(唯一标识GPS模块的CSP消息)
  • 长度字段:1-2字节小端数据,代表后续有效负载(Payload)的字节数
  • Payload:核心数据段,采用TLV(Type-Length-Value)结构存储GPS信息
  • 帧尾:0xB0 XX,其中XX为帧校验码(通常是帧头+长度+Payload的异或结果,部分版本用CRC8校验)

解码分步操作

  1. 拆分完整帧

    • 遍历二进制流,定位0xB0 0x00作为帧起始,再找到下一个0xB0(后接校验码)作为帧结束,截取中间完整帧
    • 注意:若流中出现连续0xB0,需排除帧头的0xB0 0x00,仅将单独0xB0开头的结尾段作为截断标识
  2. 提取有效Payload

    • 剔除帧头0xB0 0x00和帧尾0xB0 XX,剩余部分即为Payload
    • 解析开头的长度字段:比如长度字节为0x08 0x00,转换为十进制是8,代表Payload共8字节
  3. 解析TLV结构
    Payload由多个TLV单元组成,每个单元规则:

    • Type:1字节(标识数据类型,比如0x01=纬度、0x02=经度、0x03=UTC时间)
    • Length:1字节(对应Value的字节数)
    • Value:二进制数据,需按类型转换为可读格式
      常见类型转换规则:
    • 经纬度:4字节有符号整数,单位为0.1微度,转换公式:数值 / 10000000.0
    • UTC时间:6字节,依次为年(后两位)、月、日、时、分、秒,直接转十进制
    • 卫星数量:1字节无符号整数,直接转十进制
    • 速度:2字节无符号整数,单位0.01m/s,转换公式:数值 / 100.0
  4. 校验帧完整性
    计算帧头+长度+Payload所有字节的异或值,与帧尾的XX对比,确保数据未损坏

示例代码片段(C语言)

#include <stdint.h>
#include <stdio.h>
#include <string.h>

// 解析Payload中的经纬度信息
void parse_gps_position(uint8_t *payload, int payload_len) {
    int i = 0;
    while (i < payload_len) {
        uint8_t type = payload[i++];
        uint8_t len = payload[i++];
        if (type == 0x01) { // 纬度
            int32_t lat = *(int32_t*)(payload + i);
            double lat_deg = lat / 10000000.0;
            printf("纬度: %.6f°\n", lat_deg);
        } else if (type == 0x02) { // 经度
            int32_t lon = *(int32_t*)(payload + i);
            double lon_deg = lon / 10000000.0;
            printf("经度: %.6f°\n", lon_deg);
        }
        i += len;
    }
}

// 从数据流中拆分出完整CSP帧
int split_csp_frame(uint8_t *stream, int stream_len, uint8_t *frame, int *frame_len) {
    int start_idx = -1, end_idx = -1;
    // 定位帧头
    for (int i = 0; i < stream_len - 1; i++) {
        if (stream[i] == 0xB0 && stream[i+1] == 0x00) {
            start_idx = i;
            // 定位帧尾的0xB0
            for (int j = i + 2; j < stream_len; j++) {
                if (stream[j] == 0xB0 && j+1 < stream_len) {
                    end_idx = j + 1;
                    break;
                }
            }
            if (end_idx != -1) break;
        }
    }
    if (start_idx == -1 || end_idx == -1) return -1;
    *frame_len = end_idx - start_idx + 1;
    memcpy(frame, stream + start_idx, *frame_len);
    return 0;
}

额外提示

  • 你使用的CSP Hub Lib版本是408635,TLV的Type字段定义可能和其他版本有差异,直接查看Pixel 6内核源码中drivers/gps/bcm/下的bcm_gps_csp.h或gps.c文件,里面有官方的类型枚举
  • 驱动中若存在csp_parse或gps_log类函数,开启后可直接获取已解析的GPS数据,无需重复造轮子

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 06:32:40