예제 #1
0
파일: CANhelper.cs 프로젝트: zhaolion/CAN
 /// <summary>
 /// 启动CAN设备
 /// </summary>
 public void StartCAN()
 {
     try
     {
         if (!_mConnected)
         {
             return;
         }
         if (CANApi.VCI_StartCAN(
                 _mDeviceType, _canSetting.DeviceIndex,
                 _canSetting.CanIndex) != CANApi.STATUS_OK)
         {
             throw new CANexception("启动CAN失败");
         }
         //_ReceviedList.Clear();
         //启动接收线程
         _CanReceviedThread = new Thread(new ThreadStart(ReceiveDataProc));
         _CanReceviedThread.IsBackground = true;
         _CanReceviedThread.Start();
     }
     catch (Exception e)
     {
         LogHelper.WriteErrorLog(e.Message);
         MessageBox.Show(e.Message);
     }
 }
예제 #2
0
파일: CANhelper.cs 프로젝트: zhaolion/CAN
 public void CloseCANDevice()
 {
     try
     {
         _mConnected = false;
         Thread.Sleep(300); //等待接收线程退出
         CANApi.VCI_CloseDevice(_mDeviceType, _canSetting.DeviceIndex);
     }
     catch (Exception e)
     {
         LogHelper.WriteInfoLog("接收线程退出\n" + e.Message);
     }
 }
예제 #3
0
파일: CANhelper.cs 프로젝트: zhaolion/CAN
        /// <summary>
        /// 连接CAN设备
        /// </summary>
        public void ConnectCANDevice()
        {
            try
            {
                if (_mConnected)
                {
                    return;
                }
                if (!_mConnected)
                {
                    //open device
                    _openCode = CANApi.VCI_OpenDevice(_mDeviceType, _canSetting.DeviceIndex, 0);
                    if (_openCode != CANApi.STATUS_OK)
                    {
                        throw new CANexception("打开设备失败,VCI_OpenDevice 返回值:" + _openCode);
                    }
                    //init device
                    _CanConfig = _canSetting.GetConfig();
                    _initCode  = CANApi.VCI_InitCAN(
                        _mDeviceType,
                        _canSetting.DeviceIndex,
                        _canSetting.CanIndex,
                        ref _CanConfig);
                    if (_initCode != CANApi.STATUS_OK)
                    {
                        LogHelper.WriteErrorLog("初始化CAN失败,VCI_InitCAN 返回值:" + _initCode);
                        CANApi.VCI_CloseDevice(_mDeviceType, _canSetting.DeviceIndex);
                    }

                    if (_openCode == CANApi.STATUS_OK && _initCode == CANApi.STATUS_OK)
                    {
                        _mConnected = true;
                    }
                }
            }
            catch (CANexception e)
            {
                LogHelper.WriteErrorLog(e.Message);
                MessageBox.Show(e.Message);
            }
        }
예제 #4
0
파일: CANhelper.cs 프로젝트: zhaolion/CAN
 public bool SendData(string frameID, string timeStamp,
                      int frameFormat, int frameType, string frameData,
                      int frameSendType)
 {
     if (!_mConnected)
     {
         return(false);
     }
     CANApi.VCI_CAN_OBJ[] frameInfo = new CANApi.VCI_CAN_OBJ[1];
     frameInfo = _frameWrapper.Wrapper(frameID, timeStamp, frameFormat,
                                       frameType, frameData, frameSendType);
     if (
         CANApi.VCI_Transmit(_mDeviceType, _canSetting.DeviceIndex
                             , _canSetting.CanIndex, ref frameInfo[0], 1) == CANApi.STATUS_OK)
     {
         return(true);
     }
     else
     {
         return(false);
     }
 }
예제 #5
0
파일: CANhelper.cs 프로젝트: zhaolion/CAN
 /// <summary>
 /// 复位CAN设备
 /// </summary>
 public void ResetCANDevice()
 {
     try
     {
         if (!_mConnected)
         {
             return;
         }
         if (CANApi.VCI_ResetCAN(_mDeviceType, _canSetting.DeviceIndex,
                                 _canSetting.CanIndex) == CANApi.STATUS_OK)
         {
             return;
         }
         else
         {
             throw new CANexception("复位CAN失败");
         }
     }
     catch (CANexception e)
     {
         LogHelper.WriteErrorLog(e.Message);
         MessageBox.Show(e.Message);
     }
 }
예제 #6
0
파일: CANhelper.cs 프로젝트: zhaolion/CAN
        /// <summary>
        ///  接收数据处理函数
        /// </summary>
        void ReceiveDataProc()
        {
            try
            {
                //接收到数据长度
                int _receivedLen = 0;
                //CAN ERR INFO
                CANApi.VCI_ERR_INFO _CanErrInfo = new CANApi.VCI_ERR_INFO();
                _CanErrInfo.Passive_ErrData = new byte[3];
                //CAN Frames
                CANApi.VCI_CAN_OBJ[] _CanRawFrames = new CANApi.VCI_CAN_OBJ[50];
                while (true)
                {
                    Thread.Sleep(10);
                    if (!_mConnected)
                    {
                        break;
                    }
                    _receivedLen = 0;
                    _receivedLen = (int)CANApi.VCI_Receive(
                        _mDeviceType, _DeviceIndex,
                        _CanIndex,
                        ref _CanRawFrames[0], 50, 200);
                    if (_receivedLen <= 0)
                    {
                        //注意:如果没有读到数据则必须调用此函数来读取出当前的错误码,
                        //千万不能省略这一步(即使你可能不想知道错误码是什么)
                        CANApi.VCI_ReadErrInfo(
                            _mDeviceType, _DeviceIndex,
                            _CanIndex, ref _CanErrInfo);
                    }
                    else
                    {
                        for (int i = 0; i < _receivedLen; i++)
                        {
                            if (i > _CanRawFrames.Length)
                            {
                                break;
                            }
                            _CanRawFrame = _CanRawFrames[i];
                            //ID
                            _frameID = string.Format("{0:X8}", _CanRawFrame.ID);
                            //timestamp
                            if (_CanRawFrame.TimeFlag == 0)
                            {
                                _timestamp = "无";
                            }
                            else
                            {
                                _timestamp = string.Format("{0:X}", _CanRawFrame.TimeStamp);
                            }
                            //FrameFormat
                            if (_CanRawFrame.RemoteFlag == 0)
                            {
                                _frameFormat = "数据帧";
                            }
                            else
                            {
                                _frameFormat = "远程帧";
                            }
                            //FrameType
                            if (_CanRawFrame.ExternFlag == 0)
                            {
                                _frameType = "标准帧";
                            }
                            else
                            {
                                _frameType = "扩展帧";
                            }
                            //Data
                            _stringBuilder.Clear();
                            for (int j = 0; j < _CanRawFrame.DataLen; j++)
                            {
                                if (_CanRawFrame.Data.Length <= j)
                                {
                                    break;
                                }
                                _stringBuilder.AppendFormat("{0:X2}", _CanRawFrame.Data[j]);
                            }
                            _frameData = _stringBuilder.ToString();

                            _ReceviedList.Add(new FrameInfo(_frameID, _timestamp, _frameFormat, _frameType, _frameData));
                        }
                    }
                }
            }
            catch (Exception e)
            {
                LogHelper.WriteErrorLog("CANhelper.ReceiveDataProc." + e.Message);
            }
        }