diff --git a/CapMachine.Wpf/CanDrive/CanFD/ToomossCanFD.cs b/CapMachine.Wpf/CanDrive/CanFD/ToomossCanFD.cs
index fce2a20..184bd44 100644
--- a/CapMachine.Wpf/CanDrive/CanFD/ToomossCanFD.cs
+++ b/CapMachine.Wpf/CanDrive/CanFD/ToomossCanFD.cs
@@ -83,6 +83,16 @@ namespace CapMachine.Wpf.CanDrive
///
USB2CANFD.CANFD_INIT_CONFIG CANConfig = new USB2CANFD.CANFD_INIT_CONFIG();
+ ///
+ /// 诊断信息
+ ///
+ public USB2CANFD.CANFD_DIAGNOSTIC CurCANFD_DIAGNOSTIC = new USB2CANFD.CANFD_DIAGNOSTIC();
+
+ ///
+ /// CANFD总线错误信息
+ ///
+ public USB2CANFD.CANFD_BUS_ERROR CurCANFD_BUS_ERROR = new USB2CANFD.CANFD_BUS_ERROR();
+
///
/// DBC Handle
///
@@ -97,6 +107,7 @@ namespace CapMachine.Wpf.CanDrive
/// 扫描设备Handle
///
public Int32 DevHandle { get; set; } = 0;
+
///
/// Write CAN Index
///
@@ -228,6 +239,7 @@ namespace CapMachine.Wpf.CanDrive
Console.WriteLine(" Firmware Version:v{0}.{1}.{2}", (DevInfo.FirmwareVersion >> 24) & 0xFF, (DevInfo.FirmwareVersion >> 16) & 0xFF, DevInfo.FirmwareVersion & 0xFFFF);
Console.WriteLine(" Hardware Version:v{0}.{1}.{2}", (DevInfo.HardwareVersion >> 24) & 0xFF, (DevInfo.HardwareVersion >> 16) & 0xFF, DevInfo.HardwareVersion & 0xFFFF);
Console.WriteLine(" Functions:" + DevInfo.Functions.ToString("X8"));
+ Console.WriteLine(" SerialNumber:" + DevInfo.SerialNumber[0] + DevInfo.SerialNumber[1] + DevInfo.SerialNumber[2]);
Console.WriteLine(" Functions String:" + FuncStr);
StringBuilder DLLBuildDate = new StringBuilder(256);
USB_DEVICEByFD.DEV_GetDllBuildTime(DLLBuildDate);
@@ -264,7 +276,7 @@ namespace CapMachine.Wpf.CanDrive
public void InitCAN()
{
//初始化CAN
-
+ CANConfig.ISOCRCEnable = 1;//使能ISOCRC
ret = USB2CANFD.CANFD_Init(DevHandle, WriteCANIndex, ref CANConfig);
if (ret != USB2CANFD.CANFD_SUCCESS)
{
@@ -300,6 +312,7 @@ namespace CapMachine.Wpf.CanDrive
if (DBCHandle == 0)
{
Console.WriteLine("Parser DBC File error!");
+ DbcParserState = false;
return;
}
else
@@ -340,6 +353,9 @@ namespace CapMachine.Wpf.CanDrive
}
Console.WriteLine("");
}
+
+ //Dbc解析成功
+ DbcParserState = true;
}
///
@@ -424,6 +440,8 @@ namespace CapMachine.Wpf.CanDrive
private static readonly Random _random = new Random();
+
+
///
/// 精确周期发送CAN数据
///
@@ -533,11 +551,21 @@ namespace CapMachine.Wpf.CanDrive
//释放申请的临时缓冲区
Marshal.FreeHGlobal(msgPtSend);
+ //var CanMsg1 = GetCanMsg(CanMsg,0);
+ //var CanMsg2 = GetCanMsg(CanMsg,1);
+ CanMsg[0].Flags = 5;
+
+ //CanMsg1[0].Flags = 5;
+ //CanMsg2[0].Flags = 5;
//发送CAN数据
int SendedNum = USB2CANFD.CANFD_SendMsg(DevHandle, WriteCANIndex, CanMsg, (Int32)CanMsg.Length);
+ //Thread.Sleep(20);
+ //int SendedNum2 = USB2CANFD.CANFD_SendMsg(DevHandle, WriteCANIndex, CanMsg2, (Int32)CanMsg2.Length);
if (SendedNum >= 0)
{
//Console.WriteLine("Success send frames:{0}", SendedNum);
+
+
IsSendOk = true;
}
else
@@ -579,6 +607,31 @@ namespace CapMachine.Wpf.CanDrive
}, token, TaskCreationOptions.LongRunning, TaskScheduler.Default);
}
+ ///
+ /// 获取CAN消息数组中指定位置的数据
+ ///
+ /// 源CAN消息数组
+ /// 要获取的数据索引位置
+ /// 返回指定位置数据的新数组
+ private USB2CANFD.CANFD_MSG[] GetCanMsg(USB2CANFD.CANFD_MSG[] sourceCanMsg, int index)
+ {
+ // 参数检查
+ if (sourceCanMsg == null || sourceCanMsg.Length == 0 || index < 0 || index >= sourceCanMsg.Length)
+ {
+ return new USB2CANFD.CANFD_MSG[0];
+ }
+
+ // 创建单个元素的新数组
+ USB2CANFD.CANFD_MSG[] targetMsg = new USB2CANFD.CANFD_MSG[1];
+ targetMsg[0] = sourceCanMsg[index];
+
+ // 由于CANFD_MSG包含数组字段,需要手动初始化数据数组
+ targetMsg[0].Data = new byte[64];
+ // 复制数据
+ Array.Copy(sourceCanMsg[index].Data, targetMsg[0].Data, sourceCanMsg[index].Data.Length);
+
+ return targetMsg;
+ }
///
/// 修改停止发送的方法
@@ -616,12 +669,12 @@ namespace CapMachine.Wpf.CanDrive
///
/// 循环发送数据
///
- public ushort SendCycle { get; set; } = 100;
+ public ushort SendCycle { get; set; } = 200;
///
/// 循环接受数据
///
- public ushort ReviceCycle { get; set; } = 500;
+ public ushort ReviceCycle { get; set; } = 200;
///
@@ -666,21 +719,22 @@ namespace CapMachine.Wpf.CanDrive
{
CycleReviceTask = Task.Run(async () =>
{
+ //var ret = USB2CANFD.CANFD_StartGetMsg(DevHandle, ReadCANIndex);
while (IsCycleRevice)
{
- await Task.Delay(1000);
+ await Task.Delay(ReviceCycle);
try
{
//另外一个CAN通道读取数据
- USB2CANFD.CANFD_MSG[] CanMsgBuffer = new USB2CANFD.CANFD_MSG[10];
- msgPt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(USB2CANFD.CANFD_MSG)) * CanMsgBuffer.Length);
- int CanNum = USB2CANFD.CANFD_GetMsg(DevHandle, ReadCANIndex, msgPt, CanMsgBuffer.Length);
+ USB2CANFD.CANFD_MSG[] CanMsgBuffer = new USB2CANFD.CANFD_MSG[128];
+ IntPtr msgPtRead = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(USB2CANFD.CANFD_MSG)) * CanMsgBuffer.Length);
+ int CanNum = USB2CANFD.CANFD_GetMsg(DevHandle, ReadCANIndex, msgPtRead, CanMsgBuffer.Length);
if (CanNum > 0)
{
Console.WriteLine("Read CanMsgNum = {0}", CanNum);
for (int i = 0; i < CanNum; i++)
{
- CanMsgBuffer[i] = (USB2CANFD.CANFD_MSG)Marshal.PtrToStructure((IntPtr)(msgPt + i * Marshal.SizeOf(typeof(USB2CANFD.CANFD_MSG))), typeof(USB2CANFD.CANFD_MSG));
+ CanMsgBuffer[i] = (USB2CANFD.CANFD_MSG)Marshal.PtrToStructure((IntPtr)(msgPtRead + i * Marshal.SizeOf(typeof(USB2CANFD.CANFD_MSG))), typeof(USB2CANFD.CANFD_MSG));
Console.WriteLine("CanMsg[{0}].ID = 0x{1}", i, CanMsgBuffer[i].ID.ToString("X8"));
//Console.WriteLine("CanMsg[{0}].TimeStamp = {1}",i,CanMsgBuffer[i].TimeStamp);
Console.Write("CanMsg[{0}].Data = ", i);
@@ -689,6 +743,14 @@ namespace CapMachine.Wpf.CanDrive
Console.Write("{0} ", CanMsgBuffer[i].Data[j].ToString("X2"));
}
Console.WriteLine("");
+ //报文给高速记录的服务
+ HighSpeedDataService.AppendOrUpdateMsg(new Models.HighSpeed.CommMsg()
+ {
+ Category = "CANFD",
+ MsgInfo = "0x" + CanMsgBuffer[i].ID.ToString("X8"),
+ MsgData = BitConverter.ToString(CanMsgBuffer[i].Data),
+ Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")
+ });
}
}
else if (CanNum == 0)
@@ -702,13 +764,33 @@ namespace CapMachine.Wpf.CanDrive
Console.WriteLine("");
//将CAN消息数据填充到信号里面
- DBCParserByFD.DBC_SyncCANFDMsgToValue(DBCHandle, msgPt, CanNum);
- //获取信号值并打印出来
- StringBuilder ValueStr = new StringBuilder(32);
- DBCParserByFD.DBC_GetSignalValueStr(DBCHandle, new StringBuilder("TX1"), new StringBuilder("COM_current_Power"), ValueStr);
- Console.WriteLine("COM_current_Power = {0}", ValueStr);
- DBCParserByFD.DBC_GetSignalValueStr(DBCHandle, new StringBuilder("TX1"), new StringBuilder("COM_Curr_dc"), ValueStr);
- Console.WriteLine("COM_Curr_dc = {0}", ValueStr);
+ DBCParserByFD.DBC_SyncCANFDMsgToValue(DBCHandle, msgPtRead, CanNum);
+
+ //循环获取消息的数据
+ foreach (var item in ListCanFdDbcModel)
+ {
+ //有配置的名称的,认为是有用的,则需要读取数据
+ //if (!string.IsNullOrEmpty(item.Name))
+ //{
+ //CAN_DBCParser.DBC_GetSignalValueStr(DBCHandle, new StringBuilder(item.MsgName), new StringBuilder(item.SignalName), ValueSb);
+ //double[] ValueDouble;
+ DBCParserByFD.DBC_GetSignalValue(DBCHandle, new StringBuilder(item.MsgName), new StringBuilder(item.SignalName), ValueDouble);
+ //item.SignalRtValueSb = ValueSb;
+ item.SignalRtValue = ValueDouble[0].ToString();
+ //Console.Write(ValueSb.ToString());
+ //}
+ }
+
+ //释放数据缓冲区,必须释放,否则程序运行一段时间后会报内存不足
+ Marshal.FreeHGlobal(msgPtRead);
+ Thread.Sleep(10);
+
+ ////获取信号值并打印出来
+ //StringBuilder ValueStr = new StringBuilder(32);
+ //DBCParserByFD.DBC_GetSignalValueStr(DBCHandle, new StringBuilder("TX1"), new StringBuilder("COM_current_Power"), ValueStr);
+ //Console.WriteLine("COM_current_Power = {0}", ValueStr);
+ //DBCParserByFD.DBC_GetSignalValueStr(DBCHandle, new StringBuilder("TX1"), new StringBuilder("COM_Curr_dc"), ValueStr);
+ //Console.WriteLine("COM_Curr_dc = {0}", ValueStr);
}
catch (Exception ex)
{
diff --git a/CapMachine.Wpf/CanDrive/ToomossCan.cs b/CapMachine.Wpf/CanDrive/ToomossCan.cs
index e4c8dbe..153e1f2 100644
--- a/CapMachine.Wpf/CanDrive/ToomossCan.cs
+++ b/CapMachine.Wpf/CanDrive/ToomossCan.cs
@@ -123,6 +123,7 @@ namespace CapMachine.Wpf.CanDrive
///BufferSize 存储CAN消息缓冲区大小。
///返回值:
//大于等于0表示从CAN适配器内部成功读取到的CAN消息帧数,若返回值小于0则说明调用该函数失败。
+ /// 目前是WriteCANIndex和ReadCANIndex需要相同
///
public Byte WriteCANIndex { get; set; } = 0;
diff --git a/CapMachine.Wpf/Models/ComEnum.cs b/CapMachine.Wpf/Models/ComEnum.cs
index 8f7b3e9..b02b82e 100644
--- a/CapMachine.Wpf/Models/ComEnum.cs
+++ b/CapMachine.Wpf/Models/ComEnum.cs
@@ -79,6 +79,11 @@ namespace CapMachine.Wpf.Models
/// Lin
///
Lin = 2,
+
+ ///
+ /// CAN FD
+ ///
+ CANFD = 3,
}
}
}
diff --git a/CapMachine.Wpf/ViewModels/CANFDConfigViewModel.cs b/CapMachine.Wpf/ViewModels/CANFDConfigViewModel.cs
index 7294059..cba1a0c 100644
--- a/CapMachine.Wpf/ViewModels/CANFDConfigViewModel.cs
+++ b/CapMachine.Wpf/ViewModels/CANFDConfigViewModel.cs
@@ -840,7 +840,7 @@ namespace CapMachine.Wpf.ViewModels
if (CanFdDriveService.ToomossCanFDDrive.OpenState)
{
//系统使用了CAN
- ConfigService.CanLinRunStateModel.CurSysSelectedCanLin = CanLinEnum.Can;
+ ConfigService.CanLinRunStateModel.CurSysSelectedCanLin = CanLinEnum.CANFD;
}
//CAN DBC配置 有DBC配置的话,则直接加载DBC信息
diff --git a/CapMachine.Wpf/Views/CANFDConfigView.xaml b/CapMachine.Wpf/Views/CANFDConfigView.xaml
index f9f7e02..cc7168d 100644
--- a/CapMachine.Wpf/Views/CANFDConfigView.xaml
+++ b/CapMachine.Wpf/Views/CANFDConfigView.xaml
@@ -466,10 +466,10 @@