# MCU Radio 数据字段全部为零 — 问题排查报告

## 基本信息

| 项目 | 内容 |
|------|------|
| 日期 | 2026-05-28 |
| 项目 | QSJNIC 车载 Android 中间件 |
| 版本 | v1.0.0-beta6 |
| MCU 固件版本 | `swVersion=0302_20260527` |
| 测试设备 | 车机 192.168.0.66 |
| 协议参考 | `docs/MCU_ARM_Reference/20260513/Radio.xlsx` |

---

## 1. 问题汇总

| 编号 | 问题 | 现象 |
|------|------|------|
| #1 | `valid` 始终为 0 | 搜台后频率回调正常，但 valid 从未置 1 |
| #2 | `signal` 始终为 0 | 信号强度永远为 0，无论是否有电台 |
| #3 | `onPsPty` 回调无数据 | MCU 发了 PS_PTY 帧但 9 字节全零 |
| #4 | `onRadioText` 回调无数据 | MCU 发了 RT 帧但 64 字节全零 |

**四个问题的根因相同：MCU 固件只发送了帧结构（正确长度），但数据载荷字节全部为零。**

---

## 2. 涉及架构层

```
MCU → 串口帧(/dev/ttyS7) → libmcujni.so(C协议层) → JNI → QsMcuSystemService(Java)
    → RadioFeature → DomainBus → AIDL → qsmw-sdk → 收音机App
```

---

## 3. 协议定义（Radio.xlsx）

### 3.1 FREQ 帧（cmd=0x01）

| 字节 | 参数 | 内容 |
|------|------|------|
| Byte8 | P0 | 频率高 8 位 |
| Byte9 | P1 | 频率低 8 位 |
| Byte10 | P2 | band（bit3-0: 0=FM, 1=AM） |
| Byte11 | P3 | seekMode（bit3-0）+ 开关状态 |
| **Byte12** | **P4** | **bit7=valid** + bit4=bandSwitching + bit0-3=其他标志 |
| Byte13 | P5 | PTY 节目类型码 [0-31] |
| Byte14 | P6 | 信号强度 |

### 3.2 PS_PTY 帧（cmd=0x02）

| 字节 | 参数 | 内容 |
|------|------|------|
| Byte8 | P0 | PTY 节目类型索引 |
| Byte9-16 | P1-P8 | PS 台名（8 字节 ASCII） |

### 3.3 RT 帧（cmd=0x03）

| 字节 | 参数 | 内容 |
|------|------|------|
| Byte8-71 | P0-P63 | RT 广播文本（64 字节 ASCII） |

---

## 4. 排查方法

在 `FrameRouter.handleRadio()` 中增加原始 hex dump 日志，直接打印 JNI 层传来的 body 字节数组，绕过所有业务逻辑层，直接观察 MCU 原始数据。

诊断代码位置：`service/src/main/java/com/qsjnic/mcu/service/FrameRouter.java:149-178`

---

## 5. 实测数据

### 5.1 FREQ 帧

**搜台前（idle）：**
```
FREQ_BODY[7]=22 2E 00 00 00 00 00 | Byte12=0x00 (valid=0) Byte14(signal)=0x00
```
- 频率: 0x222E = 87.50 MHz FM, seekMode=0 (STOP)

**搜台中（SEEK_FF）：**
```
FREQ_BODY[7]=26 B0 00 42 00 00 00 | Byte12=0x00 (valid=0) Byte14(signal)=0x00
FREQ_BODY[7]=26 B1 00 42 00 00 00 | Byte12=0x00 (valid=0) Byte14(signal)=0x00
FREQ_BODY[7]=26 B2 00 42 00 00 00 | Byte12=0x00 (valid=0) Byte14(signal)=0x00
...
FREQ_BODY[7]=26 C4 00 42 00 00 00 | Byte12=0x00 (valid=0) Byte14(signal)=0x00
```
- 频率: 0x26B0→0x26C4 (99.04→99.24 MHz)，递增
- seekMode=2 (SEEK_FF)，搜台确认进行中
- **valid=0 全程，40+ 帧无一置 1**
- **signal=0 全程**

**搜台结束：**
```
FREQ_BODY[7]=26 D8 00 40 00 00 00 | Byte12=0x00 (valid=0) Byte14(signal)=0x00
```
- 频率: 0x26D8 = 99.44 MHz, seekMode=0 (STOP)
- valid=0, signal=0（结束后依然为零）

