コード例 #1
0
        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);
        }
コード例 #2
0
ファイル: CanDriver.cs プロジェクト: bhxxwx/InternalCANTest
        /// <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);
                }
            }
        }
コード例 #3
0
ファイル: CanDriver.cs プロジェクト: bhxxwx/InternalCANTest
        /// <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);
        }
コード例 #4
0
        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;
            }
        }
コード例 #5
0
ファイル: CanDriver.cs プロジェクト: bhxxwx/InternalCANTest
        /// <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;
                }
            }
        }
コード例 #6
0
ファイル: Like.cs プロジェクト: tgl233/AWX_CAN_Tool
 public static extern uint CAN_ChannelSend(uint dwDeviceHandle, uint dwChannel, ref CAN_DataFrame pSend, ulong nCount = 1);
コード例 #7
0
ファイル: Like.cs プロジェクト: tgl233/AWX_CAN_Tool
 public static extern uint CAN_ChannelReceive(uint dwDeviceHandle, uint dwChannel, ref CAN_DataFrame pReceive, uint nCount=1, int nWaitTime = -1);