コード例 #1
0
 // Start is called before the first frame update
 void Start()
 {
     serialport = this.gameObject.GetComponent <Virtual_SerialPort>();
     Start_Decodage_Task();
 }
コード例 #2
0
 private void Start()
 {
     serialport = this.gameObject.GetComponent <Virtual_SerialPort>();
 }
コード例 #3
0
    /* Reception des octets reçus et transformation en une trame brute */
    public static Communication.Communication_Message ReadTrame(Virtual_SerialPort _SerialPort)
    {
        Communication.Communication_Message received_message = new Communication.Communication_Message();

        byte  API_start = 0, API_LENGTH_HIGH = 0, API_LENGTH_LOW = 0, API_DUMMY, API_FRAME_TYPE = 0;
        short API_LENGTH = 0;
        short crc = 0;
        byte  index = 0, rx_crc = 0;

        //reception de l'heure de la trame
        received_message.Heure = DateTime.Now;

        //Reception En-tête API
        byte boucle = 0;

        while (API_start != 0x7E)
        {
            _SerialPort.ReadRemoveInputByte(out API_start);
            boucle++;
            if (boucle > 5)
            {
                Debug.Log("API_start != 0x7E");
                return(null);
            }
        }

        //Le start byte est recu, on demarre la lecture de la trame
        _SerialPort.ReadRemoveInputByte(out API_LENGTH_HIGH);
        _SerialPort.ReadRemoveInputByte(out API_LENGTH_LOW);

        API_LENGTH   = API_LENGTH_HIGH;
        API_LENGTH <<= 8;
        API_LENGTH  += API_LENGTH_LOW;

        if (API_LENGTH > Communication.COMMUNICATION_TRAME_MAX_DATA + 11)
        {
            Debug.Log("API_LENGTH > Communication.COMMUNICATION_TRAME_MAX_DATA + 11");
            return(null);
        }

        //Packet Type
        _SerialPort.ReadRemoveInputByte(out API_FRAME_TYPE);
        crc += API_FRAME_TYPE;

        if (API_FRAME_TYPE == 0x89)
        {
            //Tx status
            _SerialPort.ReadRemoveInputByte(out API_DUMMY);
            crc += API_DUMMY;

            _SerialPort.ReadRemoveInputByte(out API_DUMMY);
            crc += API_DUMMY;

            if (API_DUMMY == 00)
            {
                //Mess tx succes
                //RxXbeeAck = OK;
            }

            //API CRC
            _SerialPort.ReadRemoveInputByte(out rx_crc);
            return(null);
        }

        boucle = 0;
        while (_SerialPort.Number_Byte_To_Read() < API_LENGTH - 1)
        {
            boucle++;
            if (boucle > 50)
            {
                Debug.Log($"_SerialPort.InputBuffer.Count < API_LENGTH - 1; boucle {_SerialPort.Number_Byte_To_Read()}/{API_LENGTH + 1}");
                return(null);
            }
            Task.Delay(1);
        }

        //Tx Address
        _SerialPort.ReadRemoveInputByte(out API_DUMMY);
        crc += API_DUMMY;

        _SerialPort.ReadRemoveInputByte(out API_DUMMY);
        crc += API_DUMMY;

        //RSSI
        _SerialPort.ReadRemoveInputByte(out API_DUMMY);
        crc += API_DUMMY;

        //Option
        _SerialPort.ReadRemoveInputByte(out API_DUMMY);
        crc += API_DUMMY;

        //Reception datas
        //Instruction
        _SerialPort.ReadRemoveInputByte(out API_DUMMY);
        received_message.Trame.Instruction = (Communication.Com_Instruction)(API_DUMMY);
        crc += (byte)received_message.Trame.Instruction;

        //Slave Address
        _SerialPort.ReadRemoveInputByte(out API_DUMMY);
        received_message.Trame.Slave_Adresse = (Communication.Slave_Adresses)(API_DUMMY);
        crc += (byte)received_message.Trame.Slave_Adresse;

        //Trame length
        received_message.Trame.Length = (byte)(API_LENGTH - 7);

        if (received_message.Trame.Length > Communication.COMMUNICATION_TRAME_MAX_DATA)
        {
            Debug.Log("received_message.Trame.Length > Communication.COMMUNICATION_TRAME_MAX_DATA");
            return(null);
        }


        boucle = 0;
        while (_SerialPort.Number_Byte_To_Read() < received_message.Trame.Length + 1)
        {
            boucle++;
            if (boucle > 50)
            {
                Debug.Log("SerialPort.InputBuffer.Count < received_message.Trame.Length + 1; boucle");
                return(null);
            }
            Task.Delay(1);
        }

        //Reception des data
        for (index = 0; index < received_message.Trame.Length; index++)
        {
            _SerialPort.ReadRemoveInputByte(out received_message.Trame.Data[index]);
            crc += (byte)(received_message.Trame.Data[index]);
        }

        //API CRC
        _SerialPort.ReadRemoveInputByte(out rx_crc);

        //Contrôle CRC
        crc &= 0xFF;
        crc  = (byte)(0xFF - crc);

        //Vérifie le CRC
        if (crc == rx_crc)
        {
            return(received_message);
        }
        else
        {
            if (index == 0)
            {
                Debug.Log($"Error Comm CRC: {crc}/RX crc: {rx_crc}; previous: {(byte)received_message.Trame.Slave_Adresse}, instruction: {received_message.Trame.Instruction}");
            }
            else
            {
                Debug.Log($"Error Comm CRC: {crc}/RX crc: {rx_crc}; previous: {received_message.Trame.Data[index - 1]}, instruction: {received_message.Trame.Instruction}");
            }
            return(null);
        }
    }