@[toc]
介绍
本软件包在 RT-Thread 上实现 ISO 14229(UDS)协议栈及典型服务端示例,并配套 SocketCAN 客户端,覆盖会话控制、安全访问、参数读写、通信控制、IO 控制、远程控制台、文件传输等核心诊断能力,面向汽车电子与工业控制场景的远程诊断、运维和固件分发需求。
历史与背景
- 诞生动机:典型整机通常只有一个 CAN 接口对外,而内部往往存在多个 MCU 子节点。惯用的串口 Debug 控制台在售后排查阶段接线和调试成本高。通过在 CAN 上提供标准 UDS 诊断与控制台能力,可复用现有 CAN 口完成日志、调试与控制权接管,降低现场维护难度。
- 重要里程碑:覆盖 ISO 14229 主流服务(0x10/0x11/0x22/0x27/0x28/0x2E/0x2F/0x31/0x34/0x36/0x37/0x38/0x3E),提供 RT-Thread 服务端示例、服务注册框架与 SocketCAN 客户端目录结构,形成可直接验证的端到端链路。
- 社区与应用:面向 RT-Thread 生态,适配汽车 ECU 与工业控制设备的诊断、运维、升级需求;示例展示了在实际板卡上集成 CAN、GPIO、定时器和线程的路径。
核心原理与设计
- 分层架构:底层为 RT-Thread CAN 驱动与 ISO-TP 传输;协议核心 iso14229_rtt.c/iso14229.c;服务层提供各类 UDS 服务;应用/示例层负责业务绑定与控制权切换。
- 服务注册与裁剪:通过 rtt_uds_env_t 挂载/卸载服务节点,启动集中注册,停止集中卸载,便于按需裁剪与资源回收。
- 硬件抽象与控制权管理:LED IO 示例实现应用值与 UDS 接管状态的切换,确保诊断控制与应用控制互斥且可恢复。
- 线程与队列配置:示例线程栈 4096B、优先级 2,队列深度 32,平衡实时性与内存占用,适合 STM32H750 等中等资源 MCU。
- CAN 收发路径:启动时绑定自定义 RX 回调,诊断帧直达 UDS 栈,其余帧按通信控制状态决定是否交由应用;停止时恢复原回调,保证与其他协议栈共存。
- 客户端设计:SocketCAN 客户端包含核心模块、服务客户端和交互式 Shell,覆盖所有配套命令,便于端到端调试与自动化验证。
- DTC 服务缺失说明:当前未提供 0x19 诊断故障码(DTC)服务。原因是本包聚焦通用诊断控制、传输与远程运维场景,不绑定特定 OEM/行业的 DTC 数据模型,避免引入专用存储格式与校准流程;如需 DTC,建议在现有框架上按项目策略扩展专用节点。
使用场景
- 汽车 ECU 诊断与刷写:会话控制、安全解锁、下载与传输组合形成刷写链路。
- 工业控制远程维护:通过 0x2F/0x28/0x31 实现 IO 接管、通信屏蔽和远程命令执行,缩短排障时间。
- 固件/文件分发:0x34/0x36/0x37/0x38 适配 FOTA 或参数包下发,结合安全访问保护敏感操作。
- 不推荐场景:极小资源且无 CAN 控制器的裸机场景,或缺乏 RT-Thread 多任务/定时器支撑的环境应选择轻量通道;需要标准化 DTC 流程的项目需自行扩展 0x19 服务。
对比分析
- 与私有 CAN 诊断协议对比:UDS 提供标准化服务集合,降低自定义协议维护成本;实现复杂度与栈内存占用略高,可通过服务裁剪与线程/队列参数调整平衡资源。
- 与仅刷写工具链对比:除刷写外,UDS 还提供通信控制、IO 控制和远程控制台,支持更丰富的运维;需在启动/停止时绑定与恢复回调以保障与其他协议栈隔离。
- 性能与资源:ISO-TP 引入轻量流控开销;示例 4096B 栈、32 深度队列适合中等资源 MCU,若需更高吞吐可增大消息池并优化过滤器。
- 启动速度与隔离级别:MSH 命令即时启动/停止 UDS 栈,恢复原回调确保与既有协议共存;客户端命令行直接运行,启动开销低。
基于RT-Thread操作系统的ISO 14229 (Unified Diagnostic Services, UDS) 诊断工具实现,包含服务端(server)和客户端(client)两部分。服务端运行在嵌入式设备上,通过CAN总线与客户端通信,实现了多种UDS诊断服务,方便对嵌入式设备进行远程诊断和控制。
本项目旨在为RT-Thread用户提供一套完整的UDS诊断解决方案,不仅可以直接使用,也可以作为学习UDS协议和开发自定义诊断功能的参考。
主要特点
- 基于RT-Thread操作系统,充分利用其多任务和设备驱动框架
- 实现了常用的UDS诊断服务,满足大部分诊断需求
- 提供跨平台的Linux客户端,方便与服务端进行交互
- 模块化设计,易于扩展新的UDS服务
- 包含丰富的示例代码,帮助用户快速上手
应用场景
- 汽车电子ECU诊断
- 工业控制器远程维护
- 嵌入式设备固件升级
- 设备状态监控和故障排查
2. 功能特性 (Features)
服务端特性 (Server Features)
- 基于RT-Thread的多任务架构,保证系统稳定性和实时性
- 完整的ISO 14229 UDS协议栈实现
- 支持多种UDS诊断服务,包括会话控制、安全访问、参数读写等
- 灵活的服务注册机制,便于扩展新功能
- 与RT-Thread CAN设备驱动无缝集成
- 支持CAN总线通信控制,可动态启用/禁用消息收发
客户端特性 (Client Features)
- 基于Linux平台,使用SocketCAN进行CAN通信
- 提供命令行交互界面,支持命令历史和自动补全
- 实现了与服务端配套的UDS服务客户端功能
- 支持文件上传下载功能
- 支持远程控制台命令执行
- 具备完善的错误处理和日志显示功能
通信特性 (Communication Features)
- 基于ISO TP (ISO 15765-2)的CAN总线数据传输协议
- 支持大数据块传输,适用于文件传输等场景
- 具备流量控制机制,保证通信稳定性
- 支持功能寻址和物理寻址两种通信方式
3. 支持的UDS服务 (Supported UDS Services)
本项目实现了以下ISO 14229标准定义的UDS服务:
| Service ID | Name | Description |
|---|---|---|
| 0x10 | Diagnostic Session Control | 控制诊断会话模式(默认/扩展会话/编程会话) |
| 0x11 | ECU Reset | 执行ECU复位操作 |
| 0x22 | Read Data By Identifier | 读取数据标识符对应的参数值 |
| 0x27 | Security Access | 安全访问服务,用于解锁高级诊断功能 |
| 0x28 | Communication Control | 控制通信行为(启用/禁用消息收发) |
| 0x2E | Write Data By Identifier | 写入数据标识符对应的参数值 |
| 0x2F | Input/Output Control | 控制输入输出信号的行为 |
| 0x31 | Routine Control | 控制例程的启动、停止和结果查询 |
| 0x34 | Request Download | 请求下载数据到ECU |
| 0x36 | Transfer Data | 传输数据块 |
| 0x37 | Request Transfer Exit | 结束数据传输 |
| 0x38 | Request File Transfer | 请求文件传输 |
| 0x3E | Tester Present | 测试仪在线保持 |
这些服务涵盖了UDS协议的核心功能,能够满足大多数诊断应用场景的需求。
4. 系统架构 (System Architecture)
整体架构图
1 | +------------------+ CAN Bus +------------------+ |
服务端架构
服务端基于RT-Thread操作系统,采用分层架构设计:
- 硬件抽象层:RT-Thread CAN设备驱动
- 传输层:ISO TP协议实现
- 协议层:ISO 14229核心协议栈 (iso14229_rtt.c)
- 服务层:各种UDS服务的具体实现 (service/)
- 应用层:用户自定义的应用逻辑 (rtt_uds_example.c)
客户端架构
客户端基于Linux平台,同样采用分层架构设计:
- 硬件抽象层:SocketCAN接口
- 传输层:ISO TP协议实现
- 协议层:ISO 14229核心协议栈 (iso14229.c)
- 服务层:各种UDS服务的客户端实现 (services/)
- 应用层:命令行交互界面和用户命令处理 (core/, main.c)
5. 代码结构 (Code Structure)
服务端代码结构
1 | server_demo/ |
客户端代码结构
1 | client_demo/ |
6. 硬件要求 (Hardware Requirements)
服务端 (Server Side)
- 运行RT-Thread操作系统的嵌入式开发板
- 至少具备一个CAN控制器的硬件接口
- 连接CAN收发器(如TJA1050、SN65HVD230等)
- 用于LED控制示例的GPIO引脚(可选)
客户端 (Client Side)
- 运行Linux操作系统的主机(物理机或虚拟机)
- 支持SocketCAN的CAN接口适配器
- USB转CAN适配器(如USBCAN-I、USBCAN-II)
- PCIe CAN接口卡
- 具备CAN控制器的开发板(如树莓派配合MCP2515)
- CAN总线连接线缆和终端电阻
7. 快速开始 (Getting Started)
服务端设置 (Server Setup)
配置
- 在 RT-Thread 的
menuconfig中启用该软件包:
1
2
3
4
5RT-Thread online packages --->
peripherals packages --->
[*] Enable iso14229 (UDS) library --->
(32) Event Dispatch Table Size
[*] Enable UDS server example application- 在 RT-Thread 的
集成库文件
- 将
server_demo目录下的源文件添加到您的RT-Thread项目中 - 确保项目配置中启用了CAN设备驱动支持
- 将
编译和烧录
- 使用RT-Thread支持的工具链编译项目
- 将生成的固件烧录到目标硬件
运行示例
- 通过串口终端连接到设备控制台
- 启动UDS服务端示例:
1
msh />uds_example start can1
客户端设置 (Client Setup)
配置SocketCAN
- 在Linux主机上启用并配置CAN接口:
1
2
3
4
5
6
7
8
9
10
11# 加载CAN模块(如果需要)
sudo modprobe can
sudo modprobe can_raw
sudo modprobe vcan # 用于虚拟CAN测试
# 配置物理CAN接口(以1Mbps为例)
sudo ip link set can0 up type can bitrate 1000000
# 或创建虚拟CAN接口用于测试
sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0
- 在Linux主机上启用并配置CAN接口:
编译客户端
- 进入
client_demo目录 - 修改
Makefile中的交叉编译工具链路径(如果需要) - 执行编译命令:
1
2make # 交叉编译(默认)
make NATIVE=1 # 本地编译用于测试
- 进入
运行客户端
- 执行生成的客户端程序:
1
2./client -i can0 -s 7E8 -t 7E0 # 使用can0接口
./client -i vcan0 # 使用虚拟CAN接口
- 执行生成的客户端程序:
8. 使用方法 (Usage)
服务端使用 (Server Usage)
通过RT-Thread的MSH命令行界面控制UDS服务端:
1 | # 启动UDS服务端 |
服务端启动后将在指定的CAN接口上监听诊断请求,并根据配置提供相应的服务功能。
客户端使用 (Client Usage)
客户端提供交互式命令行界面,支持多种诊断命令:
1 | # 启动客户端(默认使用can1接口) |
9. 服务详解 (Service Details)
0x10 会话控制 (Diagnostic Session Control)
控制ECU的诊断会话模式,不同会话模式具有不同的安全级别和功能访问权限:
- 默认会话 (0x01):基本诊断功能
- 编程会话 (0x02):用于程序刷写
- 扩展会话 (0x03):访问更多诊断功能
0x27 安全访问 (Security Access)
通过种子-密钥机制保护敏感诊断功能:
- 客户端请求特定安全级别的种子
- 服务端返回随机种子值
- 客户端根据算法计算密钥
- 客户端发送密钥进行验证
- 验证通过后解锁对应的安全级别
0x2F 输入输出控制 (Input/Output Control)
控制ECU的数字量输入输出信号:
- 强制控制 (Short Term Adjustment):临时改变IO状态
- 返回控制 (Return Control):恢复IO控制权给应用程序
- 冻结状态 (Freeze Current State):锁定当前IO状态
- 复位默认 (Reset To Default):恢复IO到默认状态
0x31 远程控制台 (Remote Console)
通过UDS服务在服务端执行命令行指令,实现远程控制功能:
- 执行任意MSH命令
- 获取命令执行结果
- 支持目录切换和文件浏览
0x36/0x37/0x38 文件传输 (File Transfer)
完整的文件传输功能,支持上传和下载:
- 0x38 Request File Transfer:协商文件传输参数
- 0x36 Transfer Data:传输文件数据块
- 0x37 Request Transfer Exit:结束传输并校验完整性
10. 示例和日志 (Examples and Logs)
典型交互日志
1 | # 客户端启动 |
11. 开发指南 (Development Guide)
添加新的UDS服务
在服务端:
- 在
service/目录创建新的服务实现文件 - 实现服务处理函数
- 注册服务节点到UDS环境
- 在
在客户端:
- 在
services/目录创建客户端实现文件 - 实现命令处理函数
- 注册命令到命令管理系统
- 在
配置说明
客户端Makefile中的关键配置:
1 | # ISO-TP流控参数优化,提高传输效率 |
为什么 CAN 总线需要 UDS/控制台能力
- 单口多节点的现场可维护性:整机仅有单个 CAN 外接口但内部多 MCU。提供 UDS 诊断和 CAN 控制台可避免拆机接串口,直接复用现有 CAN 口完成日志、调试与控制权接管,降低售后排障成本。
- 标准化诊断语义:UDS 服务统一会话、安全、参数、文件与 IO 控制语义,减少自定义协议带来的互通与维护成本。
- 可靠的分段传输:ISO-TP 在 8 字节帧限制下提供分段与流控,支撑文件与固件分发。
- 安全与隔离:0x27 安全访问与 0x28 通信控制限制未授权操作,减少对主业务的干扰。
- 控制台优势:0x31 远程控制台允许远程执行命令、收集日志和调试脚本,无需物理接入,显著降低停机与运维成本。
总结
- 关键特性:RT-Thread 原生适配的 UDS 协议栈、完整服务列表(不含 DTC,原因见上)、可裁剪注册框架、示例级硬件抽象与控制权管理、SocketCAN 客户端控制台、文件/固件分发链路与远程运维能力。
- 学习建议:阅读 README 了解服务与架构,编译运行示例,观察启动/停止、CAN 回调与服务挂载流程;用客户端控制台覆盖会话、安全、IO、文件、远程控制台全链路测试;根据目标 MCU 资源调整线程栈、队列深度和服务裁剪,优化 CAN 过滤与优先级配置,并按项目需求自定义 0x19 DTC 扩展。








