Esempio n. 1
0
        //串口数据接收状态机
        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;
            }
        }
Esempio n. 2
0
        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;
                }
            }
        }