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(); var groupMsg = cmdDataSnapshot.GroupBy(x => x.MsgName).ToList();
int msgCount = groupMsg.Count; 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 msgPt = IntPtr.Zero;
IntPtr sendBufferPtr = IntPtr.Zero;
try try
{ {
int canMsgSize = Marshal.SizeOf(typeof(USB2CAN.CAN_MSG));
msgPt = Marshal.AllocHGlobal(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; int index = 0;
lock (_canSendLock) lock (_canSendLock)
{ {
@@ -450,13 +452,15 @@ namespace CapMachine.Wpf.CanDrive
{ {
return; return;
} }
var targetPtr = IntPtr.Add(sendBufferPtr, index * canMsgSize); canMsgBuffer[index] = (USB2CAN.CAN_MSG)Marshal.PtrToStructure(msgPt, typeof(USB2CAN.CAN_MSG));
Marshal.Copy(msgPt, frameBytes, 0, canMsgSize); if (canMsgBuffer[index].Data == null || canMsgBuffer[index].Data.Length != 8)
Marshal.Copy(frameBytes, 0, targetPtr, canMsgSize); {
canMsgBuffer[index].Data = new byte[8];
}
index++; index++;
} }
} }
USB2CAN.CAN_SendMsgByPtr(DevHandle, WriteCANIndex, sendBufferPtr, (uint)msgCount); USB2CAN.CAN_SendMsg(DevHandle, WriteCANIndex, canMsgBuffer, (uint)msgCount);
} }
} }
finally finally
@@ -465,10 +469,6 @@ namespace CapMachine.Wpf.CanDrive
{ {
Marshal.FreeHGlobal(msgPt); 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); public static extern Int32 CAN_StopGetMsg(Int32 DevHandle, Byte CANIndex);
[DllImport("USB2XXX.dll")] [DllImport("USB2XXX.dll")]
public static extern Int32 CAN_SendMsg(Int32 DevHandle, Byte CANIndex, CAN_MSG[] pCanSendMsg, UInt32 SendMsgNum); 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")] [DllImport("USB2XXX.dll")]
public static extern Int32 CAN_GetMsg(Int32 DevHandle, Byte CANIndex, IntPtr pCanGetMsg); public static extern Int32 CAN_GetMsg(Int32 DevHandle, Byte CANIndex, IntPtr pCanGetMsg);
[DllImport("USB2XXX.dll")] [DllImport("USB2XXX.dll")]