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 已加载。