基于 .NET 10.0 WPF 的 ModHandler PC 工具,采用 MVVM 架构,从 can-uart-tool Win32 C 项目重写而来。
- 通过 TCP 连接 LoRa 网关,实时接收并显示 LoRa 数据帧
- 支持十六进制原始数据展示与帧解析
- 网络参数(NID、GWID)显示
- UDP 广播自动发现局域网内 LoRa 网关设备
- AT 指令查询/设置 LoRa 参数(协议模式、工作模式、信道、速率、功率、NID、GWID)
- 支持多设备切换
- CAN 模式 — 通过 PCAN-USB 适配器发送固件,支持虚拟 CAN 测试模式(无需硬件即可模拟完整升级流程,固件输出为
virtual_firmware.bin) - UART 模式 — 通过串口发送固件,完整实现 CRC16-CCITT 帧协议
- 支持获取固件版本、板卡重启、测试模式
- 实时进度条显示
- 手动发送任意 CAN 帧(标准帧/扩展帧/远程帧)
- LoRa 模块上电/测试模式切换
- LoRa 配置快捷命令(协议、模式、信道、速率、功率、NID、GWID)
- 实时 CAN 帧监控,自动识别帧类型(心跳、LoRa、平台、固件数据等)
ModHandlerPcTool/
├── Models/
│ ├── CanHalFrame.cs CAN 帧模型 + CAN/协议常量定义
│ ├── LoraFrame.cs LoRa 数据帧模型 + 设备/连接状态枚举
│ └── SerialPortInfo.cs 串口信息模型 + 串口常量
├── Services/
│ ├── ICanHalService.cs CAN HAL 接口 + CanHalServiceStub
│ ├── ILoraSdkService.cs LoRa SDK 接口 + LoraSdkServiceStub
│ ├── IUartManagerService.cs UART 管理接口 + UartManagerServiceStub
│ ├── PcanCanHalService.cs PCAN P/Invoke 动态加载 + 虚拟 CAN 回退
│ ├── RealLoraSdkService.cs TCP 数据流接收 + UDP 发现/AT 配置
│ └── RealUartManagerService.cs SerialPort + CRC16-CCITT 帧协议
├── ViewModels/
│ ├── MainWindowViewModel.cs 主窗口,服务注入 + 子 VM 组装
│ ├── LoraDataViewModel.cs LoRa 数据 Tab
│ ├── LoraConfigViewModel.cs LoRa 配置 Tab
│ ├── FirmwareUpgradeViewModel.cs 固件升级 Tab(CAN/UART 双模式)
│ └── CanCommandViewModel.cs CAN 命令 Tab
├── Views/
│ ├── LoraDataView.xaml LoRa 数据页
│ ├── LoraConfigView.xaml LoRa 配置页
│ ├── FirmwareUpgradeView.xaml 固件升级页
│ └── CanCommandView.xaml CAN 命令页
├── Converters/
│ ├── BoolToVisibilityConverter.cs
│ ├── InverseBoolConverter.cs
│ ├── IntToVisibilityConverter.cs
│ ├── IntToBoolConverter.cs
│ └── ProgressToPercentConverter.cs
├── Helpers/
│ └── DelegateCommand.cs ICommand 实现
├── App.xaml 全局资源字典(转换器)
├── MainWindow.xaml 主窗口(TabControl + 菜单 + 状态栏)
└── icon.ico 应用图标
- 每个 Tab 页 =
UserControl(View) +ViewModel,通过数据绑定通信 - 服务层通过接口注入 ViewModel,便于测试和替换
- Stub 模式:所有硬件服务均有 Stub 实现,无硬件时可完整运行 UI
| 服务 | 接口 | 真实实现 | 无硬件回退 |
|---|---|---|---|
| CAN | ICanHalService |
PcanCanHalService (P/Invoke 动态加载 PCANBasic.dll) |
虚拟 CAN 模式(Write 记录日志并返回成功) |
| UART | IUartManagerService |
RealUartManagerService (System.IO.Ports) |
UartManagerServiceStub |
| LoRa | ILoraSdkService |
RealLoraSdkService (TCP + UDP Socket) |
LoraSdkServiceStub(模拟连接) |
- 运行时通过
LoadLibraryW/GetProcAddress动态加载PCANBasic.dll - 无编译时依赖,不安装 PCAN 驱动也能编译运行
- DLL 不存在时自动回退虚拟 CAN 模式
FirmwareUpgradeViewModel管理 CAN/UART 连接状态- 通过
PropertyChanged事件自动通知CanCommandViewModel,实现跨 Tab 连接状态同步
- .NET 10.0 SDK
- Windows 10/11
- PCAN-USB 适配器(可选,无硬件时自动使用虚拟 CAN)
- 串口设备(可选,UART 固件升级)
- LoRa 网关(可选,TCP/UDP 连接)
dotnet build
dotnet rundotnet publish -c Release -r win-x64 --self-contained -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -p:EnableCompressionInSingleFile=true输出单个 ModHandlerPcTool.exe,双击即可运行,目标机器无需安装任何运行时。
dotnet publish -c Release --self-contained false -p:DebugType=none输出 5 个文件共 ~0.3 MB。目标机器需安装 .NET 10 Desktop Runtime。
| CAN ID | 名称 | 说明 |
|---|---|---|
| 0x101 | PlatformRX | 平台接收命令 |
| 0x102 | PlatformTX | 平台发送响应 |
| 0x103 | FwDataRX | 固件数据 |
| 0x105 | LoRaRX | LoRa 发送命令 |
| 0x106 | LoRaTX | LoRa 接收响应 |
| 0x763 | Heartbeat | 心跳 |
| 0x1E3 | HandlerState | 手柄状态 |
| 0x263 | Laser | 激光 |
| 0x363 | CoordXY | 坐标 XY |
| 0x463 | CoordZ | 坐标 Z |
HEAD(0xAA) + TYPE(1B) + LEN(2B,LE) + DATA(nB) + CRC16(2B,LE) + TAIL(0x55)
CRC16-CCITT (多项式 0x1021, 初始值 0xFFFF)
HEAD(0x5A) + MAGIC(0xA55A,2B) + NID(4B) + LEN(2B) + CRC(2B) + RES(1B) + DATA
| 命令码 | 名称 | 数据格式 |
|---|---|---|
| 0x01 | SET_MODE | protocol<<4 | mode |
| 0x02 | QUERY_MODE | - |
| 0x03 | SET_CH1 | speed_index + channel(2B) |
| 0x04 | QUERY_CH1 | - |
| 0x05 | SET_CH2 | speed_index + channel(2B) |
| 0x06 | QUERY_CH2 | - |
| 0x07 | QUERY_NID | - |
| 0x09 | QUERY_GWID | - |
| 0x0A | SET_GWID | gwid(4B, offset 4-7) |
| 0x0B | QUERY_PNUM | - |
| 0x0C | SET_PNUM | pnum |
| 0x0D | SET_TEST | on/off |
| 0x0F | SET_POWER | on/off |
| 命令 | 值 | 说明 |
|---|---|---|
| START_UPDATE | 0 | 启动固件升级(value = 文件大小) |
| CONFIRM | 1 | 确认固件(value = 0 测试模式, 1 正式) |
| VERSION | 2 | 查询固件版本 |
| REBOOT | 3 | 重启板卡 |
| 响应 | 值 | 说明 |
|---|---|---|
| OFFSET | 0 | 偏移量确认 |
| UPDATE_SUCCESS | 1 | 升级完成 |
| VERSION | 2 | 版本信息 |
| CONFIRM | 3 | 确认成功 (value = 0x55AA55AA) |
| FLASH_ERROR | 4 | Flash 错误 |
| TRANSFER_ERROR | 5 | 传输错误 |
| 索引 | 波特率 | PCAN Btr0Btr1 |
|---|---|---|
| 0 | 10K | 0x672F |
| 1 | 20K | 0x532F |
| 2 | 50K | 0x472F |
| 3 | 100K | 0x432F |
| 4 | 125K | 0x031C |
| 5 | 250K | 0x011C |
| 6 | 500K | 0x001C |
| 7 | 1M | 0x0014 |
本项目的 C/Win32 原版:can-uart-tool
Private