예제 #1
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);
     }
 }
예제 #2
0
        /// <summary>
        /// 根据输入包装一个CAN帧
        /// </summary>
        /// <param name="frameID"></param>
        /// <param name="timeStamp"></param>
        /// <param name="frameFormat"></param>
        /// <param name="frameType"></param>
        /// <param name="frameData"></param>
        /// <param name="frameSendType"></param>
        /// <returns></returns>
        public CANApi.VCI_CAN_OBJ[] Wrapper(string frameID, string timeStamp,
                                            int frameFormat, int frameType, string frameData,
                                            int frameSendType)
        {
            try
            {
                CANApi.VCI_CAN_OBJ[] frameInfo = new CANApi.VCI_CAN_OBJ[1];
                //数据帧中数据不能为空
                if (frameData.Length == 0 && frameType == 0)
                {
                    LogHelper.WriteErrorLog("帧数据的长度不能为0");
                    return(frameInfo);
                }
                else if (frameID.Length == 0)
                {
                    LogHelper.WriteErrorLog("帧ID的长度不能为0");
                    return(frameInfo);
                }
                else if (frameID.Length > 8)
                {
                    LogHelper.WriteErrorLog("帧ID的值超过范围");
                    return(frameInfo);
                }
                else if (frameData.Length > 24)
                {
                    LogHelper.WriteErrorLog("数据长度超过范围,最大长度8个字节");
                    return(frameInfo);
                }
                else if (frameData.Length % 3 == 1 && frameType == 0)
                {
                    LogHelper.WriteErrorLog("帧数据格式不正确");
                    return(frameInfo);
                }
                else
                {
                    string strData = frameData;

                    string[] ss   = strData.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                    byte[]   data = new byte[8];
                    for (int i = 0; i < 8; i++)
                    {
                        if (ss.Length <= i)
                        {
                            break;
                        }
                        byte b = 0;
                        if (!byte.TryParse(ss[i], System.Globalization.NumberStyles.AllowHexSpecifier,
                                           null, out b))
                        {
                            b = 0;
                        }
                        data[i] = b;
                    }

                    frameInfo[0].DataLen    = (byte)(ss.Length);
                    frameInfo[0].Data       = data;
                    frameInfo[0].Reserved   = new byte[3];
                    frameInfo[0].RemoteFlag = (byte)frameFormat;
                    frameInfo[0].ExternFlag = (byte)frameType;

                    uint canFrameID = 0;
                    if (!uint.TryParse(frameID,
                                       System.Globalization.NumberStyles.AllowHexSpecifier, null, out canFrameID))
                    {
                        canFrameID = 0;
                    }
                    if (frameInfo[0].ExternFlag == 1)
                    {
                        frameInfo[0].ID = canFrameID;
                    }
                    else
                    {
                        frameInfo[0].ID = canFrameID | 0x0000FFFF;
                    }

                    frameInfo[0].SendType = (byte)frameSendType;
                }

                return(frameInfo);
            }
            catch (Exception e)
            {
                LogHelper.WriteErrorLog(e.Message);
                throw e;
            }
        }
예제 #3
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);
            }
        }
예제 #4
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);
            }
        }
예제 #5
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;
     }
 }