# SpanbusVirtualGateway **Repository Path**: hucyc/SpanbusVirtualGateway ## Basic Information - **Project Name**: SpanbusVirtualGateway - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-18 - **Last Updated**: 2026-06-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spanbus Virtual CAN Gateway — Windows 虚拟 CAN 总线驱动 [![Platform](https://img.shields.io/badge/Platform-Windows-blue)]() [![Language](https://img.shields.io/badge/Language-C-00599C)]() **Spanbus Virtual CAN Gateway** 是一个 Windows 用户态虚拟 CAN 总线驱动(DLL),提供跨进程 CAN 通信能力。支持同一台机器的**共享内存**通信,以及跨设备的 **TCP/UDP** 网络通信。API 兼容 Kvaser Linux virtualcan 风格。 --- ## 功能特性 - **三种传输模式** - **共享内存(SHMEM)** — 基于 `CreateFileMappingW` + 无锁 CAS 环形队列,同一主机跨进程通信,延迟最低 - **TCP(VCTP 协议)** — 自定义二进制协议,支持时钟同步、自动重连,跨设备通信 - **UDP** — 后台接收线程 + 进程本地环形队列,避免跨进程重复 - **两种分发模式**(共享内存下) - **竞争模式(Competitive)** — 所有进程共享一个尾指针,每条消息只被消费一次 - **广播模式(Broadcast)** — 每个进程独立尾指针,消息写入一次,各进程独立读取 - **多种驱动模式** - `NORMAL` — 正常模式,发送者不接收自己的消息 - `SILENT` — 静默模式,仅监听,不能发送 - `INT_LOOPBACK` — 内部回环,仅发送进程自身接收 - `EXT_LOOPBACK` — 外部回环,同通道所有进程接收 - `OFF` — 关闭所有操作 - **CAN FD 支持** — 数据场最长 64 字节 - **错误建模** — 支持 TX/RX 错误计数、警告/被动/总线关闭阈值、错误帧注入 - **通道绑定** — 消息可在同卡不同通道间转发 - **回调系统** — 双存储机制(共享内存注册 + 进程本地表),`__try/__except` 保护 --- ## 快速开始 ### 环境要求 | 工具 | 要求 | |------|------| | Visual Studio | 2022+,x64 工具集(v143) | | Windows SDK | 10.0+ | | 依赖库 | `ws2_32.lib`(网络)、`comctl32.lib`(配置界面) | ### 构建 ```bash # Release 构建(x64) msbuild VcanUserMode.sln /p:Configuration=Release /p:Platform=x64 /nologo /v:minimal # Debug 构建 msbuild VcanUserMode.sln /p:Configuration=Debug /p:Platform=x64 /nologo /v:minimal ``` ### 运行共享内存测试 ```powershell .\run_shmem_tests.ps1 # 默认 30 秒 .\run_shmem_tests.ps1 -DurationSec 60 # 自定义时长 ``` ### 运行 UDP 测试 ```bash # 终端 1 — 接收端 udp_receiver\x64\Release\UdpReceiver.exe :: 6000 # 终端 2 — 发送端 set VCAN_TEST_FRAMES=200 set VCAN_TEST_DELAY_MS=1 udp_sender\x64\Release\UdpSender.exe ::1 6000 ``` --- ## 项目结构 ``` ├── vcan_public.h # 公开 API — 数据结构与 DLL 导出 ├── vcan_internal.h # 内部结构体、共享内存布局 ├── vcan_bus.c # 共享内存管理、RX 环形队列、帧发送 ├── vcan_channel.c # 通道 API(VcanReadMsg 等) ├── vcan_channel_transport.c/h # 传输后端注册(插件模式) ├── vcan_dll.c # DLL 入口、设备打开/关闭 │ ├── vcan_transport/ # 抽象传输层 │ ├── vcan_transport.h # 传输抽象(VCAN_BACKEND_OPS 虚函数表) │ ├── vcan_transport_router.c # 路由器 — 分发到注册的后端 │ ├── vcan_transport_context.c/h # 传输上下文管理 │ ├── vcan_transport_shmem.c # 共享内存后端 │ ├── vcan_transport_tcp.c/h # TCP 后端(VCTP 协议、时钟同步) │ └── vcan_transport_udp.c/h # UDP 后端(后台 RX 线程、本地队列) │ ├── vcan_config_ui/main.c # Win32 GUI 配置工具 ├── vcan_web_server/ # HTTP Web 配置服务器(端口 8080) │ ├── tcp_client/ tcp_server/ # TCP 测试程序 ├── udp_sender/ udp_receiver/ # UDP 测试程序 ├── test_shmem_sender/ # 共享内存发送端测试 ├── test_shmem_receiver/ # 共享内存接收端测试 │ └── VcanUserMode.sln # Visual Studio 解决方案(11 个项目) ``` --- ## 构建产物 | 产物 | 说明 | |------|------| | `vcan.dll` | 核心 CAN 总线驱动 DLL | | `vcan_config.exe` | Win32 GUI 配置工具 | | `VcanWebServer.exe` | HTTP Web 配置服务器(端口 8080) | | `TestShmemSender.exe` | 共享内存发送测试 | | `TestShmemReceiver.exe` | 共享内存接收测试 | | `TcpClient.exe` | TCP 客户端测试 | | `TcpServer.exe` | TCP 服务端测试 | | `UdpSender.exe` | UDP 发送测试 | | `UdpReceiver.exe` | UDP 接收测试 | --- ## 关键常量 | 常量 | 值 | 说明 | |------|-----|------| | `VCAN_MAX_CARDS` | 8 | 最大虚拟 CAN 卡数量 | | `VCAN_CHANNELS_PER_CARD` | 2 | 每卡通道数 | | `VCAN_MAX_CHANNELS` | 16 | 总通道数(8×2) | | `VCAN_RX_QUEUE_SIZE` | 8192 | RX 环形队列槽位数 | | `CAN_MAX_DATA_LEN` | 64 | CAN FD 最大数据长度 | | `VCAN_MAX_CALLBACK_REGS` | 64 | 每通道最大回调注册数 | --- ## 技术细节 - **无锁 RX 环形队列**:使用 `InterlockedCompareExchange` CAS,2 的幂次大小(位掩码取模),始终保留 1 个空槽位区分满/空 - **发送者过滤**:`VcanShouldSkipMessage` 根据 `senderPid` 和驱动模式决定是否接收 - **崩溃恢复**:`OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION)` 检测死进程,自动清理 `processTails[]` - **时间同步**:QPC + `GetTickCount64` 插值,微秒级跨进程时间戳 - **安全回调**:`DispatchMessageToCallbacks` 使用 `__try/__except` 保护 --- ## 许可证 Copyright © hucyc. All rights reserved.