Exemplo n.º 1
0
        void serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            byte c;

            while (serial.BytesToRead > 0)
            {
                bool acceptByte = false;

                c = (byte)serial.ReadByte();

                switch (serialState)
                {
                    case SerialReceiverState.USART_RECEIVER_IDLE_RX_STATE:
                        if (APP_MAGIC_SYMBOL == c)
                        {
                            serialState = SerialReceiverState.USART_RECEIVER_SOF_RX_STATE;
                            currentMessage.Clear();
                            CheckSum = 0;
                        }
                        break;

                    case SerialReceiverState.USART_RECEIVER_SOF_RX_STATE:
                        if (SOF[1] == c)
                        {
                            serialState = SerialReceiverState.USART_RECEIVER_DATA_RX_STATE;
                        }
                        else
                        {
                            serialState = SerialReceiverState.USART_RECEIVER_IDLE_RX_STATE;
                        }
                        break;

                    case SerialReceiverState.USART_RECEIVER_DATA_RX_STATE:
                        if (APP_MAGIC_SYMBOL == c)
                        {
                            serialState = SerialReceiverState.USART_RECEIVER_MAGIC_RX_STATE;
                        }
                        else
                        {
                            acceptByte = true;
                        }
                        break;

                    case SerialReceiverState.USART_RECEIVER_MAGIC_RX_STATE:
                        if (APP_MAGIC_SYMBOL == c)
                        {
                            serialState = SerialReceiverState.USART_RECEIVER_DATA_RX_STATE;
                            acceptByte = true;
                        }
                        else if (EOF[1] == c)
                        {
                            serialState = SerialReceiverState.USART_RECEIVER_EOF_RX_STATE;
                        }
                        else
                        {
                            serialState = SerialReceiverState.USART_RECEIVER_IDLE_RX_STATE;
                            PrintMessage("TRAMA DEFECTUOSA");
                        }
                        break;

                    case SerialReceiverState.USART_RECEIVER_EOF_RX_STATE:
                        if (CheckSum == c)
                        {
                            serialState = SerialReceiverState.USART_RECEIVER_IDLE_RX_STATE;
                            InputMessage inputMessage = new InputMessage();
                            inputMessage.FromBinary(currentMessage.ToArray());

                            if (inputMessage.Content.Args != null)
                                OnOperationReceived(inputMessage);
                        }
                        else
                        {
                            serialState = SerialReceiverState.USART_RECEIVER_IDLE_RX_STATE;
                            PrintMessage("CHECKSUM INCORRECTO");
                        }
                        break;

                    default:
                        break;
                }

                CheckSum += c;

                if (acceptByte)
                {
                    currentMessage.Add(c);
                }
            }
        }
Exemplo n.º 2
0
        void serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            byte c;

            while (serial.BytesToRead > 0)
            {
                bool acceptByte = false;

                c = (byte)serial.ReadByte();

                switch (serialState)
                {
                case SerialReceiverState.USART_RECEIVER_IDLE_RX_STATE:
                    if (APP_MAGIC_SYMBOL == c)
                    {
                        serialState = SerialReceiverState.USART_RECEIVER_SOF_RX_STATE;
                        currentMessage.Clear();
                        CheckSum = 0;
                    }
                    break;

                case SerialReceiverState.USART_RECEIVER_SOF_RX_STATE:
                    if (SOF[1] == c)
                    {
                        serialState = SerialReceiverState.USART_RECEIVER_DATA_RX_STATE;
                    }
                    else
                    {
                        serialState = SerialReceiverState.USART_RECEIVER_IDLE_RX_STATE;
                    }
                    break;

                case SerialReceiverState.USART_RECEIVER_DATA_RX_STATE:
                    if (APP_MAGIC_SYMBOL == c)
                    {
                        serialState = SerialReceiverState.USART_RECEIVER_MAGIC_RX_STATE;
                    }
                    else
                    {
                        acceptByte = true;
                    }
                    break;

                case SerialReceiverState.USART_RECEIVER_MAGIC_RX_STATE:
                    if (APP_MAGIC_SYMBOL == c)
                    {
                        serialState = SerialReceiverState.USART_RECEIVER_DATA_RX_STATE;
                        acceptByte  = true;
                    }
                    else if (EOF[1] == c)
                    {
                        serialState = SerialReceiverState.USART_RECEIVER_EOF_RX_STATE;
                    }
                    else
                    {
                        serialState = SerialReceiverState.USART_RECEIVER_IDLE_RX_STATE;
                        PrintMessage("TRAMA DEFECTUOSA");
                    }
                    break;

                case SerialReceiverState.USART_RECEIVER_EOF_RX_STATE:
                    if (CheckSum == c)
                    {
                        serialState = SerialReceiverState.USART_RECEIVER_IDLE_RX_STATE;
                        InputMessage inputMessage = new InputMessage();
                        inputMessage.FromBinary(currentMessage.ToArray());

                        if (inputMessage.Content.Args != null)
                        {
                            OnOperationReceived(inputMessage);
                        }
                    }
                    else
                    {
                        serialState = SerialReceiverState.USART_RECEIVER_IDLE_RX_STATE;
                        PrintMessage("CHECKSUM INCORRECTO");
                    }
                    break;

                default:
                    break;
                }

                CheckSum += c;

                if (acceptByte)
                {
                    currentMessage.Add(c);
                }
            }
        }