|
|
using CompressorXN_Common;
|
|
|
using System;
|
|
|
using System.Text;
|
|
|
using USB2XXX;
|
|
|
|
|
|
namespace CompressorXN_Communication.TuMos
|
|
|
{
|
|
|
public class BaseTMS
|
|
|
{
|
|
|
private static USB_DEVICE.DEVICE_INFO DevInfo = new USB_DEVICE.DEVICE_INFO();
|
|
|
private static Int32[] DevHandles = new Int32[20];
|
|
|
protected static int DevHandle = 0;
|
|
|
protected static Byte WriteCANIndex = 0;
|
|
|
protected static Byte ReadCANIndex = 0;
|
|
|
protected static Byte CANIndex = 0;
|
|
|
private static bool state;
|
|
|
private static Int32 DevNum = 0;
|
|
|
private static USB2CANFD.CANFD_MSG[] CanMsgBuffer = new USB2CANFD.CANFD_MSG[10240];
|
|
|
|
|
|
/// <summary>
|
|
|
/// 打开设备
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
|
public static (bool isOk, string msg) OpenDevice()
|
|
|
{
|
|
|
//扫描查找设备
|
|
|
DevNum = USB_DEVICE.USB_ScanDevice(DevHandles);
|
|
|
if (DevNum <= 0)
|
|
|
{
|
|
|
return (false, $"无设备连接!");
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Console.WriteLine("Have {0} device connected!", DevNum);
|
|
|
}
|
|
|
|
|
|
DevHandle = DevHandles[0];
|
|
|
//打开设备
|
|
|
state = USB_DEVICE.USB_OpenDevice(DevHandle);
|
|
|
if (!state)
|
|
|
{
|
|
|
return (false, $"打开设备异常:state={state}!");
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Console.WriteLine("Open device success!");
|
|
|
}
|
|
|
|
|
|
//获取固件信息
|
|
|
StringBuilder FuncStr = new StringBuilder(256);
|
|
|
state = USB_DEVICE.DEV_GetDeviceInfo(DevHandle, ref DevInfo, FuncStr);
|
|
|
if (!state)
|
|
|
{
|
|
|
return (false, $"获取设备信息异常:state={state}!");
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Console.WriteLine($"{DateTime.Now}>>>>Firmware Info:");
|
|
|
Console.WriteLine(" Name:" + Encoding.Default.GetString(DevInfo.FirmwareName));
|
|
|
Console.WriteLine(" Build Date:" + Encoding.Default.GetString(DevInfo.BuildDate));
|
|
|
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(" Functions String:" + FuncStr);
|
|
|
}
|
|
|
GlobalVar.DevHandle = DevHandle;
|
|
|
|
|
|
return (true, "连接成功");
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 初始化CAN
|
|
|
/// </summary>
|
|
|
/// <param name="bps"></param>
|
|
|
public static void CanInit(uint bps)
|
|
|
{
|
|
|
USB2CAN.CAN_INIT_CONFIG CANConfig = new USB2CAN.CAN_INIT_CONFIG();
|
|
|
//波特率
|
|
|
var ret = USB2CAN.CAN_GetCANSpeedArg(DevHandle, ref CANConfig, bps);
|
|
|
if (ret != USB2CAN.CAN_SUCCESS)
|
|
|
{
|
|
|
Console.WriteLine("Get CAN Speed failed!");
|
|
|
return;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Console.WriteLine("Get CAN Speed Success!");
|
|
|
}
|
|
|
//初始化配置CAN
|
|
|
CANConfig.CAN_Mode = 0x80;//正常模式
|
|
|
CANConfig.CAN_ABOM = 0;//禁止自动离线
|
|
|
CANConfig.CAN_NART = 1;//禁止报文重传
|
|
|
CANConfig.CAN_RFLM = 0;//FIFO满之后覆盖旧报文
|
|
|
CANConfig.CAN_TXFP = 1;//发送请求决定发送顺序
|
|
|
ret = USB2CAN.CAN_Init(DevHandle, WriteCANIndex, ref CANConfig);
|
|
|
|
|
|
if (ret != USB2CAN.CAN_SUCCESS)
|
|
|
{
|
|
|
Console.WriteLine("Config Send CAN failed!");
|
|
|
return;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Console.WriteLine("Config Send CAN Success!");
|
|
|
}
|
|
|
//配置过滤器,接收所有数据
|
|
|
//int[] pIdList = new int[1] { Convert.ToInt32(GlobalVar.agreementMsgVM.ReciveId, 16) };
|
|
|
//byte idListLen = 1;
|
|
|
//ret = USB2CAN.CAN_FilterList_Init(DevHandle, ReadCANIndex, pIdList, idListLen);
|
|
|
//if (ret != USB2CAN.CAN_SUCCESS)
|
|
|
//{
|
|
|
// Console.WriteLine("Config CAN Filter failed!");
|
|
|
// return;
|
|
|
//}
|
|
|
//else
|
|
|
//{
|
|
|
// Console.WriteLine("Config CAN Filter Success!");
|
|
|
//}
|
|
|
|
|
|
//启动CAN接收数据
|
|
|
ret = USB2CAN.CAN_StartGetMsg(GlobalVar.DevHandle, GlobalVar.ReadCANIndex);
|
|
|
if (ret != USB2CAN.CAN_SUCCESS)
|
|
|
{
|
|
|
Console.WriteLine("Start CAN failed!");
|
|
|
return;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Console.WriteLine("Start CAN Success!");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// CANFD初始化
|
|
|
/// </summary>
|
|
|
/// <param name="bpsNBT">仲裁段波特率</param>
|
|
|
/// <param name="bpsDBT">数据段波特率</param>
|
|
|
public static void CANFDInit(uint bpsNBT, uint bpsDBT)
|
|
|
{
|
|
|
USB2CANFD.CANFD_INIT_CONFIG CANFDConfig = new USB2CANFD.CANFD_INIT_CONFIG();
|
|
|
|
|
|
/*
|
|
|
CANFDConfig.Mode = 1; //0-正常模式,1-自发自收模式
|
|
|
CANFDConfig.RetrySend = 1; //使能自动重传
|
|
|
CANFDConfig.ISOCRCEnable = 1;//使能ISOCRC
|
|
|
CANFDConfig.ResEnable = 1; //使能内部终端电阻(若总线上没有终端电阻,则必须使能终端电阻才能正常传输数据)
|
|
|
//波特率参数可以用TCANLINPro软件里面的波特率计算工具计算
|
|
|
//仲裁段波特率参数,波特率=40M/NBT_BRP*(1+NBT_SEG1+NBT_SEG2)
|
|
|
CANFDConfig.NBT_BRP = 1;
|
|
|
CANFDConfig.NBT_SEG1 = 63;
|
|
|
CANFDConfig.NBT_SEG2 = 16;
|
|
|
CANFDConfig.NBT_SJW = 16;
|
|
|
//数据域波特率参数,波特率=40M/DBT_BRP*(1+DBT_SEG1+DBT_SEG2)
|
|
|
CANFDConfig.DBT_BRP = 1;
|
|
|
CANFDConfig.DBT_SEG1 = 15;
|
|
|
CANFDConfig.DBT_SEG2 = 4;
|
|
|
CANFDConfig.DBT_SJW = 4;
|
|
|
* */
|
|
|
//填充初始化参数
|
|
|
var ret = USB2CANFD.CANFD_GetCANSpeedArg(DevHandle, ref CANFDConfig, bpsNBT, bpsDBT);
|
|
|
if (ret != USB2CANFD.CANFD_SUCCESS)
|
|
|
{
|
|
|
Console.WriteLine("Get CANFD Speed failed!");
|
|
|
return;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Console.WriteLine("Get CANFD Speed Success!");
|
|
|
}
|
|
|
CANFDConfig.ISOCRCEnable = 1;//使能ISOCRC
|
|
|
ret = USB2CANFD.CANFD_Init(DevHandle, CANIndex, ref CANFDConfig);
|
|
|
if (ret != USB2CANFD.CANFD_SUCCESS)
|
|
|
{
|
|
|
Console.WriteLine("Config CANFD failed!");
|
|
|
return;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Console.WriteLine("Config CANFD Success!");
|
|
|
}
|
|
|
//配置过滤器,若不配置过滤器,默认是接收所有数据
|
|
|
//USB2CANFD.CANFD_FILTER_CONFIG CANFDFilter = new USB2CANFD.CANFD_FILTER_CONFIG();
|
|
|
//CANFDFilter.Index = 0;//取值范围为:0~31
|
|
|
//CANFDFilter.Enable = 1;
|
|
|
////配置为只接收扩展帧数据
|
|
|
//CANFDFilter.ID_Accept = 0x80000000;
|
|
|
//CANFDFilter.ID_Mask = 0x80000000;
|
|
|
//ret = USB2CANFD.CANFD_SetFilter(DevHandle, CANIndex, ref CANFDFilter, 1);
|
|
|
//if (ret != USB2CANFD.CANFD_SUCCESS)
|
|
|
//{
|
|
|
// Console.WriteLine("Config filter failed!");
|
|
|
// return;
|
|
|
//}
|
|
|
//else
|
|
|
//{
|
|
|
// Console.WriteLine("Config filter success!");
|
|
|
//}
|
|
|
//启动CAN数据接收
|
|
|
ret = USB2CANFD.CANFD_StartGetMsg(DevHandle, CANIndex);
|
|
|
if (ret != USB2CANFD.CANFD_SUCCESS)
|
|
|
{
|
|
|
Console.WriteLine("Start receive CANFD failed!");
|
|
|
return;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Console.WriteLine("Start receive CANFD Success!");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|