You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

212 lines
8.2 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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!");
}
}
}
}