public bool DecodePacket(CAN_DataFrame cAN_Data) { switch (cAN_Data.uID) { case 0x18FF2111: Analysis_DATA(1, cAN_Data); count[0] = 1; break; case 0x18FF2313: Analysis_DATA(2, cAN_Data); count[1] = 1; break; case 0x18FF2413: Analysis_DATA(3, cAN_Data); count[2] = 1; break; case 0x0CFF2715: Analysis_DATA(4, cAN_Data); count[3] = 1; break; case 0x18FF2815: Analysis_DATA(5, cAN_Data); count[4] = 1; break; case 0x18FF2915: Analysis_DATA(6, cAN_Data); count[5] = 1; break; case 0x18FF2515: Analysis_DATA(7, cAN_Data); count[6] = 1; break; case 0x0CFF2615: Analysis_DATA(8, cAN_Data); count[7] = 1; break; } if (count.Min() == 1) { count.ToList().ForEach(a => { a = 0; }); return(true); } return(false); }
/// <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); }
unsafe private void Analysis_DATA(UInt16 Pack_NO, CAN_DataFrame CANRX) { switch (Pack_NO) { case 1: json.HXCS = CANRX.arryData[0].ToString(); json.ZXCS = CANRX.arryData[1].ToString(); json.XLGWY = ((CANRX.arryData[3] << 8) + CANRX.arryData[2]).ToString(); // CANDATA.XLGWY = CANRX.arryData[2]&0XFFFF; json.XLGZJ = ((CANRX.arryData[5] << 8) + CANRX.arryData[4]).ToString(); // CANDATA.XLGZJ += CANRX.arryData[4]; break; case 2: json.GTGD = (((ushort)CANRX.arryData[1] << 8) + (ushort)CANRX.arryData[0]).ToString(); // CANDATA.GTGD += CANRX.arryData[0]; json.BHLGD = ((ushort)(CANRX.arryData[3] << 8) + CANRX.arryData[2]).ToString(); // CANDATA.BHLGD += CANRX.arryData[2]; json.XGD = ((ushort)(CANRX.arryData[5] << 8) + CANRX.arryData[4]).ToString(); // CANDATA.XGD += CANRX.arryData[4]; json.GTGD_R = ((ushort)(CANRX.arryData[7] << 8) + CANRX.arryData[6]).ToString(); break; case 3: json.DPZQ = ((CANRX.arryData[1] << 8) + CANRX.arryData[0]).ToString(); // CANDATA.DPZQ += CANRX.arryData[0]; json.DPYQ = ((CANRX.arryData[3] << 8) + CANRX.arryData[2]).ToString(); // CANDATA.DPYQ += CANRX.arryData[2]; json.DPZH = ((CANRX.arryData[5] << 8) + CANRX.arryData[4]).ToString(); // CANDATA.DPZH += CANRX.arryData[4]; json.DPYH = ((CANRX.arryData[7] << 8) + CANRX.arryData[6]).ToString(); // CANDATA.DPYH += CANRX.arryData[6]; break; case 4: json.QJSD = ((CANRX.arryData[3] << 8) + CANRX.arryData[2]).ToString(); // CANDATA.QJSD += CANRX.arryData[2]; json.LZLL = ((CANRX.arryData[5] << 8) + CANRX.arryData[4]).ToString(); // CANDATA.LZLL += CANRX.arryData[4]; break; case 5: json.ZGDZS = ((CANRX.arryData[1] << 8) + CANRX.arryData[0]).ToString(); // CANDATA.ZGDZS += CANRX.arryData[0]; json.BHLZS = ((CANRX.arryData[3] << 8) + CANRX.arryData[2]).ToString(); // CANDATA.BHLZS += CANRX.arryData[2]; json.SSCZS = ((CANRX.arryData[5] << 8) + CANRX.arryData[4]).ToString(); // CANDATA.SSCZS += CANRX.arryData[4]; json.TLGT = ((CANRX.arryData[7] << 8) + CANRX.arryData[6]).ToString(); // CANDATA.TLGT += CANRX.arryData[6]; break; case 6: json.FJZS = ((CANRX.arryData[1] << 8) + CANRX.arryData[0]).ToString(); // CANDATA.FJZS += CANRX.arryData[0]; json.SLJLZS = ((CANRX.arryData[3] << 8) + CANRX.arryData[2]).ToString(); // CANDATA.SLJLZS += CANRX.arryData[2]; json.ZYJLZS = ((CANRX.arryData[5] << 8) + CANRX.arryData[4]).ToString(); // CANDATA.ZYJLZS += CANRX.arryData[4]; break; case 7: json.QXSS = ((CANRX.arryData[1] << 8) + CANRX.arryData[0]).ToString(); // CANDATA.QXSS += CANRX.arryData[0]; json.JDSS = ((CANRX.arryData[3] << 8) + CANRX.arryData[2]).ToString(); // CANDATA.JDSS += CANRX.arryData[2]; json.TLJX = CANRX.arryData[4].ToString(); json.DLBKD = CANRX.arryData[5].ToString(); json.JFKKD = CANRX.arryData[6].ToString(); json.YLKSD = CANRX.arryData[7].ToString(); break; case 8: json.GFKD = ((CANRX.arryData[4] << 8) + CANRX.arryData[3]).ToString(); // CANDATA.GFKD += CANRX.arryData[3]; json.HZL = CANRX.arryData[5].ToString(); json.PSL = CANRX.arryData[6].ToString(); break; default: break; } }
/// <summary> /// 组织数据成为一个完整的CAN包 /// </summary> /// <param name="cMDs">发送命令List</param> /// <param name="cAN_Data">CAN数据包</param> private unsafe void OganizeData(List <SendCMD> cMDs, ref CAN_DataFrame cAN_Data) { for (int i = 0; i < cMDs.Count; i++) { var cmd = cMDs[i]; switch (cmd.Name) { case "GT_PER": cAN_Data.arryData[0] = (byte)cmd.Value; cAN_Data.arryData[1] = (byte)(cmd.Value >> 8); break; case "GT_MAX": cAN_Data.arryData[2] = (byte)cmd.Value; cAN_Data.arryData[3] = (byte)(cmd.Value >> 8); break; case "GT_MIN": cAN_Data.arryData[4] = (byte)cmd.Value; cAN_Data.arryData[5] = (byte)(cmd.Value >> 8); break; case "GF_PER": cAN_Data.arryData[0] = (byte)cmd.Value; cAN_Data.arryData[1] = (byte)(cmd.Value >> 8); break; case "GF_MAX": cAN_Data.arryData[2] = (byte)cmd.Value; cAN_Data.arryData[3] = (byte)(cmd.Value >> 8); break; case "GF_MIN": cAN_Data.arryData[4] = (byte)cmd.Value; cAN_Data.arryData[5] = (byte)(cmd.Value >> 8); break; case "SD_MAX": cAN_Data.arryData[0] = (byte)cmd.Value; cAN_Data.arryData[1] = (byte)(cmd.Value >> 8); break; case "SD_MIN": cAN_Data.arryData[2] = (byte)cmd.Value; cAN_Data.arryData[3] = (byte)(cmd.Value >> 8); break; case "QZ_SS1": cAN_Data.arryData[4] = (byte)cmd.Value; break; case "QZ_TL2": cAN_Data.arryData[5] = (byte)cmd.Value; break; case "QZ_SL3": cAN_Data.arryData[6] = (byte)cmd.Value; break; case "QZ_ZY4": cAN_Data.arryData[7] = (byte)cmd.Value; break; case "SS_PER": cAN_Data.arryData[0] = (byte)cmd.Value; cAN_Data.arryData[1] = (byte)(cmd.Value >> 8); break; case "SS_MAX": cAN_Data.arryData[2] = (byte)cmd.Value; cAN_Data.arryData[3] = (byte)(cmd.Value >> 8); break; case "SS_MIN": cAN_Data.arryData[4] = (byte)cmd.Value; cAN_Data.arryData[5] = (byte)(cmd.Value >> 8); break; case "TL_PER": cAN_Data.arryData[0] = (byte)cmd.Value; cAN_Data.arryData[1] = (byte)(cmd.Value >> 8); break; case "TL_NAX": cAN_Data.arryData[2] = (byte)cmd.Value; cAN_Data.arryData[3] = (byte)(cmd.Value >> 8); break; case "TL_MIN": cAN_Data.arryData[4] = (byte)cmd.Value; cAN_Data.arryData[5] = (byte)(cmd.Value >> 8); break; case "SJ_PER": cAN_Data.arryData[0] = (byte)cmd.Value; cAN_Data.arryData[1] = (byte)(cmd.Value >> 8); break; case "SJ_MAX": cAN_Data.arryData[2] = (byte)cmd.Value; cAN_Data.arryData[3] = (byte)(cmd.Value >> 8); break; case "SJ_MIN": cAN_Data.arryData[4] = (byte)cmd.Value; cAN_Data.arryData[5] = (byte)(cmd.Value >> 8); break; case "ZY_PER": cAN_Data.arryData[0] = (byte)cmd.Value; cAN_Data.arryData[1] = (byte)(cmd.Value >> 8); break; case "ZY_MAX": cAN_Data.arryData[2] = (byte)cmd.Value; cAN_Data.arryData[3] = (byte)(cmd.Value >> 8); break; case "ZY_MIN": cAN_Data.arryData[2] = (byte)cmd.Value; cAN_Data.arryData[3] = (byte)(cmd.Value >> 8); break; case "ZX_CUR": cAN_Data.arryData[0] = (byte)cmd.Value; cAN_Data.arryData[1] = (byte)(cmd.Value >> 8); break; case "ZX_FLG": cAN_Data.arryData[2] = (byte)cmd.Value; break; case "ZX_TTF": cAN_Data.arryData[3] = (byte)cmd.Value; break; case "ZX_TTD": cAN_Data.arryData[4] = (byte)cmd.Value; cAN_Data.arryData[5] = (byte)(cmd.Value >> 8); break; case "CL_FLG": cAN_Data.arryData[6] = (byte)cmd.Value; break; case "HZL___": cAN_Data.arryData[5] = (byte)cmd.Value; break; case "PSL___": cAN_Data.arryData[6] = (byte)cmd.Value; break; } } }
public static extern uint CAN_ChannelSend(uint dwDeviceHandle, uint dwChannel, ref CAN_DataFrame pSend, ulong nCount = 1);
public static extern uint CAN_ChannelReceive(uint dwDeviceHandle, uint dwChannel, ref CAN_DataFrame pReceive, uint nCount=1, int nWaitTime = -1);