
uds协议中没有标准化的did用于读取电池电压,该参数完全由厂商自定义;实际应用中应优先考虑obd2接口的专用api或查阅具体ecu厂商文档获取对应did。
在使用python-udsoncan库通过ISO-TP连接(如IsoTPSocketConnection)调用UDS服务ReadDataByIdentifier(0x22)读取ECU数据时,一个常见误区是认为存在通用DID(如0xF190)可直接获取“电池电压”。但根据ISO 14229-1:2020标准,该规范仅定义了有限的通用DID(如0xF180–0xF1FF为制造商自定义DID保留范围),并未标准化任何与供电电压相关的DID——这意味着0xF190是否有效、其含义为何,完全取决于具体车辆制造商或ECU供应商。
例如,部分厂商可能将电池电压映射到:
- 0xF190(某德系厂商内部定义)
- 0xF1A2(某日系T-Box模块私有DID)
- 或非F1xx范围的DID(如0x0105,需配合特定安全访问流程)
因此,盲目尝试通用DID不仅可能返回0x31(requestOutOfRange)或0x33(securityAccessDenied)等否定响应,还可能导致会话超时或ECU拒绝后续请求。
✅ 正确实践建议如下:
-
优先使用OBD2标准接口
大多数车载OBD2适配器(如ELM327、STN1110芯片方案)支持AT指令或PID 0x010C(Engine Coolant Temperature)同级的电压查询机制。例如:# 使用obd库(需串口/蓝牙连接) import obd connection = obd.OBD("/dev/ttyUSB0") voltage = connection.query(obd.commands.CONTROL_MODULE_VOLTAGE) # PID 0x42 print(f"Battery voltage: {voltage.value} V") # 通常返回12.0–14.5V -
若必须使用UDS,请获取厂商文档
- 联系整车厂(OEM)或ECU供应商索取《Diagnostic Specification》或DID定义表;
- 注意DID数据格式(如2字节无符号整数,单位为0.01V,需换算);
- 部分DID需先执行SecurityAccess(0x27)解锁。
-
调试技巧
- 使用client.get_server_data()辅助分析响应结构;
- 启用日志查看原始CAN帧:logging.getLogger('udsoncan').setLevel(logging.DEBUG);
- 对未定义DID,ECU典型响应为0x7F 0x22 0x31(服务0x22否定响应,原因0x31)。
⚠️ 注意:0xF190并非行业通用电压DID,将其硬编码进生产环境存在严重兼容性风险。始终以实车实测+官方文档为唯一依据。










