//串口数据接收状态机 private void RecvPacketStateMachine(byte RecvByte) { switch (CurrentRecvState) { case RECVPACKSTATE.IdleState: //空闲态 if (RecvByte == (byte)0x5A) { CurrentRecvState = RECVPACKSTATE.StartFieldState; } else { CurrentRecvState = RECVPACKSTATE.IdleState; } break; case RECVPACKSTATE.StartFieldState: //接收起始符 if (RecvByte == (byte)0xA5) { CurrentRecvState = RECVPACKSTATE.DataPacketState; DataCnt = 0; } else { CurrentRecvState = RECVPACKSTATE.IdleState; } break; case RECVPACKSTATE.DataPacketState: //接收数据 if (DataCnt < 19) { RecvDataField[DataCnt] = RecvByte; DataCnt++; CurrentRecvState = RECVPACKSTATE.DataPacketState; } else { RecvDataField[DataCnt] = RecvByte; //若校验通过, 则解析数据 if (AppUtil.GetChecksum(RecvDataField, 0, 19) == RecvDataField[19]) { byte DIRECT = (byte)(RecvDataField[0] >> 4); //指令方向, 先过滤一些数据 if (DIRECT == 0x02 || DIRECT == 0x04 || DIRECT == 0x08) //2:(终端-主机), 4:(中继-主机), 8:(非本组设备之间的通信) { SerialRecvMsg recvMsg = new SerialRecvMsg(); Array.Copy(RecvDataField, 0, recvMsg.PacketData.DataBytes, 2, RecvDataField.Length); recvMsg.PacketData.updateDataBytesToField(); //将接收到的字节更新到数据包的各个字段(如dir, path, cmd等) PacketHandler(recvMsg); } } CurrentRecvState = RECVPACKSTATE.IdleState; } break; default: CurrentRecvState = RECVPACKSTATE.IdleState; break; } }
private void RecvPacketStateMachine(byte[] RecvBytes, int length) { byte RecvByte; for (int i = 0; i < length; i++) { RecvByte = RecvBytes[i]; switch (CurrentRecvState) { case RECVPACKSTATE.IdleState: if (RecvByte == (byte)0x5A) { CurrentRecvState = RECVPACKSTATE.StartFieldState; } else { CurrentRecvState = RECVPACKSTATE.IdleState; } break; case RECVPACKSTATE.StartFieldState: if (RecvByte == (byte)0xA5) { CurrentRecvState = RECVPACKSTATE.TypeFieldState; } else { CurrentRecvState = RECVPACKSTATE.IdleState; } break; case RECVPACKSTATE.TypeFieldState: NetPacketRecv.PacketType = RecvByte; NetPacketRecv.DataLength = 0; CurrentRecvState = RECVPACKSTATE.LengthFieldState; break; case RECVPACKSTATE.LengthFieldState: if (NetPacketRecv.DataLength < 1) { NetPacketRecv.DataLength_HighByte = RecvByte; NetPacketRecv.DataLength++; CurrentRecvState = RECVPACKSTATE.LengthFieldState; } else { NetPacketRecv.DataLength_LowByte = RecvByte; NetPacketRecv.DataLength = (int)(((int)NetPacketRecv.DataLength_HighByte) << 8) + (int)RecvByte; NetPacketRecv.datafield = new byte[NetPacketRecv.DataLength]; DataCnt = 0; CurrentRecvState = RECVPACKSTATE.DataPacketState; } break; case RECVPACKSTATE.DataPacketState: NetPacketRecv.datafield[DataCnt] = RecvByte; DataCnt++; if (DataCnt < NetPacketRecv.DataLength) { CurrentRecvState = RECVPACKSTATE.DataPacketState; } else { CurrentRecvState = RECVPACKSTATE.CheckFieldState; } break; case RECVPACKSTATE.CheckFieldState: if (AppUtil.GetChecksum(new byte[4] { NetPacketRecv.PacketType, NetPacketRecv.DataLength_HighByte, NetPacketRecv.DataLength_LowByte, AppUtil.GetChecksum(NetPacketRecv.datafield, 0, NetPacketRecv.DataLength) }, 0, 4) == RecvByte) { PacketParse(NetPacketRecv); //接收到了一个完整的数据包, 然后对数据包进行解码 } CurrentRecvState = RECVPACKSTATE.IdleState; break; default: CurrentRecvState = RECVPACKSTATE.IdleState; break; } } }