# CAN-USB-LAB **Repository Path**: ccjabc/can-usb-lab ## Basic Information - **Project Name**: CAN-USB-LAB - **Description**: 车载屏测试板主机仿真DEMO + UDS/Bootloader 验证平台 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-10-16 - **Last Updated**: 2026-10-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 车载屏测试板 · 主机仿真 + UDS 诊断/刷写验证平台(学习脚手架) > 目的:用"做中学"的方式,以**模块①通信与诊断**为主线,同时融合 ②升级/功能安全、③AUTOSAR/RTOS、⑤平台HAL/全流程、⑥AI辅助研发 —— 一个主干项目吃透 5 个能力点(④显示触控走配套线 `../display_touch_notes/`)。 > 角色映射:你写 **HOST(测试板/主机)**,屏端用一个 **ECU mock** 代替。两边先在 PC 上跑通,M5 再上真板。 ## 0. 里程碑 → 能力点映射(做每步都知道在练什么) | 里程碑 | 主练 | 同时喂养 | 关键对应 | |--------|------|----------|----------| | M0 环境点亮(✅) | ⑤ | ③ | `can_if` 抽象 = HAL 解耦缩影;目录分层 = 类 AUTOSAR 思想 | | M1 通信矩阵(进行中) | ① | ③⑤⑥ | DBC/字节序/滤波;周期调度↔Com/OS;AI 生成测试向量 | | M2 UDS 服务 | ① | ③⑥ | UDS 状态机 ↔ AUTOSAR Dcm;AI 读 ISO 14229 | | M3 DTC/故障注入 | ① | ②③ | DTC↔Dem 模块;故障注入思想通向 FMEA | | M4 Bootloader 刷写 | ①② | ⑥ | $34/$36/$37 + CRC/回滚 = 升级与安全启动思想 | | M4+ E2E/MISRA 增强 | ② | ① | 周期报文加 E2E(CRC+计数器);MISRA 自查 | | M5 上真板 | ⑤ | ①③④ | 只换 `can_if.c` = 可移植性活教材;连屏实测 = ④入口 | ## 1. 目录结构 ``` can_uds_lab/ ├── Makefile # PC 仿真构建 ├── include/ │ ├── types.h # CanFrame 基础类型 │ ├── can_if.h # 抽象传输层接口(HAL 思想) │ ├── vcan.h/.c # 虚拟总线(PC 仿真用) │ ├── comm_matrix.h/.c# 通信矩阵:信号打包/解包 │ ├── host_app.h/.c # 主机侧逻辑 │ ├── screen_ecu.h/.c # 屏端 mock 逻辑 │ └── uds.h/.c # UDS 骨架(M2 用) └── src/main.c # 单线程事件循环 ``` ## 2. 如何运行 **PC(无需硬件):** ```bash cd can_uds_lab make run # 跑主机<->屏端 仿真,每 tick 打印指令/触摸坐标 make test # 跑通信矩阵自测(bit 级打包/解包 + 测试向量),应 4/0 通过 ``` 预期 `make run`:每个 tick 打印主机发的指令、屏回的触摸坐标。 预期 `make test`:4 通过 / 0 失败(含跨字节 12bit 信号与边界值校验)。 **S32DS(M5 上真板):** 新建 S32DS C 工程,把 `include/` 和 `src/`(除 `vcan.c`)加进去;把 `src/can_if.c` 换成调用 HAL CAN 驱动的实现(保持 `CanIf_Init/Transmit/Receive` 签名不变)。 ## 3. M1 你的任务(练习清单) > 注:bit 级打包/解包 + 测试向量(`comm_matrix.c` 的 `PackSignal`/`UnpackSignal`/`Comm_Selftest`) > 已作为**示范**写好并验证通过,你可以先读它、跑 `make test` 看效果,再自己重写一遍加深理解。 1. **读懂 bit 级编解码**:读 `comm_matrix.c` 的 `PackSignal`/`UnpackSignal`,理解 `start_bit + 长度` 如何描述一个信号(这就是 DBC 的方式)。 2. **自己重写一遍**:遮住参考,按 `comm_matrix.h` 里的布局表重新实现 `Comm_Pack/Unpack*`,跑 `make test` 必须全绿。 3. **加一个新信号**:比如加一个 `errorCode`(8bit) 到屏->主机帧,更新布局表、打包/解包、并把示例向量补进 `Comm_Selftest`,体会"改矩阵 = 改几行 + 加测试"。 4. **Motorola 大端**:把 `PackSignal` 改成支持大端(bit 排列顺序反转),对比同一信号两种字节序的字节差异。 5. **周期调度 + ID 滤波**:把主机"每 tick 发一帧"改成基于计数器的周期(如 20ms);在 `can_if` 加 ID 滤波,理解硬件滤波的意义。 ## 4. 学习检查点(怎么算"会了") - 能脱稿画出一帧 CAN 的结构(ID/DLC/Data),讲清 11bit vs 29bit。 - 能解释 Intel 与 Motorola 字节序差异,并手动算出一个多字节信号的值。 - 能说清"通信矩阵/DBC"是干嘛的、为什么需要它。 - 能在本项目里加一个新信号,并让主机和屏端正确收发。 ## 5. 后续里程碑怎么接 - **M2 UDS**:在 `uds.c` 实现 `$10/$22/$2E/$19/$14/$27/$31` 服务分发;主机侧在收到 diagReq 时调用。 - **M3 DTC**:加 DTC 存储(状态位/快照/扩展数据)+ 故障注入开关。 - **M4 刷写**:实现 `$34/$36/$37` + `$27` 安全访问 + 每块 CRC + 校验/回滚(用两块内存区模拟 app/boot)。 - **M5 真板**:移植 `can_if.c` 到 HAL,连收发器与分析仪看真实报文。 ## 6. 硬件推荐(最低成本,M5 用) - **0 元**:纯 PC 仿真跑 M0–M4。 - **~¥150–300**:S32K144 EVB(先问公司借;否则国产/二手 ~¥150)+ TJA1050 收发模块 ~¥15。 两块板互发,OpenSDA 虚拟串口 printf 看结果,不用分析仪。 - **再加 ~¥100**:便宜 USB-CAN 适配器(淘宝兼容款)+ 免费 SavvyCAN 看真实报文波形。 别买 PCAN-USB(¥2000+),个人没必要。 ## 7. 用 AI 辅助提效(你的加分项) - 让 Copilot/LLM 生成信号编解码的**测试向量**与单元断言。 - 让 AI 解释某个 UDS 服务的交互时序图。 - 用 AI 把本 README 的某段翻成面试话术。 注意:用 AI 加速"理解与验证",而不是替代你写核心逻辑——面试要能讲清每一行。