From 9171e0b0c1aba4bcac472397fee730f21bdbfda3 Mon Sep 17 00:00:00 2001 From: hsc Date: Mon, 13 Jul 2026 13:23:27 +0800 Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E6=8A=A5=E6=96=87?= =?UTF-8?q?=E5=8F=91=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ZLGUSBCANFD/USBCANFD.cs | 75 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/ZLGUSBCANFD/USBCANFD.cs b/ZLGUSBCANFD/USBCANFD.cs index 0e6beeb..1265b9a 100644 --- a/ZLGUSBCANFD/USBCANFD.cs +++ b/ZLGUSBCANFD/USBCANFD.cs @@ -660,6 +660,81 @@ namespace ZLGUSBCANFD } } + /// + /// 直接发送 8 字节原始报文(经典 CAN 或 CANFD 均可)。 + /// 无需加载 DBC,适合手动构造简单报文。 + /// + /// 通道号(0 ~ MaxChannels-1) + /// 帧 ID(标准 11 位,扩展帧自动置位 0x80000000) + /// 原始数据;超过 8 字节会自动截断,不足 8 字节自动补零 + /// 是否为 29 位扩展帧 + /// true = CANFD 格式;false = 经典 CAN 格式 + /// CANFD 是否开启波特率加速(经典 CAN 忽略此参数) + /// 是否发送成功 + public virtual bool 发送原始报文( + uint 通道号, + uint 帧ID, + byte[] data, + bool 是否是扩展帧 = false, + bool 是否是CANFD = true, + bool 开启波特率加速BRS = true) + { + if (通道号 >= _maxChannels || _channelHandles[通道号] == IntPtr.Zero) return false; + + byte[] buffer = new byte[8]; + if (data != null) + { + Array.Copy(data, 0, buffer, 0, Math.Min(data.Length, 8)); + } + + uint canId = 帧ID & 0x7FFFFFFF; + if (是否是扩展帧) canId |= 0x80000000; + + lock (_channelLocks[通道号]) + { + if (是否是CANFD) + { + ZLGCAN.canfd_frame fdFrame = new ZLGCAN.canfd_frame + { + can_id = canId, + len = 8, + flags = (byte)((是否是扩展帧 ? 0x01 : 0x00) | (开启波特率加速BRS ? 0x02 : 0x00) | 0x20), + data = new byte[64] + }; + Array.Copy(buffer, 0, fdFrame.data, 0, 8); + + ZLGCAN.ZCAN_TransmitFD_Data txFdData = new ZLGCAN.ZCAN_TransmitFD_Data { frame = fdFrame, transmit_type = 2 }; + IntPtr pTxFd = Marshal.AllocHGlobal(Marshal.SizeOf(txFdData)); + try + { + Marshal.StructureToPtr(txFdData, pTxFd, true); + return ZLGCAN.ZCAN_TransmitFD(_channelHandles[通道号], pTxFd, 1) == 1; + } + finally { Marshal.FreeHGlobal(pTxFd); } + } + else + { + ZLGCAN.can_frame standardFrame = new ZLGCAN.can_frame + { + can_id = canId, + can_dlc = 8, + __pad = 0x20, + data = new byte[8] + }; + Array.Copy(buffer, 0, standardFrame.data, 0, 8); + + ZLGCAN.ZCAN_Transmit_Data txData = new ZLGCAN.ZCAN_Transmit_Data { frame = standardFrame, transmit_type = 2 }; + IntPtr pTx = Marshal.AllocHGlobal(Marshal.SizeOf(txData)); + try + { + Marshal.StructureToPtr(txData, pTx, true); + return ZLGCAN.ZCAN_Transmit(_channelHandles[通道号], pTx, 1) == 1; + } + finally { Marshal.FreeHGlobal(pTx); } + } + } + } + /// /// 构建发送用信号字典:DBC 初始值 + 额外覆盖。 /// 调用方需自行保证通道已初始化且 DBC 已加载。