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); } }
/// <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; } }
/// <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); } }
/// <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); } }
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; } }