自定义报文发送
This commit is contained in:
@@ -660,6 +660,81 @@ namespace ZLGUSBCANFD
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 直接发送 8 字节原始报文(经典 CAN 或 CANFD 均可)。
|
||||
/// 无需加载 DBC,适合手动构造简单报文。
|
||||
/// </summary>
|
||||
/// <param name="通道号">通道号(0 ~ MaxChannels-1)</param>
|
||||
/// <param name="帧ID">帧 ID(标准 11 位,扩展帧自动置位 0x80000000)</param>
|
||||
/// <param name="data">原始数据;超过 8 字节会自动截断,不足 8 字节自动补零</param>
|
||||
/// <param name="是否是扩展帧">是否为 29 位扩展帧</param>
|
||||
/// <param name="是否是CANFD">true = CANFD 格式;false = 经典 CAN 格式</param>
|
||||
/// <param name="开启波特率加速BRS">CANFD 是否开启波特率加速(经典 CAN 忽略此参数)</param>
|
||||
/// <returns>是否发送成功</returns>
|
||||
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); }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 构建发送用信号字典:DBC 初始值 + 额外覆盖。
|
||||
/// 调用方需自行保证通道已初始化且 DBC 已加载。
|
||||
|
||||
Reference in New Issue
Block a user