Esempio n. 1
0
        /// <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 + "设备成功");
        }
Esempio n. 2
0
        /// <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);
                }
            }
        }
Esempio n. 3
0
        /// <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);
        }
Esempio n. 4
0
 /// <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通道");
     }
 }
Esempio n. 5
0
        /// <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 + "设备");
        }