diff --git a/ZLGUSBCANFD/USBCANFD.cs b/ZLGUSBCANFD/USBCANFD.cs index 55f5034..fdc9fca 100644 --- a/ZLGUSBCANFD/USBCANFD.cs +++ b/ZLGUSBCANFD/USBCANFD.cs @@ -21,7 +21,7 @@ namespace ZLGUSBCANFD // 每个通道分配独立的 DBC 引擎句柄与锁,彻底解决台架间DBC冲突与锁竞争 private readonly uint[] _dbcHandles; private readonly bool[] _isDbcLoadedArray; - private readonly object[] _channelLocks; // 通道级细粒度锁 + private readonly object[] _channelLocks; // 通道级细粒度锁 // 异步高性能接收线程控制 private volatile bool _isRunning = false; @@ -358,6 +358,18 @@ namespace ZLGUSBCANFD /// 0 = 只发送一次;>0 = 按指定间隔循环发送(毫秒) /// 1 = CANFD,0 = CAN /// 是否成功启动/发送 + public virtual bool 发送DBC定义报文( + uint 通道号, + uint 帧ID, + Dictionary 信号物理值字典, + int 循环间隔毫秒 = 0, + int 是否使用CANFD = 1) + { + if (通道号 >= _maxChannels || _channelHandles[通道号] == IntPtr.Zero) return false; + if (!_isDbcLoadedArray[通道号]) throw new InvalidOperationException($"通道 {通道号} 的 DBC 协议未加载,无法执行打包发送指令。"); + if (循环间隔毫秒 < 0) throw new ArgumentOutOfRangeException(nameof(循环间隔毫秒), "循环间隔必须大于或等于 0。"); + if (信号物理值字典 == null || 信号物理值字典.Count == 0) + throw new ArgumentException("信号物理值字典不能为空。", nameof(信号物理值字典)); if (循环间隔毫秒 == 0) { @@ -607,7 +619,7 @@ namespace ZLGUSBCANFD /// 要写入的实际物理数值 /// 0 = 单次发送;>0 = 周期循环发送(单位毫秒) /// 操作是否成功 - public virtual bool 设置报文(uint 通道号, string 帧IDStr, string 信号名称, double 物理值, int 循环发送间隔毫秒 = 0, bool 直接发送=false) + public virtual bool 设置报文(uint 通道号, string 帧IDStr, string 信号名称, double 物理值, int 循环发送间隔毫秒 = 0, bool 直接发送 = false) { if (!TryParseFrameId(帧IDStr, out uint 帧ID)) { @@ -865,7 +877,7 @@ namespace ZLGUSBCANFD } finally { - + Marshal.FreeHGlobal(ptrDbcMsg); } }