From 0fb230079baf26e016db0ff33a5e29d7a646a469 Mon Sep 17 00:00:00 2001 From: Tyrone CT Date: Thu, 14 May 2026 15:23:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E5=8A=A86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CapMachine.Wpf/CanDrive/ToomossCan.cs | 146 +++++++-------------- CapMachine.Wpf/Services/CanDriveService.cs | 29 +++- 2 files changed, 73 insertions(+), 102 deletions(-) diff --git a/CapMachine.Wpf/CanDrive/ToomossCan.cs b/CapMachine.Wpf/CanDrive/ToomossCan.cs index 2b7bbe7..5345df7 100644 --- a/CapMachine.Wpf/CanDrive/ToomossCan.cs +++ b/CapMachine.Wpf/CanDrive/ToomossCan.cs @@ -26,6 +26,7 @@ namespace CapMachine.Wpf.CanDrive { private readonly IContainerProvider ContainerProvider; private readonly object _dbcParserLock = new object(); + private readonly object _canSendLock = new object(); private const int DbcStringBufferCapacity = 256; /// @@ -397,8 +398,28 @@ namespace CapMachine.Wpf.CanDrive /// public void SendCanMsg(List CmdData) { - var GroupMsg = CmdData.GroupBy(x => x.MsgName); - int msgCount = GroupMsg.Count(); + SendCanMessagesByDbc(CmdData); + } + + private void SendCanMessagesByDbc(IEnumerable sourceCmdData) + { + var cmdDataSnapshot = sourceCmdData + .Where(x => !string.IsNullOrWhiteSpace(x.MsgName) && !string.IsNullOrWhiteSpace(x.SignalName)) + .Select(x => new CanCmdData + { + ConfigName = x.ConfigName, + MsgName = x.MsgName, + SignalName = x.SignalName, + SignalCmdValue = x.SignalCmdValue + }) + .ToList(); + if (cmdDataSnapshot.Count == 0) + { + return; + } + + var groupMsg = cmdDataSnapshot.GroupBy(x => x.MsgName).ToList(); + int msgCount = groupMsg.Count; IntPtr msgPt = IntPtr.Zero; IntPtr sendBufferPtr = IntPtr.Zero; @@ -408,24 +429,35 @@ namespace CapMachine.Wpf.CanDrive msgPt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(USB2CAN.CAN_MSG))); sendBufferPtr = Marshal.AllocHGlobal(canMsgSize * msgCount); byte[] frameBytes = new byte[canMsgSize]; - int Index = 0; - lock (_dbcParserLock) + int index = 0; + lock (_canSendLock) { - //循环给MSG赋值数据 - foreach (var itemMsg in GroupMsg) + lock (_dbcParserLock) { - foreach (var itemSignal in itemMsg) + //循环给MSG赋值数据 + foreach (var itemMsg in groupMsg) { - CAN_DBCParser.DBC_SetSignalValue(DBCHandle, new StringBuilder(itemMsg.Key), new StringBuilder(itemSignal.SignalName), itemSignal.SignalCmdValue); + foreach (var itemSignal in itemMsg) + { + int setResult = CAN_DBCParser.DBC_SetSignalValue(DBCHandle, new StringBuilder(itemMsg.Key), new StringBuilder(itemSignal.SignalName), itemSignal.SignalCmdValue); + if (setResult != CAN_DBCParser.DBC_PARSER_OK) + { + return; + } + } + int syncResult = CAN_DBCParser.DBC_SyncValueToCANMsg(DBCHandle, new StringBuilder(itemMsg.Key), msgPt); + if (syncResult != CAN_DBCParser.DBC_PARSER_OK) + { + return; + } + var targetPtr = IntPtr.Add(sendBufferPtr, index * canMsgSize); + Marshal.Copy(msgPt, frameBytes, 0, canMsgSize); + Marshal.Copy(frameBytes, 0, targetPtr, canMsgSize); + index++; } - CAN_DBCParser.DBC_SyncValueToCANMsg(DBCHandle, new StringBuilder(itemMsg.Key), msgPt); - var targetPtr = IntPtr.Add(sendBufferPtr, Index * canMsgSize); - Marshal.Copy(msgPt, frameBytes, 0, canMsgSize); - Marshal.Copy(frameBytes, 0, targetPtr, canMsgSize); - Index++; } + USB2CAN.CAN_SendMsgByPtr(DevHandle, WriteCANIndex, sendBufferPtr, (uint)msgCount); } - USB2CAN.CAN_SendMsgByPtr(DevHandle, WriteCANIndex, sendBufferPtr, (uint)msgCount); } finally { @@ -507,47 +539,7 @@ namespace CapMachine.Wpf.CanDrive await Task.Delay(SendCycle); try { - var GroupMsg = CmdData.GroupBy(x => x.MsgName); - int msgCount = GroupMsg.Count(); - - IntPtr msgPtSend = IntPtr.Zero; - IntPtr sendBufferPtr = IntPtr.Zero; - try - { - int canMsgSize = Marshal.SizeOf(typeof(USB2CAN.CAN_MSG)); - msgPtSend = Marshal.AllocHGlobal(canMsgSize); - sendBufferPtr = Marshal.AllocHGlobal(canMsgSize * msgCount); - byte[] frameBytes = new byte[canMsgSize]; - int Index = 0; - lock (_dbcParserLock) - { - //循环给MSG赋值数据 - foreach (var itemMsg in GroupMsg) - { - foreach (var itemSignal in itemMsg) - { - CAN_DBCParser.DBC_SetSignalValue(DBCHandle, new StringBuilder(itemMsg.Key), new StringBuilder(itemSignal.SignalName), itemSignal.SignalCmdValue); - } - CAN_DBCParser.DBC_SyncValueToCANMsg(DBCHandle, new StringBuilder(itemMsg.Key), msgPtSend); - var targetPtr = IntPtr.Add(sendBufferPtr, Index * canMsgSize); - Marshal.Copy(msgPtSend, frameBytes, 0, canMsgSize); - Marshal.Copy(frameBytes, 0, targetPtr, canMsgSize); - Index++; - } - } - USB2CAN.CAN_SendMsgByPtr(DevHandle, WriteCANIndex, sendBufferPtr, (uint)msgCount); - } - finally - { - if (msgPtSend != IntPtr.Zero) - { - Marshal.FreeHGlobal(msgPtSend); - } - if (sendBufferPtr != IntPtr.Zero) - { - Marshal.FreeHGlobal(sendBufferPtr); - } - } + SendCanMessagesByDbc(CmdData); } catch (Exception ex) { @@ -767,49 +759,7 @@ namespace CapMachine.Wpf.CanDrive // 执行发送CAN逻辑 { - - var GroupMsg = CmdData.GroupBy(x => x.MsgName); - int msgCount = GroupMsg.Count(); - - IntPtr msgPtSend = IntPtr.Zero; - IntPtr sendBufferPtr = IntPtr.Zero; - try - { - int canMsgSize = Marshal.SizeOf(typeof(USB2CAN.CAN_MSG)); - msgPtSend = Marshal.AllocHGlobal(canMsgSize); - sendBufferPtr = Marshal.AllocHGlobal(canMsgSize * msgCount); - byte[] frameBytes = new byte[canMsgSize]; - int Index = 0; - lock (_dbcParserLock) - { - //循环给MSG赋值数据 - foreach (var itemMsg in GroupMsg) - { - foreach (var itemSignal in itemMsg) - { - CAN_DBCParser.DBC_SetSignalValue(DBCHandle, new StringBuilder(itemMsg.Key), new StringBuilder(itemSignal.SignalName), itemSignal.SignalCmdValue); - } - CAN_DBCParser.DBC_SyncValueToCANMsg(DBCHandle, new StringBuilder(itemMsg.Key), msgPtSend); - var targetPtr = IntPtr.Add(sendBufferPtr, Index * canMsgSize); - Marshal.Copy(msgPtSend, frameBytes, 0, canMsgSize); - Marshal.Copy(frameBytes, 0, targetPtr, canMsgSize); - Index++; - } - } - USB2CAN.CAN_SendMsgByPtr(DevHandle, WriteCANIndex, sendBufferPtr, (uint)msgCount); - } - finally - { - if (msgPtSend != IntPtr.Zero) - { - Marshal.FreeHGlobal(msgPtSend); - } - if (sendBufferPtr != IntPtr.Zero) - { - Marshal.FreeHGlobal(sendBufferPtr); - } - } - + SendCanMessagesByDbc(CmdData); } } diff --git a/CapMachine.Wpf/Services/CanDriveService.cs b/CapMachine.Wpf/Services/CanDriveService.cs index b31524e..bc0a154 100644 --- a/CapMachine.Wpf/Services/CanDriveService.cs +++ b/CapMachine.Wpf/Services/CanDriveService.cs @@ -102,6 +102,7 @@ namespace CapMachine.Wpf.Services /// 在程序配置好后就确定要发送哪些数据 /// public List CmdData { get; set; } = new List(); + private readonly object _cmdDataLock = new object(); /// /// 增加发送的指令数据 @@ -128,7 +129,10 @@ namespace CapMachine.Wpf.Services break; } //添加到发送数据集合 - CmdData.Add(SendCanCmdData); + lock (_cmdDataLock) + { + CmdData.Add(SendCanCmdData); + } } @@ -141,7 +145,10 @@ namespace CapMachine.Wpf.Services { if (SpeedCanCmdData != null) { - SpeedCanCmdData.SignalCmdValue = SpeedData; + lock (_cmdDataLock) + { + SpeedCanCmdData.SignalCmdValue = SpeedData; + } } //if (EnableCanCmdData != null) //{ @@ -157,7 +164,10 @@ namespace CapMachine.Wpf.Services { if (EnableCanCmdData != null) { - EnableCanCmdData.SignalCmdValue = IsEnable ? 1 : 0; + lock (_cmdDataLock) + { + EnableCanCmdData.SignalCmdValue = IsEnable ? 1 : 0; + } } } @@ -174,7 +184,18 @@ namespace CapMachine.Wpf.Services //更新速度信息 UpdateSpeedCmdData(SpeedData); - ToomossCanDrive.SendCanMsg(CmdData); + List cmdDataSnapshot; + lock (_cmdDataLock) + { + cmdDataSnapshot = CmdData.Select(x => new CanCmdData + { + ConfigName = x.ConfigName, + MsgName = x.MsgName, + SignalName = x.SignalName, + SignalCmdValue = x.SignalCmdValue + }).ToList(); + } + ToomossCanDrive.SendCanMsg(cmdDataSnapshot); } else {