Cladude code 更改

This commit is contained in:
2026-05-14 18:26:22 +08:00
parent 268f4baf99
commit df3da9d9cb
4 changed files with 107 additions and 48 deletions

View File

@@ -962,10 +962,30 @@ namespace CapMachine.Wpf.CanDrive
// 执行发送CAN逻辑
{
//再次校验前置条件,运行中若设备/DBC被关闭则直接跳过本轮避免传 0 句柄给原生导致 AV
if (!OpenState || DBCHandle == 0 || CmdData == null || CmdData.Count == 0)
{
await Task.Delay(10, token);
continue;
}
var GroupMsg = CmdData.GroupBy(x => x.MsgName);
USB2CAN.CAN_MSG[] CanMsg = new USB2CAN.CAN_MSG[GroupMsg.Count()];
for (int i = 0; i < GroupMsg.Count(); i++)
//本轮要发送的指令快照(避免遍历时 UI 线程并发修改)
List<CanCmdData> roundSnapshot;
lock (_canSendLock)
{
roundSnapshot = CmdData
.Where(x => !string.IsNullOrWhiteSpace(x.MsgName) && !string.IsNullOrWhiteSpace(x.SignalName))
.ToList();
}
if (roundSnapshot.Count == 0)
{
await Task.Delay(10, token);
continue;
}
var GroupMsg = roundSnapshot.GroupBy(x => x.MsgName).ToList();
USB2CAN.CAN_MSG[] CanMsg = new USB2CAN.CAN_MSG[GroupMsg.Count];
for (int i = 0; i < GroupMsg.Count; i++)
{
CanMsg[i] = new USB2CAN.CAN_MSG();
CanMsg[i].Data = new Byte[64];
@@ -973,38 +993,33 @@ namespace CapMachine.Wpf.CanDrive
// 发送构帧临时缓冲:每轮申请/释放,避免与其他线程共享同一指针导致并发问题
IntPtr msgPtSend = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(USB2CAN.CAN_MSG)));
int Index = 0;
//循环给MSG赋值数据
foreach (var itemMsg in GroupMsg)
try
{
foreach (var itemSignal in itemMsg)
int Index = 0;
//循环给MSG赋值数据DBC 解析器在 .Net 侧不是线程安全的,必须串行化
lock (_dbcParserLock)
{
CAN_DBCParser.DBC_SetSignalValue(DBCHandle, new StringBuilder(itemMsg.Key), new StringBuilder(itemSignal.SignalName), itemSignal.SignalCmdValue);
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);
CanMsg[Index] = (USB2CAN.CAN_MSG)Marshal.PtrToStructure(msgPtSend, typeof(USB2CAN.CAN_MSG));
Index++;
}
}
CAN_DBCParser.DBC_SyncValueToCANMsg(DBCHandle, new StringBuilder(itemMsg.Key), msgPtSend);
CanMsg[Index] = (USB2CAN.CAN_MSG)Marshal.PtrToStructure(msgPtSend, typeof(USB2CAN.CAN_MSG));
Index++;
}
//通过DBC写入数据后生成CanMsg
//将信号值填入CAN消息里面
// 释放非托管缓冲区(务必释放,否则长时间运行会造成内存泄漏)
Marshal.FreeHGlobal(msgPtSend);
finally
{
// 释放非托管缓冲区(务必释放,否则长时间运行会造成内存泄漏)
Marshal.FreeHGlobal(msgPtSend);
}
//发送CAN数据
int SendedNum = USB2CAN.CAN_SendMsg(DevHandle, WriteCANIndex, CanMsg, (uint)CanMsg.Length);
if (SendedNum >= 0)
{
//Console.WriteLine("Success send frames:{0}", SendedNum);
IsSendOk = true;
}
else
{
//Console.WriteLine("Send CAN data failed! {0}", SendedNum);
IsSendOk = false;
}
IsSendOk = SendedNum >= 0;
}