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]; /// /// 打开设备 /// /// 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, "连接成功"); } /// /// 初始化CAN /// /// 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!"); } } /// /// CANFD初始化 /// /// 仲裁段波特率 /// 数据段波特率 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!"); } } } }