예제 #1
0
        public bool ReadCanMsg(ref uint ID, out byte[] Msg)
        {
            if (_IsOpen)
            {
                pt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(VCI_CAN_OBJ)));

                Marshal.WriteByte(pt, 0x00);

                uint Cnt = ZLGBasic.VCI_Receive(m_DevType, m_DevIndex, m_CanIndex, pt, 1, 0);

                if (Cnt > 0)
                {
                    VCI_CAN_OBJ obj = (VCI_CAN_OBJ)Marshal.PtrToStructure((IntPtr)((UInt32)pt), typeof(VCI_CAN_OBJ));

                    ID = obj.ID;

                    Msg = new byte[obj.DataLen];

                    Array.Copy(obj.Data, Msg, obj.DataLen);


                    Marshal.FreeHGlobal(pt);

                    return(true);
                }

                Marshal.FreeHGlobal(pt);
            }


            ID  = 0;
            Msg = new byte[8];

            return(false);
        }
예제 #2
0
        public bool WriteCanMsg(uint ID, byte[] Msg)
        {
            //重试的次数
            int retrycnt = 0;



            if (_IsOpen)
            {
                try
                {
                    VCI_CAN_OBJ CanMsg = new VCI_CAN_OBJ();
                    CanMsg.ID         = Globals._NODE_ | ID;
                    CanMsg.SendType   = 0;          //0:正常发送 1:单次发送 2:自发自收 3:单次自发自收
                    CanMsg.RemoteFlag = 0;          //0:数据帧 1: 远程帧
                    CanMsg.ExternFlag = 0;          //0:标准帧 1:扩展帧

                    CanMsg.DataLen = (byte)Msg.Length;
                    CanMsg.Data    = new byte[8];
                    Array.Copy(Msg, CanMsg.Data, CanMsg.DataLen);


                    VCI_ERR_INFO   ErrorInfo = new VCI_ERR_INFO();
                    VCI_CAN_STATUS Vcs       = new VCI_CAN_STATUS();

                    do
                    {
                        if (ZLGBasic.VCI_Transmit(m_DevType, m_DevIndex, m_DevIndex, ref CanMsg, 1) == ZLGBasic.STATUS_OK)
                        {
                            return(true);
                        }
                        else
                        {
                            retrycnt++;

                            ZLGBasic.VCI_ReadErrInfo(m_DevType, m_DevIndex, m_CanIndex, ref ErrorInfo);

                            ZLGBasic.VCI_ReadCANStatus(m_DevType, m_DevIndex, m_CanIndex, ref Vcs);

                            //写总线异常日志


                            Thread.Sleep(10);
                        }
                    } while (retrycnt < 3);
                }
                catch (Exception ex)
                {
                    LogHelper.WriteLog(ex.Message);
                }
            }

            return(false);
        }
예제 #3
0
        private void Dispose(bool fromDestructor)
        {
            if (_IsOpen)
            {
                ZLGBasic.VCI_CloseDevice(m_DevType, m_DevIndex);
                //Marshal.FreeHGlobal(pt);
            }


            if (!fromDestructor)
            {
                GC.SuppressFinalize(this);
            }
        }
예제 #4
0
        private bool OpenUsbCan()
        {
            if (ZLGBasic.VCI_OpenDevice(m_DevType, m_DevIndex, 0) != ZLGBasic.STATUS_ERR)
            {
                VCI_INIT_CONFIG Cfg = new VCI_INIT_CONFIG();

                Cfg.AccCode = 0x00000000; //验收码
                Cfg.AccMask = 0xFFFFFFFF; //验收屏蔽码
                Cfg.Filter  = 1;          //滤波方式 1: 单滤波 0: 双滤波
                Cfg.Mode    = 0;          //0:正常模式 1:只听模式
                Cfg.Timing0 = 0x00;       //通讯速率  1Mbps
                Cfg.Timing1 = 0x14;

                //判断CAN是否能初始化
                if (ZLGBasic.VCI_InitCAN(m_DevType, m_DevIndex, m_CanIndex, ref Cfg) == ZLGBasic.STATUS_OK)
                {
                    ZLGBasic.VCI_ClearBuffer(m_DevType, m_DevIndex, m_CanIndex);

                    return(ZLGBasic.VCI_StartCAN(m_DevType, m_DevIndex, m_CanIndex) == ZLGBasic.STATUS_OK);
                }
            }

            return(false);
        }