/// <summary> /// 内部公开方法 /// </summary> /// <param name="msgIn"></param> protected virtual void OnMsgRecieved(CommunicationProtocol.DataPacket msgIn) { if (MsgRecieved != null) { MsgRecieved(this, new MsgEventArgs() { msg = msgIn }); } }
/// <summary> /// 接收数据译码函数 /// </summary> public void GetPortData() { //test function to display any log information from Serial Ports List <byte> buffer = new List <byte>(); //this gives easy access to handy functions in order to process buffer Queue <byte> FIFO_Buffer = new Queue <byte>(); //create FIFO type bufffer CommunicationProtocol.DataPacket packet = new CommunicationProtocol.DataPacket(); packet.dataReady = false; DecodeState currentDecodeState = DecodeState.SearchForHeader1; bool ThreadRunning = true; while (controlPort.IsOpen && ThreadRunning) { try { int data = controlPort.ReadByte(); if (data != -1) { FIFO_Buffer.Enqueue((byte)data); } ProcessData(ref FIFO_Buffer, ref currentDecodeState, ref packet); if (packet.dataReady) { //raise event if (MsgRecieved != null) { MsgRecieved(this, new MsgEventArgs() { msg = packet }); //raise event } packet = new CommunicationProtocol.DataPacket(); packet.dataReady = false; } } catch (Exception ex) { Console.WriteLine(ex.ToString()); ThreadRunning = false; } } }
/// <summary> /// 接收数据包格式处理 /// </summary> /// <param name="dataStream"></param> /// <param name="state"></param> /// <param name="packet"></param> public void ProcessData(ref Queue <byte> dataStream, ref DecodeState state, ref CommunicationProtocol.DataPacket packet) { //Todo Process fifo data stream from headtracking port bool stopSerching = false; while (dataStream.Count > 0 && stopSerching == false) { switch (state) { case DecodeState.SearchForHeader1: if (dataStream.Count > 0) { byte data = dataStream.Dequeue(); if (data == 0xeb) { state = DecodeState.SearchForHeader2; } } break; case DecodeState.SearchForHeader2: if (dataStream.Count > 0) { byte data = dataStream.Dequeue(); if (data == 0x90) { state = DecodeState.SearchForCmdType; } } break; case DecodeState.SearchForCmdType: if (dataStream.Count > 0) { byte data = dataStream.Dequeue(); packet.cmdType = (CommunicationProtocol.CMDTYPE)data; state = DecodeState.SearchForLen; } break; case DecodeState.SearchForLen: if (dataStream.Count > 0) { byte data = dataStream.Dequeue(); packet.len = data; state = DecodeState.GetContent; } break; case DecodeState.GetContent: if (dataStream.Count >= packet.len) { packet.payload = new byte[packet.len]; for (int i = 0; i < packet.len; i++) { packet.payload[i] = dataStream.Dequeue(); } state = DecodeState.CheckEnder; } else { stopSerching = true; } break; case DecodeState.CheckEnder: if (dataStream.Count > 0) { byte data = dataStream.Dequeue(); if (data == 0xfe) { packet.dataReady = true; state = DecodeState.SearchForHeader1; stopSerching = true; } else { packet = new CommunicationProtocol.DataPacket(); state = DecodeState.SearchForHeader1; stopSerching = true; } } break; } } }