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)); }
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"); } } }
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"); }