自定义报文发送
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>
|
/// <summary>
|
||||||
/// 构建发送用信号字典:DBC 初始值 + 额外覆盖。
|
/// 构建发送用信号字典:DBC 初始值 + 额外覆盖。
|
||||||
/// 调用方需自行保证通道已初始化且 DBC 已加载。
|
/// 调用方需自行保证通道已初始化且 DBC 已加载。
|
||||||
|
|||||||
Reference in New Issue
Block a user