Exemplo n.º 1
0
void Serialus::copie_frame_tx()
{
	// Côpie du header
	memcpy(&message_a_envoyer, (char *)&tx_message_header, sizeof(tx_message_header));

	// Copie de la data
	memcpy(&(message_a_envoyer[sizeof(tx_message_header)]), (char *)&tx_message_data, sizeof(tx_message_data));

	// Copie du checksum
	tx_message_checksum = calcul_checksum(message_a_envoyer, sizeof(message_a_envoyer));
	memcpy(&(message_a_envoyer[sizeof(message_a_envoyer) - sizeof(tx_message_checksum)]), (char *)&tx_message_checksum, sizeof(tx_message_checksum));
}
Exemplo n.º 2
0
void traitement_reception_ax12()
{
    while(ax12.offset < ax12.nb_octet_attente)
    {
        ax12.timer++;
        if(ax12.timer > TIME_LIMIT)
        {
            ax12.erreur = TIME_OUT;
            //PutsUART(UART_XBEE, "ERREUR Time Out \r\n");
            break;
        }
    }

    if(ax12.erreur != TIME_OUT)
    {
        ax12.erreur = ax12.buffer[4];

        if(CHECK_LIMITATION_COURANT == ON)
        { //Si on active la limitation de courant dans le configRobot.h
            if((ax12.erreur & (1 << 5)) == 1) //Permet de savoir si l'ax12 entre en limatation de courant. Alors on réinit l'alim
                ax12.erreur = LIMITATION_COURANT;
        }

        uint8_t checksum = calcul_checksum(ax12.buffer[_ID], ax12.buffer[LONGUEUR], ax12.erreur, ax12.buffer[PARAM1], ax12.buffer[PARAM2], ax12.buffer[PARAM3], ax12.buffer[PARAM4], ax12.buffer[PARAM5]);

        ax12.buffer[CHSUM] = ax12.buffer[ax12.offset - 1];

        if(checksum != ax12.buffer[CHSUM])
        {

            ax12.erreur = ERREUR_CS;
            //PutsUART(UART_XBEE, "ERREUR Checksum \r\n");
        }
    }


}
Exemplo n.º 3
0
void commande_AX12(uint8_t ID, uint8_t longueur, uint8_t instruction, uint8_t param1, uint8_t param2, uint8_t param3, uint8_t param4, uint8_t param5)
{
    uint8_t check_sum = calcul_checksum(ID, longueur, instruction, param1, param2, param3, param4, param5);
    uint8_t octets_a_recevoir;
    uint8_t reinit_alim = 0;
    static uint16_t nb1 = 0, nb2 = 0;

    static uint64_t nb3 = 0;

    //Détermnation du nombre d'octects à recevoir
    if(ID == TOUS_LES_AX12) //Pas de paquets renvoyés quand on s'adresse à tous les AX12
        octets_a_recevoir = 0;
    else if(instruction == READ_DATA) //Renvoit un status normal (6 bits) + les donnés demandés
        octets_a_recevoir = 6 + param2;
    else
        octets_a_recevoir = 6; //status standart = 6 octets

    ax12.tentatives = 0;

    do
    {
        reinit_buffer();
        ax12.tentatives++;
        nb3++;

        DIR_UART_AX12 = EMISSION;
        vider_buffer_reception_uart(UART_AX12);

        //Envoit de tous les octets
        PutcUART(UART_AX12, START_BYTE);
        PutcUART(UART_AX12, START_BYTE);
        PutcUART(UART_AX12, ID);
        PutcUART(UART_AX12, longueur);
        PutcUART(UART_AX12, instruction);

        if(longueur > 2)
        {
            PutcUART(UART_AX12, param1);

            if(longueur > 3)
            {
                PutcUART(UART_AX12, param2);

                if(longueur > 4)
                {
                    PutcUART(UART_AX12, param3);

                    if(longueur > 5)
                    {
                        PutcUART(UART_AX12, param4);

                        if(longueur > 6)
                        {
                            PutcUART(UART_AX12, param5);
                        }
                    }
                }
            }
        }

        PutcUART(UART_AX12, check_sum);

        ax12.nb_octet_attente = octets_a_recevoir;
        while(ax12.etat_uart != ENVOIT_FINI);

        if(octets_a_recevoir > 0)
        {
            U2STAbits.OERR = 0;
            vider_buffer_reception_uart(UART_AX12);
            DIR_UART_AX12 = RECEPTION;
            traitement_reception_ax12();
        };

        //delay_us(10);
        //        
        //        if (ax12.erreur == LIMITATION_COURANT)
        //        {
        //            INHIBIT_AX12 = ETEINT;
        //            delay_ms(1000);
        //            ax12.tentatives = 0;
        //            reinit_alim++;
        //            INHIBIT_AX12 = ALLUME;
        //            delay_ms(500);
        //        }


    }
    while(ax12.erreur != PAS_D_ERREUR && ax12.tentatives < MAX_TENTATIVES && reinit_alim < MAX_REINIT_ALIM);


    //    if (ax12.erreur != PAS_D_ERREUR)
    //    {
    //        son_evitement(10);
    //    }

    if(ax12.erreur != PAS_D_ERREUR)
    {
        nb1++;
    }
    else
    {
        nb2++;
    }
    //    PutIntUART(nb1);
    //    PutsUART(UART_XBEE, " ");
    //    PutIntUART(nb2);
    //    PutsUART(UART_XBEE, " ");
    //    PutIntUART(nb3 - (nb1 + nb2));
    //    PutsUART(UART_XBEE, "\r");
}