ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

cantools 完整文档导读:CAN 总线数据库解析、消息编解码、CLI 工具与代码规范实战指南

cantools 完整文档导读:CAN 总线数据库解析、消息编解码、CLI 工具与代码规范实战指南 嵌入式开发工具【免费下载链接】cantoolsCAN bus tools.项目地址https://gitcode.com/gh_mirrors/ca/cantools点击查看免费下载本文以 cantools 官方文档docs/index.rst内嵌完整README.rst为骨架结合仓库源码展开系统讲解这个 Python 3 CAN 总线工具集从数据库解析DBC/KCD/SYM/ARXML/CDD、消息编码解码、诊断 DID、CLI 命令行工具decode/plot/dump/list/generate_c_source/monitor/convert到 C 源码生成与 Ubuntu 虚拟 CAN 接口vcan实战的完整技术栈。阅读本文后你将能够直接用 cantools 加载车载网络数据库、在脚本或candump管道中实时解码 CAN 报文、可视化信号曲线、生成可落地的 C 代码并理解其 API 设计与编码规范。项目概览cantools 能做什么cantools 是使用 Python 3 编写的 CAN 总线工具集CAN BUS tools in Python 3.官方文档将其核心能力总结为多格式数据库解析支持DBC、KCD、SYM、ARXML 34 与 CDD 文件的读取与写入。CAN 消息编码与解码根据信号定义位序、缩放因子、偏移量、符号性将物理量编码为字节串、或将原始字节解码为物理量。简单与扩展的信号多路复用signal multiplexing支持一个多路复用信号按取值切换不同的信号子集。诊断 DID 编码与解码面向 UDS 等诊断服务的数据DID/Data编解码。candump输出解码直接消费 Linuxcandump程序抓取的日志流。节点 Tester 工具cantools.tester.Tester提供基于 CAN 数据库的测试辅助。C 源代码生成器从数据库生成 C 语言的struct、pack/unpack与信号encode/decode函数。CAN 总线监控器文本界面实时监控总线流量。信号图形化绘图基于 matplotlib 可视化信号随时间的变化曲线。上述能力的模块组织可从源码结构印证src/cantools/database/下是 CAN 与诊断数据库的加载/序列化逻辑can/formats/含dbc/、kcd.py、sym.py、arxml/diagnostics/formats/cdd.py负责 CDDsrc/cantools/subparsers/下是各 CLI 子命令decode.py、plot.py、monitor.py、generate_c_source.py、convert.py、list.py、dump/src/cantools/c_source.py与tester.py分别对应 C 代码生成与节点测试。安装项目使用标准pip方式安装python3 -m pip install cantools注意默认安装不包含 matplotlib因此plot绘图子命令需要额外安装可选依赖python3 -m pip install cantools[plot]同理数据库加载缓存见下文cache_dir参数依赖可选的diskcache包可通过pip install cantools[cache]启用。脚本化使用加载数据库、编码与解码官方文档以tests/files/dbc/motohawk.dbc这个小型 DBC 文件为贯穿示例。第一步是解析数据库并打印消息与信号 import cantools from pprint import pprint db cantools.database.load_file(tests/files/dbc/motohawk.dbc) db.messages [message(ExampleMessage, 0x1f0, False, 8, Example message used as template in MotoHawk models.)] example_message db.get_message_by_name(ExampleMessage) pprint(example_message.signals) [signal(Enable, 7, 1, big_endian, False, 1.0, 0, 0.0, 0.0, -, False, None, {0: Disabled, 1: Enabled}, None), signal(AverageRadius, 6, 6, big_endian, False, 0.1, 0, 0.0, 5.0, m, False, None, None, ), signal(Temperature, 0, 12, big_endian, True, 0.01, 250, 229.53, 270.47, degK, False, None, None, None)]从输出可见Message与Signal的 repr 字段对应其构造参数Enable起始位 7长度 1 位大端缩放 1.0偏移 0枚举值{0: Disabled, 1: Enabled}、AverageRadius缩放 0.1单位 m、Temperature有符号缩放 0.01偏移 250范围 229.53~270.47单位 degK。编码并发送到总线配合python-can包可把信号字典编码为字节串并发送到虚拟 CAN 总线 import can can_bus can.interface.Bus(vcan0, bustypesocketcan) data example_message.encode({Temperature: 250.1, AverageRadius: 3.2, Enable: 1}) message can.Message(arbitration_idexample_message.frame_id, is_extended_idexample_message.is_extended_frame, datadata) can_bus.send(message)也可以绕过Message.encode()直接调用数据库级的encode_message()源码见 database.py它同时接受 frame_idint或消息名str内部走_frame_id_to_message/_name_to_message查表 db.encode_message(158, {Bar: 1, Fum: 5.0}) b\x01\x45\x23\x00\x11 db.encode_message(Foo, {Bar: 1, Fum: 5.0}) b\x01\x45\x23\x00\x11encode()方法message.py的三个可选参数含义scalingTrue默认对信号应用缩放物理量 raw × factor offset设为False则不缩放。paddingFalse默认未使用的位编码为 0设为True则按unused_bit_pattern默认0x00填充为 1。strictTrue严格模式会先调用assert_signals_encodable()校验信号值是否在允许范围内、信号是否齐全否则抛出EncodeError。接收并解码接收一帧并解码得到信号名到物理值的字典 message can_bus.recv() db.decode_message(message.arbitration_id, message.data) {AverageRadius: 3.2, Enable: Enabled, Temperature: 250.09}注意Enable被解码为枚举字符串Enabled而非整数1——这是decode_choices默认开启的效果。decode_message()database.py关键参数decode_choicesTrue将缩放后的值映射为choices中的字符串设为False则返回数值。scalingTrue默认缩放False返回原始 raw 值。allow_truncatedFalse数据不足时是否允许截断解码。decode_containersFalse容器帧container frame的解码需显式开启否则抛出DecodeError因为容器帧返回的是(Message, SignalsDict)元组列表会破坏普通调用方的预期。更多综合示例见仓库 examples 目录如 hello_world.py、dbc_io/main.py、motor_tester。核心 API 参考Functions and classesdocs/index.rst通过 Sphinx 的autofunction/autoclass/autodata指令把以下对象直接纳入文档索引构成完整的公开 API 面顶层加载/转储函数cantools.database.load_file()打开并解析文件返回can.Database或diagnostics.Database。cantools.database.dump_file()将数据库写回文件。cantools.database.load_string()解析字符串内容。cantools.database.load()解析文件对象file-like object读取其.read()内容。load_file 的格式与编码推断load_file()database/init.py在database_format与encoding均为None时按扩展名自动推断格式、按格式推断默认编码扩展名大小写不敏感扩展名数据库格式默认编码.arxmlarxmlutf-8.dbcdbccp1252.kcdkcdutf-8.symsymcp1252.cddcddutf-8其他/未知Noneutf-8dbc与sym默认使用cp1252编码是因为这两种格式在历史工具链中常含 Latin-1 字符源码_resolve_database_format_and_encoding()中明确映射了这一点。其他重要参数frame_id_mask对消息 frame id 做掩码后建索引用于复用同一 id 空间的场景。prune_choices默认开启把枚举取值名中共有的、以_结尾的前缀去掉以缩短名称需要原名时传False。strictTrue信号重叠或超出消息长度时抛异常。sort_signals默认sort_signals_by_start_bit按起始位排序传None不排序也可传自定义函数如lambda signals: list(sorted(signals, keylambda sig: sig.name))。cache_dir启用磁盘缓存依赖diskcache缓存键包含文件路径 修改时间 全部影响结果的参数可通过环境变量CANTOOLS_CACHE_DIR开启删除cache_dir目录即可清缓存。未安装diskcache时会发出警告并自动禁用缓存。解析失败会抛出UnsupportedDatabaseFormatErrorload_string()在database_formatNone时按arxml → dbc → kcd → sym → cdd顺序逐一尝试解析源码见 database/init.py。dump_file 的写回规则dump_file()database/init.py只支持写出dbc、kcd、sym三种格式其余抛Unsupported output database format。规则dbc文件总是使用 Windows 风格行尾\r\n其他格式跟随操作系统这与源码中newline\r\n的显式声明一致。DBC 默认按信号起始位降序排序输出KCD 默认不排序可通过sort_signalsNone关闭排序。若要让 foo.dbc 与 bar.dbc 差异最小加载时传sort_signalsNone, prune_choicesFalse。load_file(..., sort_signalsNone)后再dump_file()会继承“不排序”的设定as_dbc_string()中若加载时未排序则默认也传None。CAN 数据库对象Database / Message / Signal / Node / Bus / SignalGroupcantools.database.can.Database整个 CAN 网络的容器。公开属性/方法包括messages、nodes、buses、version、dbcDBC 特有属性对象、autosarAUTOSAR 特有属性对象、get_message_by_name()、get_message_by_frame_id()frame id 大于0x7FF自动按扩展帧处理、get_node_by_name()、get_bus_by_name()、encode_message()、decode_message()、add_dbc_string()/add_dbc_file()/add_arxml_string()/add_arxml_file()/add_kcd_string()/add_kcd_file()/add_sym_string()/add_sym_file()、as_dbc_string()/as_kcd_string()/as_sym_string()、is_similar()容差比较忽略舍入等微小差异、refresh()修改消息后重建查找表。构造参数中的strict与sort_signals语义与load_*一致frame_id_mask默认0xffffffff。cantools.database.can.Message单条 CAN 消息。属性包括frame_id、name、length、signals、is_extended_frame、is_fd、senders、receivers、comment/comments、send_type、cycle_time、dbc、autosar、signal_groups、signal_tree、is_container、contained_messages、header_id、unused_bit_pattern等。方法包括encode()、decode()、decode_simple()、decode_container()、unpack_container()、get_signal_by_name()、is_multiplexed()、refresh()。构造时对 frame id 有位数校验标准帧超过 11 位、扩展帧超过 29 位都会抛Error见 message.py。cantools.database.can.Signal单个信号。属性包括name、start、length、byte_orderlittle_endian/big_endian、is_signed、raw_initial、raw_invalid、conversion、minimum、maximum、unit、comment/comments、receivers、is_multiplexer、multiplexer_ids、multiplexer_signal、spn、choices等方法包括raw_to_scaled()、scaled_to_raw()、choice_to_number()、is_float()。cantools.database.can.Node网络节点属性name、comment/comments、dbc、autosar。cantools.database.can.Bus总线属性name、comment/comments、baudrate、fd_baudrate、autosar。cantools.database.can.signal_group.SignalGroup信号组属性name、repetitions、signal_names。DBC 特有对象DbcAttributeDefinitionDBC 属性定义属性name、default_value、kind、type_name、minimum、maximum、choices。DbcAttributeValueTypeVar属性值类型联合autodata指令导出。DbcAttribute一次具体属性赋值属性name、value、definition方法formatted_value()。DbcEnvironmentVariableDBC 环境变量属性name、env_type、minimum、maximum、unit、initial_value、env_id、access_type、access_nodes、data_size、comment、dbc。DbcSpecifics挂在 Database/Message/Node/Signal 上的 DBC 专属信息属性attributes、attribute_definitions、value_tables、environment_variables、relation_attributes、relation_attribute_definitions。这些类型定义位于 formats/dbc 下如dbc_attribute_definition.py、dbc_attribute.py、dbc_environment_variable.py、dbc_specifics.py。AUTOSAR 特有对象AutosarDatabaseSpecifics数据库级 AUTOSAR 信息如arxml_version。AutosarMessageSpecifics消息级信息属性pdu_paths、is_nm、is_general_purpose、is_secured、secocSecOC 安全属性、e2eE2E 端到端保护属性。AutosarNodeSpecifics节点级 AUTOSAR 信息。AutosarSecOCPropertiesSecOC 属性含auth_algorithm_name、freshness_algorithm_name、payload_length、data_id、auth_tx_bit_length、freshness_bit_length、freshness_tx_bit_length。AutosarEnd2EndPropertiesE2E 属性含category、data_ids、payload_length。AutosarBusSpecifics总线级 AUTOSAR 信息。这些类型位于 formats/arxmldatabase_specifics.py、message_specifics.py、node_specifics.py、secoc_properties.py、end_to_end_properties.py、bus_specifics.py由SystemLoadersystem_loader.py与EcuExtractLoaderecu_extract_loader.py两类加载器解析 AUTOSAR System Extract 与 ECU Extract 文件ecu-extract-4.2.arxml、system-4.2.arxml 等测试样例。数值表示与转换cantools.database.namedsignalvalue.NamedSignalValue信号命名值如带名称的枚举物理量其__repr__/__eq__使{Enable: Enabled}这样的字典可直接比较与打印。cantools.database.conversion.BaseConversion缩放转换基类Signal.scale/offset即其实现。诊断数据库UDS DIDcantools.database.diagnostics.Database诊断数据库。cantools.database.diagnostics.Did诊断标识符DID。cantools.database.diagnostics.DataDID 承载的数据对象。CDD 格式由 diagnostics/formats/cdd.py 实现测试样例见 tests/files/cdd如 example.cdd、example-diddatarefs.cdd示例脚本见 examples/diagnostics/did.py。异常与测试辅助cantools.database.UnsupportedDatabaseFormatError无法识别数据库格式时抛出errors.py 中与DecodeError、EncodeError并列定义。cantools.tester.Tester基于 CAN 数据库的节点测试类。cantools.tester.DecodedMessage解码后的消息容器含name消息名与signals消息信号两个数据字段。cantools.typechecking.Codec内部编解码器类型别名Message._codecs即该类型用于描述一条消息全部信号的解码格式与多路复用结构。命令行工具CLICLI 入口为python3 -m cantoolsmain.py 调用init.py 中的_main()。顶层参数有-d/--debug开启 DEBUG 日志与--version。所有子命令定义在src/cantools/subparsers/目录每个模块提供add_subparser()向 argparse 注册因此新子命令是自动发现、按文件加载的加载失败不影响其他命令。可用子命令包括decode、plot、dump、list、generate_c_source、monitor、convert等。decode解码 candump 输出从标准输入读取 Linuxcandump抓取的帧按数据库解码为可读文本$ candump vcan0 | python3 -m cantools decode tests/files/dbc/motohawk.dbc vcan0 1F0 [8] 80 4A 0F 00 00 00 00 00 :: ExampleMessage( Enable: Enabled -, AverageRadius: 0.0 m, Temperature: 255.92 degK )使用--single-line把每条消息压缩到一行便于脚本或日志聚合$ candump vcan0 | python3 -m cantools decode --single-line tests/files/dbc/motohawk.dbc vcan0 1F0 [8] 80 4A 0F 00 00 00 00 00 :: ExampleMessage(Enable: Enabled -, AverageRadius: 0.0 m, Temperature: 255.92 degK)plot信号可视化plot与decode类似但输出 matplotlib 图形而非文本。先抓取日志再绘图$ candump -l vcan0 $ cat candump-2021-01-04_180521.log (1609779922.655421) vcan0 00000343#B204B9049C049C04 (1609779922.655735) vcan0 0000024A#120527052E051905 ... $ cat candump-2021-01-04_180521.log | python3 -m cantools plot tests/files/dbc/abs.dbc信号选择语法支持通配符与布局控制*匹配任意数量任意字符?匹配恰好一个任意字符用-分隔的信号显示在不同子图信号后可用冒号指定可选格式如:-、:、:3、:4等线型/样式标记。例如左侧轮速与右侧轮速分两个子图显示$ cat candump-2021-01-04_180521.log | python3 -m cantools plot tests/files/dbc/abs.dbc *33.*fl:- *33.*fr:- - *33.*rl:- *33.*rr:-取值范围差异大的信号可以在同一子图内使用不同纵轴用逗号分隔信号组配合--auto-color自动着色并用--ylabel分别标注$ cat candump-2021-01-04_180521.log | cantools plot --auto-color tests/files/dbc/abs.dbc -- \ --ylabel Bremse 33 *_33.*fl*:- *_33.*fr*: *_33.*rl*:3 *_33.*rr*:4 , \ --ylabel Bremse 2 *_2.*fl*:- *_2.*fr*: *_2.*rl*:3 *_2.*rr*:4matplotlib 预装多种绘图风格可直接套用$ cat candump-2021-01-04_180521.log | cantools plot tests/files/dbc/abs.dbc --style seaborn遍历所有可用风格逐个预览$ cantools plot --list-styles . | sed -n /^- /s/^- //p | while IFS read -r style; do cat candump-2021-01-04_180521.log | cantools plot tests/files/dbc/abs.dbc --style $style --title --style $style done全部参数以python3 -m cantools plot --help为准。相关单测见 test_plot.py 与 test_plot_unittests.py。dump人类可读转储以美观的排版打印数据库全部内容包括位布局图、信号树与枚举值$ python3 -m cantools dump tests/files/dbc/motohawk.dbc Messages ------------------------------------------------------------------------ Name: ExampleMessage Id: 0x1f0 Length: 8 bytes Cycle time: - ms Senders: PCM1 Layout: Bit 7 6 5 4 3 2 1 0 ------------------------ 0 |-x|---------------------x|--| ------------------------ | -- AverageRadius -- Enable ------------------------ 1 |-------------------------------| ------------------------ 2 |----------x| | | | | | B ------------------------ y -- Temperature t ------------------------ e 3 | | | | | | | | | ------------------------ 4 | | | | | | | | | ------------------------ 5 | | | | | | | | | ------------------------ 6 | | | | | | | | | ------------------------ 7 | | | | | | | | | ------------------------ Signal tree: -- {root} -- Enable -- AverageRadius -- Temperature Signal choices: Enable 0 Disabled 1 Enabled该子命令实现于 subparsers/dump格式化逻辑在 formatting.py。list脚本友好输出与dump类似但输出“没那么漂亮、更全面、更适合 shell 脚本解析”$ python3 -m cantools list -a tests/files/dbc/motohawk.dbc ExampleMessage: Comment[None]: Example message used as template in MotoHawk models. Frame ID: 0x1f0 (496) Size: 8 bytes Is extended frame: False Signals: Enable: Type: Integer Start bit: 7 Length: 1 bits Unit: - Is signed: False Named values: 0: Disabled-a/--all等选项说明可用python3 -m cantools list --help查询实现见 subparsers/list.py。generate_c_source生成 C 代码从数据库生成 C 源码生成物包含消息structmotohawk.h 中对应#define MOTORA ...与结构体定义区域消息pack/unpack函数信号encode/decode函数frame id、长度、类型、周期时间与信号枚举的#define宏如MOTORA_EXAMPLE_MESSAGE_FRAME_ID、MOTORA_EXAMPLE_MESSAGE_LENGTH等。已知限制信号最大 64 位实践中几乎不会超过。$ python3 -m cantools generate_c_source tests/files/dbc/motohawk.dbc Successfully generated motohawk.h and motohawk.c.生成的完整内容可对照 motohawk.h 与 motohawk.c 查看。--use-float浮点信号使用单精度float而非double$ python3 -m cantools generate_c_source --use-float tests/files/dbc/motohawk.dbc Successfully generated motohawk.h and motohawk.c.--database-name自定义生成类型、宏与函数的命名空间前缀同时改变输出文件名$ python3 -m cantools generate_c_source --database-name my_database_name tests/files/dbc/motohawk.dbc Successfully generated my_database_name.h and my_database_name.c.见 my_database_name.h 与 my_database_name.c。--no-floating-point-numbers生成不含float/double的定点代码$ python3 -m cantools generate_c_source --no-floating-point-numbers tests/files/dbc/motohawk.dbc Successfully generated motohawk.h and motohawk.c.见 motohawk_no_floating_point_numbers.h 与 motohawk_no_floating_point_numbers.c。--node只生成指定节点发送消息的pack函数、以及信号接收者属于该节点的unpack函数$ cantools generate_c_source tests/files/dbc/motohawk.dbc --node PCM1 Successfully generated motohawk.h and motohawk.c.见 motohawk_sender_node.h 与 motohawk_sender_node.c。C 生成器核心实现位于 src/cantools/database/can/c_source.py对应测试样例覆盖了位域*_bit_fields.*、浮点floating_point.*、多路复用multiplex.*、轮询舍入motohawk_use_round.*等多种形态见 tests/files/c_source。monitor文本界面总线监控以 TUI文本用户界面实时监控总线流量$ python3 -m cantools monitor tests/files/dbc/motohawk.dbc底部菜单提供以下操作Quit退出监控器也可用Ctrl-C。Filter只显示匹配给定正则表达式的消息或信号输入行按Enter返回菜单。Play/Pause在播放与暂停运行与冻结之间切换。Reset将监控器重置到初始状态。实现见 subparsers/monitor.py相关单测见 test_monitor.py。convert数据库格式互转convert子命令把数据库从一种格式转换为另一种实现见 subparsers/convert.py对应测试见 test_convert.py 与 test_conversion.py。DBC 互转的正确性由tests/files/dbc/下的“原文件 *_dumped文件”配对验证如 multiplex_2.dbc 与 multiplex_2_dumped.dbc。Coding style编码规范文档以“基于作者个人偏好”的方式定义了本包源码的编码风格对贡献者而言是必须遵守的规则语句if、while、return等前后要有空行除非位于其他语句或文件的开头/结尾。文件级定义之间留两个空行。运算符前后留空格关键字参数keyword arguments两侧不允许空格。每行只导入一个模块/对象。注释与 docstring 以大写字母开头、以句号结尾像句子一样。docstring 之后留一个空行。单行最大 90 字符目标是不超过 80 字符。函数参数要么全部写在一行要么每行一个。类名用CamelCase不允许下划线。函数名与变量名用小写 下划线分隔snake_case。规范的示例代码数字标注对应上述规则import sys from os import path # (5) from os import getcwd # (5) # (2) # (2) def foo(bars, fumNone): # (4) This is a doc string. # (6) # (7) fies [] # (3) kam path.join(getcwd(), ..) # (1) for bar in bars: if len(bar) 1): # (8) fies.append(ham 2 * bar) # (3) # (1) # This is a comment. # (6) if fum in None: fum 5 # (3) else: fum 1 # (3) # (1) fies * fum # (3) # (1) return fies # (2) # (2) def goo(): return True示例中if len(bar) 1):与if fum in None是文档原样保留的演示代码并非真实语法。Tips and tricksUbuntu 虚拟 CAN 接口在无硬件的情况下调试 CAN 应用可在 Ubuntu 上创建虚拟 CAN 接口。官方文档给出的完整三步设置sudo modprobe vcan sudo ip link add dev vcan0 type vcan sudo ip link set vcan0 mtu 72 # For CAN-FD sudo ip link set up vcan0第一条加载vcan内核模块第二条创建名为vcan0的虚拟 CAN 设备第三条可选把 MTU 设为 72以支持 CAN-FD经典 CAN 的 MTU 为 16CAN-FD 需要 72第四条把接口置为up状态。设置完成后即可配合python-can的socketcan后端can.interface.Bus(vcan0, bustypesocketcan)以及candump/can send等工具进行收发测试。仓库中decode、plot、monitor各子命令的文档示例均基于此环境。贡献指南Contributing文档同时给出了向本仓库提交贡献的标准流程Fork 仓库。安装开发依赖使用tox可跳过此步python3 -m pip install -e .[dev]。实现新功能或修复 bug。编写测试用例防止未来改动破坏既有行为。运行 linterruff check src、mypy src或tox -e ruff、tox -e mypy。运行测试tox -e py。检查测试覆盖率tox -e cov然后用firefox htmlcov/index.html查看报告。创建 Pull Request。配置集中在 pyproject.toml 与 tox.ini完整的测试套件位于 tests 目录test_database.py、test_command_line.py、test_autosar.py 等C 生成代码的交叉验证由 tests/test_c_code 下的 C 测试工程完成。总结作为docs/index.rst的完整导读本文覆盖了 cantools 文档的全部四大板块README 中的功能矩阵、安装与脚本/CLI 全流程示例Sphinx 自动生成的 Functions and classes API 索引含 CAN 数据库、DBC/AUTOSAR 特有对象、诊断数据库与 Tester作者定义的 Coding style 规范以及 Ubuntu vcan 虚拟接口搭建技巧。配合仓库中 examples、tests/files 与 src/cantools 源码读者可以完整掌握这一 CAN 工具链的实战用法与内部机制。赞分享嵌入式开发工具【免费下载链接】cantoolsCAN bus tools.项目地址https://gitcode.com/gh_mirrors/ca/cantools点击查看免费下载相关推荐CAN总线数据处理实战从环境搭建到消息编解码全指南CAN总线数据处理实战从环境搭建到消息编解码全指南 如何高效解析汽车CAN总线数据 在汽车电子和工业控制领域CAN总线作为一种高可靠性的串行通信协议被广嵌入式开发工具探索CAN总线工具Cantools探索CAN总线工具Cantools 项目介绍 Cantools是一个基于Python 3的CAN总线工具集提供了丰富的功能来处理CAN消息和信号。它支持多种嵌入式开发工具Cantools工具库40.1.0版本发布增强CAN总线数据分析能力Cantools工具库40.1.0版本发布增强CAN总线数据分析能力 Cantools是一个功能强大的Python库专门用于处理CANController嵌入式开发工具上一篇gh_mirrors/er/errors深度解析Go语言错误处理新范式下一篇如何快速搭建现代化管理后台Ant Design Vue Pro完整配置指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表