### 5.2 PS_PTY 帧

```
PS_PTY[9]=00 00 00 00 00 00 00 00 00 | PTY=0x00 PS="(empty)"
```
- 每 500ms 一条，帧长 9 字节正确
- 9 个字节**全部为 0x00**
- PTY=0, PS 为空字符串

### 5.3 RT 帧

```
RT[64]=00 00 00 00 00 00 ... 00 00 00 | RT="(empty)"
```
- 帧长 64 字节正确
- 64 个字节**全部为 0x00**
- RT 为空字符串

---

## 6. 逐帧逐字节分析

### FREQ 帧

| 字段 | 字节位置 | 搜台时的值 | 对照协议 | 状态 |
|------|---------|-----------|---------|------|
| P0-P1 频率 | Byte8-9 | `26 B0`→`26 D8` | 正确 | ✓ |
| P2 波段 | Byte10 | `00`=FM | 正确 | ✓ |
| P3 搜台模式 | Byte11 | `42`=SEEK_FF+STEREO | 正确 | ✓ |
| **P4 valid** | **Byte12** | **全部 `0x00`** | **bit7=有效台标志** | **✗** |
| P5 PTY | Byte13 | 全部 `0x00` | 节目类型 | ✗ |
| **P6 signal** | **Byte14** | **全部 `0x00`** | **信号强度** | **✗** |

### PS_PTY 帧

| 字段 | 字节位置 | 值 | 状态 |
|------|---------|-----|------|
| P0 PTY | Byte8 | `0x00` | ✗ |
| P1-P8 PS | Byte9-16 | 全部 `0x00` | ✗ |

### RT 帧

| 字段 | 字节位置 | 值 | 状态 |
|------|---------|-----|------|
| P0-P63 RT | Byte8-71 | 全部 `0x00` | ✗ |

---

## 7. 软件层排查结论

已完成从底层到顶层的完整数据流追踪：

| 层 | 检查项 | 结果 |
|----|-------|------|
| C 协议层 `mcu_protocol.c` | payload 从 `raw+6` 开始 | ✓ |
| JNI 桥接 `jni_bridge.cpp` | body = payload+2，body_len = payload_len-2 | ✓ |
| Java FrameRouter | payload 直接传递 | ✓ |
| DomainBus → RadioFeature | body 原样转发 | ✓ |
| RadioFeature.handleFreq | `valid = (p[4]>>7)&1`, `signal = p[6]&0xFF` | ✓ |
| Decoders.parsePsPty | `pty = body[0]`, `ps = trimUtf8(body, 1, 8)` | ✓ |
| AIDL Parcelable | RadioState 序列化/反序列化 | ✓ |
| SDK → App | 回调传递 | ✓ |

**每一层软件解析都是正确的，字节映射与 Radio.xlsx 协议完全一致。**

---

## 8. 根因结论

**MCU 固件 `swVersion=0302_20260527` 存在系统性缺陷：所有 MCU→ARM 帧（FREQ、PS_PTY、RT）的结构正确（帧类型、命令号、数据长度均正确），但数据载荷字节全部为零。**

具体表现为：
- FREQ 帧：P0-P3（频率/波段/搜台）正常，P4-P6（valid/PTY/signal）全零
- PS_PTY 帧：9 字节全零，PTY=0, PS 为空
- RT 帧：64 字节全零，RT 为空

**这不是 Android 端软件问题，是 MCU 固件问题。**

---

## 9. 建议

1. 将本报告提供给 MCU 固件供应商
2. 要求供应商确认固件版本 `0302_20260527` 对以下字段的支持情况：
   - FREQ 帧 P4-P6（Byte12-14）
   - PS_PTY 帧 P0-P8（Byte8-16）
   - RT 帧 P0-P63（Byte8-71）
3. 如系固件已知缺陷，获取修复后的固件版本
4. 如系协议版本升级导致字节位置变动，获取最新协议文档并更新 Android 端解析代码

---

## 附录 A：诊断代码修改

已在 `FrameRouter.java` 中新增以下诊断日志（每次构建需保留至问题解决）：

- `FREQ_BODY[N]=hex... | Byte12=... valid=... Byte14(signal)=...`
- `PS_PTY[N]=hex... | PTY=... PS="..."`
- `RT[N]=hex... | RT="..."`
