/// <summary> /// 打开CAN卡 /// </summary> /// <param name="CanDeceivePort">打开的端口号</param> /// <returns></returns> private void OpenCAN(UInt32 CanDeceivePort = 0) { char t_char = '0'; CANDeviceHandle = CanCmd.CAN_DeviceOpen(canDviceType, CanDeceivePort, ref t_char); if (CANDeviceHandle == 0) { Info?.Invoke("[E]打开" + canDeviceName + "设备失败"); return; } Info?.Invoke("[I]打开" + canDeviceName + "设备成功"); }
/// <summary> /// CAN卡数据接收线程 /// </summary> private unsafe void TRecv() { while (!T_CANRecv_NeedDel) { if (IsCANopen) { //check is have data uint res = CanCmd.CAN_GetReceiveCount(CANDeviceHandle, canDeviceChannel); if (res == 0) { continue;//not receive data } ///////////////////////////////////// UInt32 con_maxlen = 500; IntPtr pt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(CAN_DataFrame)) * (Int32)con_maxlen); res = CanCmd.CAN_ChannelReceive(CANDeviceHandle, canDeviceChannel, pt, con_maxlen, 100); //////////////////////////////////////////////////////// if (res == 0) { // 读取错误信息 CAN_ErrorInformation err = new CAN_ErrorInformation(); // 必须调用此函数 if (CanCmd.CAN_GetErrorInfo(CANDeviceHandle, canDeviceChannel, ref err) == CanCmd.CAN_RESULT_OK) { // CAN通讯有错误 // 处理错误信息 Info?.Invoke("[E]CAN通讯有错误: " + DecodeErrCode(err.uErrorCode)); } else { // 没有收到CAN数据 Info?.Invoke("[E]没有收到CAN数据,获取错误信息失败"); } CanCmd.CAN_ClearReceiveBuffer(CANDeviceHandle, canDeviceChannel); } else { WriteDataToCANRecvData = true; for (UInt32 i = 0; i < res; i++) { CAN_DataFrame obj = (CAN_DataFrame)Marshal.PtrToStructure((IntPtr)((UInt64)pt + (UInt64)(i * Marshal.SizeOf(typeof(CAN_DataFrame)))), typeof(CAN_DataFrame)); CANRecvedData.AddLast(obj); } } WriteDataToCANRecvData = false; Marshal.FreeHGlobal(pt); } } }
/// <summary> /// 对外接口,通过CAN发送数据 /// </summary> /// <param name="str">发送数据的命令</param> /// <returns>发送状态</returns> public bool Write(string str) { List <SendCMD> sendCMDs = new List <SendCMD>(); CAN_DataFrame sendobj = new CAN_DataFrame(); sendobj.nDataLen = 8; //str = str.Substring(1); str = str.Replace('$', ' '); var cmds = str.Split(','); for (int i = 0; i < cmds.Length; i++) { if (cmds[i] == "" || cmds[i] == ",") { continue; } SendCMD a = new SendCMD(); a.Name = cmds[i].Substring(0, 6); var ttt = cmds[i].Substring(6); a.Value = Convert.ToInt32(cmds[i].Substring(6)); a.ID = CheckID(a.Name); sendobj.uID = a.ID; sendCMDs.Add(a); } sendobj.nSendType = 0; //Normal send sendobj.bRemoteFlag = 0; //不是远程帧 sendobj.bExternFlag = 1; //扩展帧 sendobj.nDataLen = 8; OganizeData(sendCMDs, ref sendobj); if (IsCANopen) { if (CanCmd.CAN_ChannelSend(CANDeviceHandle, canDeviceChannel, ref sendobj, 1) == 0) { Info?.Invoke("[E]发送失败"); } else { Info?.Invoke("[I]发送成功"); } } else { Info?.Invoke("[E]CAN未打开"); } return(true); }
/// <summary> /// 打开通道 /// </summary> /// <param name="channel">通道号</param> private void OpenChannel(UInt32 channel) { canDeviceChannel = channel; if (CANDeviceHandle != 0) { if (CanCmd.CAN_RESULT_OK != CanCmd.CAN_ChannelStart(CANDeviceHandle, canDeviceChannel, ref config)) { Info?.Invoke("[E]打开" + canDeviceName + "设备的通道" + canDeviceChannel.ToString() + "失败"); return; } Info?.Invoke("[I]打开" + canDeviceName + "设备的通道" + canDeviceChannel.ToString() + "成功"); IsCANopen = true; } else { Info?.Invoke("[E]没有打开设备之前不可操作CAN通道"); } }
/// <summary> /// 关闭CAN卡 /// </summary> public void CloseCAN() { try { T_CANRecv_NeedDel = true; T_CANRecv.Abort(); } catch (Exception ex) { Info?.Invoke("[I]关闭线程" + T_CANRecv.Name + ":" + ex.ToString()); } if (CanCmd.CAN_RESULT_OK != CanCmd.CAN_ChannelStop(CANDeviceHandle, canDeviceChannel)) { Info?.Invoke("[E]关闭" + canDeviceName + "设备的通道" + canDeviceChannel.ToString() + "失败"); } Info?.Invoke("[I]已关闭" + canDeviceName + "设备的通道" + canDeviceChannel.ToString()); CanCmd.CAN_DeviceClose(CANDeviceHandle); IsCANopen = false; Info?.Invoke("[I]已关闭" + canDeviceName + "设备"); }