This commit is contained in:
2026-05-14 16:32:20 +08:00
parent 0fb230079b
commit b67ba5bb27
2 changed files with 12 additions and 14 deletions

View File

@@ -420,15 +420,17 @@ namespace CapMachine.Wpf.CanDrive
var groupMsg = cmdDataSnapshot.GroupBy(x => x.MsgName).ToList();
int msgCount = groupMsg.Count;
USB2CAN.CAN_MSG[] canMsgBuffer = new USB2CAN.CAN_MSG[msgCount];
for (int i = 0; i < canMsgBuffer.Length; i++)
{
canMsgBuffer[i] = new USB2CAN.CAN_MSG();
canMsgBuffer[i].Data = new byte[8];
}
IntPtr msgPt = IntPtr.Zero;
IntPtr sendBufferPtr = IntPtr.Zero;
try
{
int canMsgSize = Marshal.SizeOf(typeof(USB2CAN.CAN_MSG));
msgPt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(USB2CAN.CAN_MSG)));
sendBufferPtr = Marshal.AllocHGlobal(canMsgSize * msgCount);
byte[] frameBytes = new byte[canMsgSize];
int index = 0;
lock (_canSendLock)
{
@@ -450,13 +452,15 @@ namespace CapMachine.Wpf.CanDrive
{
return;
}
var targetPtr = IntPtr.Add(sendBufferPtr, index * canMsgSize);
Marshal.Copy(msgPt, frameBytes, 0, canMsgSize);
Marshal.Copy(frameBytes, 0, targetPtr, canMsgSize);
canMsgBuffer[index] = (USB2CAN.CAN_MSG)Marshal.PtrToStructure(msgPt, typeof(USB2CAN.CAN_MSG));
if (canMsgBuffer[index].Data == null || canMsgBuffer[index].Data.Length != 8)
{
canMsgBuffer[index].Data = new byte[8];
}
index++;
}
}
USB2CAN.CAN_SendMsgByPtr(DevHandle, WriteCANIndex, sendBufferPtr, (uint)msgCount);
USB2CAN.CAN_SendMsg(DevHandle, WriteCANIndex, canMsgBuffer, (uint)msgCount);
}
}
finally
@@ -465,10 +469,6 @@ namespace CapMachine.Wpf.CanDrive
{
Marshal.FreeHGlobal(msgPt);
}
if (sendBufferPtr != IntPtr.Zero)
{
Marshal.FreeHGlobal(sendBufferPtr);
}
}
}

View File

@@ -108,8 +108,6 @@ namespace CapMachine.Wpf.CanDrive
public static extern Int32 CAN_StopGetMsg(Int32 DevHandle, Byte CANIndex);
[DllImport("USB2XXX.dll")]
public static extern Int32 CAN_SendMsg(Int32 DevHandle, Byte CANIndex, CAN_MSG[] pCanSendMsg, UInt32 SendMsgNum);
[DllImport("USB2XXX.dll", EntryPoint = "CAN_SendMsg")]
public static extern Int32 CAN_SendMsgByPtr(Int32 DevHandle, Byte CANIndex, IntPtr pCanSendMsg, UInt32 SendMsgNum);
[DllImport("USB2XXX.dll")]
public static extern Int32 CAN_GetMsg(Int32 DevHandle, Byte CANIndex, IntPtr pCanGetMsg);
[DllImport("USB2XXX.dll")]