
开发工具逆向工程嵌入式【免费下载链接】SavvyCANQT based cross platform canbus tool项目地址https://gitcode.com/gh_mirrors/sa/SavvyCAN点击查看免费下载本文围绕 SavvyCAN 的连接窗口Connection Window展开讲解如何在窗口中新增/删除/修改各类 CAN 接口设备GVRET、SerialBus、Lawicel、socketcand、MQTT、CANserver 等、保存总线参数波特率、监听模式、CAN FD以及利用窗口内置调试控制台排查 GVRET 串口设备通信故障。读完并结合源码你可以掌握该窗口的完整操作路径并能从信号槽层面理解每个按钮背后发生了什么。连接窗口承担三项职责添加、移除和修改连接见 help/connectionwindow.md 原文说明。它是整个应用程序与所有 CAN 硬件交互的总入口——主窗口在启动时就会预创建该窗口保证即使你从未打开过它后台连接状态也能保持更新见 mainwindow.cpp。窗口结构与连接列表窗口界面由三部分组成布局定义见 ui/connectionwindow.ui顶部连接列表表格展示所有已接入设备共 5 列——Type连接类型、Subtype驱动/子类型、Port端口、Buses总线数、Status状态。列定义见 canconnectionmodel.cpp状态列直接根据连接的CANCon::CONNECTED枚举显示 Connected / Not Connectedcanconnectionmodel.cpp。底部左侧 Bus Details 参数区用于查看/修改选中设备的总线设置。底部右侧调试控制台默认禁用勾选 Enable Console 后激活。列表行与设备对象一一对应。需要注意有些设备可以挂多条总线但在列表中仍只占一行原文档 Connecting To A Dongle 一节明确指出这一点。选中某一行时窗口会通过currentRowChanged槽读取该设备的总线数量在 Bus Details 下方为每条总线生成一个页签tab页签名为全局总线编号见 connectionwindow.cpp 中getBusBase与addTab的调用。添加新的设备连接Connecting To A Dongle点击 Add New Device Connection 按钮后弹出 NewConnectionDialog按设备类别选择连接方式并填写端口。窗口源码通过handleNewConn从对话框取回连接类型、端口名、驱动名、串口波特率、总线波特率、CAN FD 标志与数据速率共 7 个参数再交给工厂函数创建连接对象connectionwindow.cpp。支持的连接类型连接类型枚举定义在 canconconst.h 的CANCon::type中实际的实例化由 canconfactory.cpp 完成共 8 种可用类型界面选项枚举值创建的实现类说明GVRET (Serial)GVRET_SERIALGVRetSerial通过 USB 串口的 GVRET 设备Serial BusSERIALBUSSerialBusConnection基于 Qt QCanBus 插件的设备如 socketcanRemoteREMOTEGVRetSerialTCP 模式通过 TCP/IP 连接的 GVRET复用同一类KayakKAYAKSocketCANd运行 socketcand 守护进程的主机MQTTMQTTMQTT_BUS通过 MQTT 主题接入端口名填 Topic 名LawicelLAWICELLAWICELSerial经串口连接的 Kvaser LAWICEL 接口CANserverCANSERVERCANserver运行 CANserver 的主机端口名填 IPCANlogserverCANLOGSERVERCanLogServer运行 CANlogserver 的主机端口名填 IP创建逻辑中的两个值得注意的细节Remote 类型是 GVRET 的特例REMOTE直接new GVRetSerial(pPortName, true)源码注释说明它是通过 TCP/IP 连接的 GVRET所以用同一个类canconfactory.cpp。同样GVRET_SERIAL类型会根据端口名是否含 .且不含 tty/serial自动判断走 TCP 还是串口canconfactory.cpp。创建即启动create()在对象创建成功后立即连接status信号并调用conn_p-start()connectionwindow.cpp因此新设备加入列表后立即开始通信不需要额外连接动作。各类型端口的来源NewConnectionDialog构造函数会根据所选类型动态刷新端口下拉框的内容newconnectiondialog.cppGVRET / Lawicel串口类调用QSerialPortInfo::availablePorts()枚举系统串口。Lawicel 是唯一同时暴露 CAN 波特率、串口波特率、CAN FD 与数据速率选项的类型预设串口速率为 115200 至 3000000CAN 速率为 10000 至 1000000FD 数据速率为 1M 至 5Mnewconnectiondialog.cpp。Serial Bus先列出QCanBus::instance()-plugins()QCanBus 可用插件如 socketcan作为设备类型再按选中的插件枚举availableDevices()。若系统中没有任何 QCanBus 插件该选项会被禁用并显示错误提示newconnectiondialog.cpp。Remote / Kayak列表由连接窗口后台的UDP 广播发现机制自动填充见下文。设备自动发现UDP 广播连接窗口在构造时绑定了两个 UDP 套接字用于发现局域网中的设备connectionwindow.cppGVRET绑定0.0.0.0:17222ShareAddress模式允许多个 SavvyCAN 实例共存。收到广播的数据报后仅记录发送方 IP 到remoteDeviceIPGVRET。socketcand/Kayak绑定0.0.0.0:42000。数据报是一段 XML beaconreadPendingDatagrams()用QXmlStreamReader解析出CANBeacon name...、URL与Bus name...字段拼成BusHost (URL)格式的条目放入remoteDeviceKayakconnectionwindow.cpp。因此选择 Remote/Kayak 类型时下拉框里出现的就是刚才自动发现的设备无需手填 IP。移除与重置设备Removing a Device原文档描述的操作路径是在左上角的列表里点选设备然后点 Remove Selected Device 按钮。源码中该按钮控件名为btnDisconnect显示文本为 Disconnect Selected Device见 ui/connectionwindow.ui对应槽函数handleRemoveConn的执行顺序为connectionwindow.cppconnModel-remove(conn_p)——从模型进而CANConManager中移除conn_p-stop()——停止设备工作线程delete conn_p——释放对象自动选中列表第 0 行保持 Bus Details 区不处于空状态。窗口还提供 ResethandleResetConn不改变端口/驱动配置仅stop()后用相同参数重新create()并替换原对象connectionwindow.cpp。注意该函数中串口/总线速率参数当前固定为 0/false源码留有TODO: implement these重置主要用于强制重建通信链路。此外btnMoveUp/btnMoveDown两个按钮可调整列表顺序moveConnUp/moveConnDownconnectionwindow.cpp。列表顺序影响全局总线编号的分配基础在多设备场景下调整顺序会改变各总线编号的映射。修改总线设置Modifying Device Settings选中列表中某台设备后Bus Details 区域会填入该设备当前总线参数。原文档强调的两点在源码中均有对应多总线设备显示页签如前所述currentRowChanged按conn_p-getNumBuses()为每条总线添加页签。必须点击 Save Bus Settings 才生效参数区所有改动都只更新界面控件真正的下发发生在saveBusSettings()connectionwindow.cppCANConnection* conn_p connModel-getAtIdx(selIdx); CANBus bus; if (!conn_p-getBusSettings(offset, bus)) { ... } // 先取当前配置 bus.setSpeed(ui-cbBusSpeed-currentText().toInt()); // 总线波特率 bus.setActive(ui-ckEnable-isChecked()); // 是否启用 bus.setListenOnly(ui-ckListenOnly-isChecked()); // 监听模式 bus.setCanFD(ui-canFDEnable-isChecked()); // CAN FD bus.setDataRate(ui-cbDataRate-currentText().toInt()); // FD 数据速率 conn_p-setBusSettings(offset, bus); // 下发到设备其中offset是 Bus Details 当前页签下标即作用于哪条总线。CANBus参数对象定义在 canbus.h除上述五个可编辑项外还包含singleWire单线模式字段但连接窗口 UI 未开放该项。总线波特率候选值在窗口构造时写死为 8 档33333、50000、83333、100000、125000、250000、500000、1000000 bpsconnectionwindow.cpp。若设备实际速率不在其中例如 Lawicel 的 10000/20000 档populateBusDetails会动态追加一项以完整还原真实值connectionwindow.cpp。CAN FD 选项的可见性只有SERIALBUS与LAWICEL两种类型会显示 CAN FD 复选框与数据速率下拉框其余类型隐藏connectionwindow.cpp。setBusSettings经由基类 canconnection.h 声明在设备工作线程上下文调用各后端的piSetBusSettings虚函数例如 Lawicel 后端会通过串口下发 0xF1 开头的命令帧更新波特率lawicel_serial.cpp。单元测试 test/tst_cancon.cpp 覆盖了这套接口的完整生命周期创建连接、start()后等待恰好一次status信号且值为CONNECTED、配置总线后从LFQueue出帧验证。连接配置的保存与恢复连接窗口支持把连接配置持久化到QSettings。启用条件是主设置中勾选 Save/Restore Connections设置项Main/SaveRestoreConnections见 mainsettingsdialog.cpp。开启后窗口构造时调用loadConnections()读取connections/portNames、connections/types、connections/driverNames、connections/busSpeeds_0、connections/isCanFds_0、connections/DataRates_0、connections/serialSpeeds等键并逐一重建连接六组数组长度不一致时直接放弃加载以防错位connectionwindow.cpp。窗口析构时saveConnections()会把当前所有连接按同样格式写回connectionwindow.cpp。注意保存逻辑只取每条设备第 0 号总线的波特率/速率参数多总线设备其余总线的参数依赖设备自身记忆或重新保存。调试控制台排查 GVRET 连接问题Debugging Connection Problems原文档指出 GVRET 设备以串口呈现、配置项众多且固件可自行编译这既是优点也是双刃剑出错的机会很多因此连接窗口内置了一个调试控制台。其工作机制打开控制台先在表中选中某条总线连接再勾选 Enable Console。槽函数consoleEnableChanged会把该连接的两个信号/槽连起来connectionwindow.cppconn_p的debugOutput信号 → 窗口的getDebugText槽设备产生的每条调试文本都会append到textConsole文本框connectionwindow.cpp窗口的sendDebugData信号 →conn_p的debugInput槽控制台发出的字节被注入设备通信流。切换选中行时旧连接的连接会先断开再重连到新连接避免多个设备的调试输出混杂。以 GVRET 后端为例debugInput的实现就是直接把字节写到串口gvretserial.cpp而接收侧readSerialData会把每个收到的字节以两位十六进制拼成字符串发出debugOutput同时逐字节送入状态机procRXChar解析gvretserial.cpp。所以控制台能同时看到SavvyCAN 发了什么、收到什么——包括 0xF1 帧头、命令码、CAN 帧载荷、时间同步command 1、设备信息等并带有 Got data from serial. Len N、Comm validation failed. 等扩展状态消息这些正是原文档所说的有助于缩小故障范围的信息。Send Hex / Send Text控制台下方有一个输入行lineSend与两个发送按钮Send Hex把输入行按空格分隔解析为十六进制字节序列后发出例如输入f1 05 00即发送 3 个字节handleSendHexconnectionwindow.cppSend Text发送输入行的原始文本并自动追加\r作为行结束handleSendTextconnectionwindow.cpp。原文档特别提醒GVRET 的正常流量是二进制的Send Text 对普通 GVRET 通信帮助不大。但 GVRET 设备存在一个文本控制台模式——用串口终端程序连上后输入?并跟随任意一种行结束符Cr、Lf、CrLf 均可即可通过文本方式配置设备。因此在控制台中可以用 Send Text 发送?来探测设备是否处于文本控制台状态或用 Send Hex 精确构造 0xF1 协议帧做底层验证。控制台还提供 Clear 按钮清空输出handleClearDebugText。排查建议基于源码可见的行为完全看不到 Got data from serial多半是串口未打开或波特率不匹配先看构造阶段是否有 cant open serial port ... 之类的消息gvretserial.cpp有数据但状态机不进 CONNECTED观察命令码序列Comm validation failed. 表示握手校验未通过gvretserial.cpp需要自定义交互Send Hex 按 GVRET 协议帧头 0xF1 命令码 载荷逐帧构造。小结连接窗口把 SavvyCAN 的全部硬件接入能力收敛到一个界面8 种连接类型由 canconfactory.cpp 工厂统一创建并纳入CANConManager单例管理总线参数通过CANBus值对象经setBusSettings下发到各后端工作线程GVRET/Lawicel 等串口设备则可借助debugOutput/debugInput信号链驱动的调试控制台做逐字节级的通信排查。理解 help/connectionwindow.md 中四个操作场景添加、删除、修改、调试对应的handleNewConn、handleRemoveConn、saveBusSettings、consoleEnableChanged四个槽函数后即可把界面操作与底层实现一一对照快速定位连接问题。赞分享开发工具逆向工程嵌入式【免费下载链接】SavvyCANQT based cross platform canbus tool项目地址https://gitcode.com/gh_mirrors/sa/SavvyCAN点击查看免费下载相关推荐SavvyCAN 实战指南Qt 跨平台 CAN 总线工具的编译、连接与日志文件导入导出SavvyCAN 实战指南Qt 跨平台 CAN 总线工具的编译、连接与日志文件导入导出 SavvyCAN 是一款基于 Qt 的跨平台 CAN 总线工具用于加开发工具逆向工程嵌入式INAV 飞控 DroneCAN 深度指南CAN 总线外设接入、动态节点分配与配置实战INAV 飞控 DroneCAN 深度指南CAN 总线外设接入、动态节点分配与配置实战 导读 DroneCAN原 UAVCAN v0是为航空航天与机器人应无人机嵌入式智能硬件ComfyUI-WanVideoWrapper 快速上手指南从文字到视频、图生视频到显存调优的三档进阶ComfyUI WanVideoWrapper 快速上手指南从文字到视频、图生视频到显存调优的三档进阶 ComfyUI WanVideoWrapper 是面向人工智能大模型媒体生成创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考