/// <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); } }
public void CloseCANDevice() { try { _mConnected = false; Thread.Sleep(300); //等待接收线程退出 CANApi.VCI_CloseDevice(_mDeviceType, _canSetting.DeviceIndex); } catch (Exception e) { LogHelper.WriteInfoLog("接收线程退出\n" + e.Message); } }
/// <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); } }
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> 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); } }
/// <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); } }