This commit is contained in:
2026-05-14 15:23:03 +08:00
parent 196df6b181
commit 0fb230079b
2 changed files with 73 additions and 102 deletions

View File

@@ -26,6 +26,7 @@ namespace CapMachine.Wpf.CanDrive
{ {
private readonly IContainerProvider ContainerProvider; private readonly IContainerProvider ContainerProvider;
private readonly object _dbcParserLock = new object(); private readonly object _dbcParserLock = new object();
private readonly object _canSendLock = new object();
private const int DbcStringBufferCapacity = 256; private const int DbcStringBufferCapacity = 256;
/// <summary> /// <summary>
@@ -397,8 +398,28 @@ namespace CapMachine.Wpf.CanDrive
/// </summary> /// </summary>
public void SendCanMsg(List<CanCmdData> CmdData) public void SendCanMsg(List<CanCmdData> CmdData)
{ {
var GroupMsg = CmdData.GroupBy(x => x.MsgName); SendCanMessagesByDbc(CmdData);
int msgCount = GroupMsg.Count(); }
private void SendCanMessagesByDbc(IEnumerable<CanCmdData> 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 msgPt = IntPtr.Zero;
IntPtr sendBufferPtr = IntPtr.Zero; IntPtr sendBufferPtr = IntPtr.Zero;
@@ -408,24 +429,35 @@ namespace CapMachine.Wpf.CanDrive
msgPt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(USB2CAN.CAN_MSG))); msgPt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(USB2CAN.CAN_MSG)));
sendBufferPtr = Marshal.AllocHGlobal(canMsgSize * msgCount); sendBufferPtr = Marshal.AllocHGlobal(canMsgSize * msgCount);
byte[] frameBytes = new byte[canMsgSize]; byte[] frameBytes = new byte[canMsgSize];
int Index = 0; int index = 0;
lock (_dbcParserLock) lock (_canSendLock)
{ {
//循环给MSG赋值数据 lock (_dbcParserLock)
foreach (var itemMsg in GroupMsg)
{ {
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 finally
{ {
@@ -507,47 +539,7 @@ namespace CapMachine.Wpf.CanDrive
await Task.Delay(SendCycle); await Task.Delay(SendCycle);
try try
{ {
var GroupMsg = CmdData.GroupBy(x => x.MsgName); SendCanMessagesByDbc(CmdData);
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);
}
}
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -767,49 +759,7 @@ namespace CapMachine.Wpf.CanDrive
// 执行发送CAN逻辑 // 执行发送CAN逻辑
{ {
SendCanMessagesByDbc(CmdData);
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);
}
}
} }
} }

View File

@@ -102,6 +102,7 @@ namespace CapMachine.Wpf.Services
/// 在程序配置好后就确定要发送哪些数据 /// 在程序配置好后就确定要发送哪些数据
/// </summary> /// </summary>
public List<CanCmdData> CmdData { get; set; } = new List<CanCmdData>(); public List<CanCmdData> CmdData { get; set; } = new List<CanCmdData>();
private readonly object _cmdDataLock = new object();
/// <summary> /// <summary>
/// 增加发送的指令数据 /// 增加发送的指令数据
@@ -128,7 +129,10 @@ namespace CapMachine.Wpf.Services
break; break;
} }
//添加到发送数据集合 //添加到发送数据集合
CmdData.Add(SendCanCmdData); lock (_cmdDataLock)
{
CmdData.Add(SendCanCmdData);
}
} }
@@ -141,7 +145,10 @@ namespace CapMachine.Wpf.Services
{ {
if (SpeedCanCmdData != null) if (SpeedCanCmdData != null)
{ {
SpeedCanCmdData.SignalCmdValue = SpeedData; lock (_cmdDataLock)
{
SpeedCanCmdData.SignalCmdValue = SpeedData;
}
} }
//if (EnableCanCmdData != null) //if (EnableCanCmdData != null)
//{ //{
@@ -157,7 +164,10 @@ namespace CapMachine.Wpf.Services
{ {
if (EnableCanCmdData != null) 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); UpdateSpeedCmdData(SpeedData);
ToomossCanDrive.SendCanMsg(CmdData); List<CanCmdData> 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 else
{ {