#define GET_FIRMWARE_INFO //#define CAN_MODE_LOOPBACK #define CAN_SEND_MSG #define CAN_GET_STATUS #define CAN_GET_MSG using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Linq; using System.Diagnostics; using System.Text; using USB2XXX; /** * 注意:若运行程序提示找不到USB2XXX.dll文件,可以将工程目录下的USB2XXX.dll和libusb-1.0.dll文件拷贝到exe程序输出目录下即可(一般是./bin/Release或者./bin/Debug目录) * 运行程序之前,先将CAN1_H接CAN2_H,CAN1_L接CAN2_L */ namespace USB2XXXCANTest { class Program { static void Main(string[] args) { usb_device.DEVICE_INFO DevInfo = new usb_device.DEVICE_INFO(); Int32[] DevHandles = new Int32[20]; Int32 DevHandle = 0; Byte WriteCANIndex = 0; Byte ReadCANIndex = 0; bool state; Int32 DevNum, ret; //扫描查找设备 DevNum = usb_device.USB_ScanDevice(DevHandles); if (DevNum <= 0) { Console.WriteLine("No device connected!"); return; } else { Console.WriteLine("Have {0} device connected!", DevNum); } DevHandle = DevHandles[0]; //打开设备 state = usb_device.USB_OpenDevice(DevHandle); if (!state) { Console.WriteLine("Open device error!"); return; } else { Console.WriteLine("Open device success!"); } //获取固件信息 StringBuilder FuncStr = new StringBuilder(256); state = usb_device.DEV_GetDeviceInfo(DevHandle, ref DevInfo, FuncStr); if (!state) { Console.WriteLine("Get device infomation error!"); return; } else { Console.WriteLine("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); } //初始化配置CAN USB2CAN.CAN_INIT_CONFIG CANConfig = new USB2CAN.CAN_INIT_CONFIG(); ret = USB2CAN.CAN_GetCANSpeedArg(DevHandle, ref CANConfig,500000); if (ret != USB2CAN.CAN_SUCCESS) { Console.WriteLine("Get CAN Speed failed!"); return; } else { Console.WriteLine("Get CAN Speed Success!"); } #if CAN_MODE_LOOPBACK CANConfig.CAN_Mode = 1;//环回模式 #else CANConfig.CAN_Mode = 0x80;//正常模式并接入终端电阻 #endif ret = USB2CAN.CAN_Init(DevHandle, WriteCANIndex, ref CANConfig); if(ret != USB2CAN.CAN_SUCCESS){ Console.WriteLine("Config CAN failed!"); return; }else{ Console.WriteLine("Config CAN Success!"); } ret = USB2CAN.CAN_Init(DevHandle, ReadCANIndex, ref CANConfig); if (ret != USB2CAN.CAN_SUCCESS) { Console.WriteLine("Config CAN failed!"); return; } else { Console.WriteLine("Config CAN Success!"); } //配置过滤器,接收所有数据 /*USB2CAN.CAN_FILTER_CONFIG CANFilter = new USB2CAN.CAN_FILTER_CONFIG(); CANFilter.Enable = 1; CANFilter.ExtFrame = 0; CANFilter.FilterIndex = 0; CANFilter.FilterMode = 0; CANFilter.MASK_IDE = 0; CANFilter.MASK_RTR = 0; CANFilter.MASK_Std_Ext = 0; CANFilter.ID_Std_Ext = 0x475; ret = USB2CAN.CAN_Filter_Init(DevHandle, ReadCANIndex, ref CANFilter); if (ret != USB2CAN.CAN_SUCCESS) { Console.WriteLine("Config CAN Filter failed!"); return; } else { Console.WriteLine("Config CAN Filter Success!"); }*/ //启动CAN接收数据 ret = USB2CAN.CAN_StartGetMsg(DevHandle, ReadCANIndex); if (ret != USB2CAN.CAN_SUCCESS) { Console.WriteLine("Start CAN failed!"); return; } else { Console.WriteLine("Start CAN Success!"); } #if CAN_SEND_MSG//发送CAN帧 USB2CAN.CAN_MSG[] CanMsg = new USB2CAN.CAN_MSG[5]; for(int i=0;i<5;i++){ CanMsg[i] = new USB2CAN.CAN_MSG(); CanMsg[i].ExternFlag = 0; CanMsg[i].RemoteFlag = 0; CanMsg[i].ID = (UInt32)i; CanMsg[i].DataLen = 8; CanMsg[i].Data = new Byte[CanMsg[i].DataLen]; for(int j=0;j= 0){ Console.WriteLine("Success send frames:{0}",SendedNum); }else{ Console.WriteLine("Send CAN data failed!"); } #endif #if CAN_GET_STATUS USB2CAN.CAN_STATUS CANStatus = new USB2CAN.CAN_STATUS(); ret = USB2CAN.CAN_GetStatus(DevHandle, WriteCANIndex, ref CANStatus); if(ret == USB2CAN.CAN_SUCCESS){ Console.WriteLine("TSR = {0:X8}",CANStatus.TSR); Console.WriteLine("ESR = {0:X8}",CANStatus.ESR); }else{ Console.WriteLine("Get CAN status error!\n"); } #endif //延时 System.Threading.Thread.Sleep(500); #if CAN_GET_MSG for (int t = 0; t < 10; t++) { USB2CAN.CAN_MSG[] CanMsgBuffer = new USB2CAN.CAN_MSG[1024]; //申请存储数据缓冲区 IntPtr pt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(USB2CAN.CAN_MSG)) * CanMsgBuffer.Length); int CanNum = USB2CAN.CAN_GetMsgWithSize(DevHandle, ReadCANIndex, pt, CanMsgBuffer.Length); if (CanNum > 0) { for (int i = 0; i < CanNum; i++) { //从缓冲区中获取数据 CanMsgBuffer[i] = (USB2CAN.CAN_MSG)Marshal.PtrToStructure((IntPtr)((UInt32)pt + i * Marshal.SizeOf(typeof(USB2CAN.CAN_MSG))), typeof(USB2CAN.CAN_MSG)); Console.WriteLine("CanMsg[{0}].ID = {1}", i, CanMsgBuffer[i].ID); Console.WriteLine("CanMsg[{0}].TimeStamp = {1}", i, CanMsgBuffer[i].TimeStamp); Console.Write("CanMsg[{0}].Data = ", i); for (int j = 0; j < CanMsgBuffer[i].DataLen; j++) { Console.Write("{0:X2} ", CanMsgBuffer[i].Data[j]); } Console.WriteLine("\n"); } } else if (CanNum < 0) { Console.WriteLine("Get CAN data error!"); } //延时 System.Threading.Thread.Sleep(100); //释放申请的数据缓冲区 Marshal.FreeHGlobal(pt); } //停止CAN USB2CAN.CAN_StopGetMsg(DevHandle, ReadCANIndex); #endif } } }