[Programmation] Problème UART envoie/réception chaîne de caractère
Répondre à la discussion
Affichage des résultats 1 à 14 sur 14

Problème UART envoie/réception chaîne de caractère



  1. #1
    invite3edd9fbc

    Problème UART envoie/réception chaîne de caractère


    ------

    Bonjour,

    Je programme une liaison UART pour relier un PIC 24FV16KM204 à un module Bluetooth...
    Le module Bluetooth pour l'initialiser je dois lui envoyer des ligne de commande et attendre ses réponses.

    Etant débutant dans la programmation, je ne sais pas comment m'y prendre.

    je travail sur MPLAB X IDE v4.05
    j'ai initialisé mon UART et j'ai fais des tests sur PUTTY pour voir si je pouvais envoyer un caractère ou en recevoir un....


    Voir mon initialisation:


    Code:
    #include <stdlib.h>
    #include<stdio.h>
    #include"system.h"
    #include"user.h"
    #include"UART.h"
    #include <libpic30.h>
    
    
    
    
    void Init_UART()      //UART 1 (BTM)
    {
        U1MODEbits.UARTEN = 1;      // UARTx Enable bit
    
        U1MODEbits.USIDL = 0;       // UARTx Stop in Idle Mode bit
                                   
        U1MODEbits.IREN = 0;        // IREN: IrDA® Encoder and Decoder Enable bit(1)
    
        U1MODEbits.RTSMD = 0;        // RTSMD: Mode Selection for UxRTS Pin bit
    
        U1MODEbits.UEN = 00;            // UEN<1:0>: UARTx Enable bits(2)
    
        U1MODEbits.WAKE = 0;        // WAKE: Wake-up on Start Bit Detect During Sleep Mode Enable bit
    
        U1MODEbits.LPBACK = 0;      // LPBACK: UARTx Loopback Mode Select bit
    
        U1MODEbits.ABAUD = 0;       // ABAUD: Auto-Baud Enable bit
                                   
        U1MODEbits.URXINV =0 ;      // URXINV: UARTx Receive Polarity Inversion bit
    
        U1MODEbits.BRGH = 0;        // Baud Rate setting
        
        U1MODEbits.PDSEL = 00;      // bit 2-1 PDSEL<1:0>: Parity and Data Selection bits
    
        U1MODEbits.STSEL = 0;       // STSEL: Stop Bit Selection bit
                                 
    
        U1STAbits.UTXISEL1 = 0;     // UTXISEL<1:0>: UARTx Transmission Interrupt Mode Selection bits
        U1STAbits.UTXISEL0 = 0;     // 11 = Reserved; do not use
    
        U1STAbits.UTXINV = 0;       // UTXINV: IrDA® Encoder Transmit Polarity Inversion bit
    
        U1STAbits.UTXBRK = 0;       // UTXBRK: UARTx Transmit Break bit
    
        U1STAbits.UTXEN = 1;        // UTXEN: UARTx Transmit Enable bit
    
        U1STAbits.UTXBF = 1;        // UTXBF: UARTx Transmit Buffer Full Status bit (read-only)
    
        U1STAbits.TRMT = 0;         // TRMT: Transmit Shift Register Empty bit (read-only)
    
        U1STAbits.URXISEL = 00;      // URXISEL<1:0>: UARTx Receive Interrupt Mode Selection bits
    
        U1STAbits.ADDEN = 0;        // ADDEN: Address Character Detect bit (bit 8 of received data = 1)
    
        U1STAbits.RIDLE = 0;        // RIDLE: Receiver Idle bit (read-only)
    
        U1STAbits.PERR = 0;         // PERR: Parity Error Status bit (read-only)
    
        U1STAbits.FERR = 0;         // FERR: Framing Error Status bit (read-only)
    
        U1STAbits.OERR = 0;         // OERR: Receive Buffer Overrun Error Status bit (clear/read-only)
    
        U1STAbits.URXDA = 0;        // URXDA: UARTx Receive Buffer Data Available bit (read-only)
    
        
        U1BRG = 25;                 //BaudRate = 9600
    }
    
    
    void Envoie()
    {                                   
      
        while(1)
        {
         while (U1STAbits.UTXBF == 1);   //tant que le buffer est full on attend
        __delay_ms(1);
           U1TXREG = 'U';
        }
      
    }
    
    
    
    void Reception()
    {
       
        char data;
        while ( U1STAbits.URXDA !=1);	// wait for a new character to arrive
        data = U1RXREG;    
        
        Nop();
        Nop();
        Nop();
        Nop();
       
        U1TXREG = 'A';
    
    }

    Voilà ce qu'il en est de mon code :P
    Ce que je cherche à savoir c'est comment envoyer une chaîne de caractère et suite à ça lui dire d'attendre la réponse qui doit être "ok" et suite à ça envoyer la deuxième instruction et tout....
    Si vous avez des pistes ? Parce que là je galère.


    Déjà ce que j'ai c'est que sur Putty la fonction envoi et reçoi fonctionne :P


    Merci d'avance pour vos pistes

    -----
    Dernière modification par Antoane ; 12/02/2018 à 17h48. Motif: Ajout balises code

  2. #2
    invite5a48ffd1

    Re : Problème UART envoie/réception chaîne de caractère

    Bonjour,

    c'est un miracle parce que sans la fonction main() je ne vois pas comment votre programme peut tourner.

  3. #3
    invite3edd9fbc

    Re : Problème UART envoie/réception chaîne de caractère

    Bonjour,

    Bien évidement j'ai un main ^^

    Mais bon je ne voyais pas l'utilité de le mettre parce que le problème à régler va plus se passer dans le UART.c mais voici le main.c


    Code:
    #if defined(__XC16__)
        #include <xc.h>
    #elif defined(__C30__)
        #if defined(__PIC24E__)
        	#include <p24Exxxx.h>
        #elif defined (__PIC24F__)||defined (__PIC24FK__)
    	#include <p24Fxxxx.h>
        #elif defined(__PIC24H__)
    	#include <p24Hxxxx.h>
        #endif
    #endif
    
    
    #include <stdint.h>        
    #include <stdbool.h>       
    
    #include "system.h"        
    #include "user.h"          
    #include"UART.h"
    
    int16_t main(void)
    {
    
        
        ConfigureOscillator();
        InitApp();
        initport();
        Init_UART ();
    
        while(1)
        {
           //Envoie ();
           Reception();
        }
    }
    Merci
    Dernière modification par Antoane ; 14/02/2018 à 08h28. Motif: Ajout balises code

  4. #4
    invite5a48ffd1

    Re : Problème UART envoie/réception chaîne de caractère

    Il faut se méfier des "évidences" surtout que rien n'indiquait qu'il s'agissait de UART.c dans votre message, ou alors je ne l'ai pas vu.
    Ce qui compte c'est comment les fonctions sont appelées et utilisées.
    Là en l'occurrence il ne va pas se passer grand chose vu que votre fonction ne retourne rien vers quelque chose qui pourrait lire la data reçue...
    J'aurai fait:
    Code:
    char Reception()
    {
       
        char data_reçue;
    
      
        while ( U1STAbits.URXDA !=1);	// tant que data n'est pas disponible dans le buffer de réception.
        data_recue = U1RXREG;    // on stocke le contenu dans data_recue
        
         
     //   U1TXREG = 'A'; // vous verrez plus tard quand vous pourrez déjà envoyer
    
    }
    puis dans le main()

    Code:
    while(1)
    {
    Reception();
    LATC = Reception(); // Vous mettez par exemple 8 leds sur le port C, pour connaitre la valeur de data                              
    }
    Si ça fonctionne on peut passer à la suite, mais tant que ça ne fonctionne pas autant rester dans le simple et enlever tout ce qui ne sert pas.

  5. A voir en vidéo sur Futura
  6. #5
    invite3edd9fbc

    Re : Problème UART envoie/réception chaîne de caractère

    Bonjour, merci de ta réponse

    Je ne visualise pas mes réponses sur le port C avec des leds mais avec le logiciel Putty qui écrit directement ce que je reçois dans son terminal.


    Mon plus gros problème c'est vraiment que là je peux envoyer un seul caractère et je peux en recevoir qu'un mais ce que je voudrais c'est envoyer une chaine de caractère.

    En premier je dois envoyer
    "at&f*" et c'est sencé me répondre "ok" donc je voudrais savoir comment je peux faire pour envoyer une chaine de caractère et analyser la réponse reçue ?

    Merci encore pour vos pistes

  7. #6
    invite5a48ffd1

    Re : Problème UART envoie/réception chaîne de caractère

    Pour répondre à votre problème sans devoir y passer des heures il est nécessaire que vous fassiez une mise à jour progressive et de dire: voilà ce qui fonctionne maintenant et avec quel code.
    Code que vous devez poster, parce que depuis j'ai fait mille choses et je ne peux en plus pas le tester là où je suis.

    Donc postez votre code (celui dont vous dites qu'il envoie un caractère et qu'il reçoit un caractère), l'envoi d'une chaîne est très simple vous verrez.

  8. #7
    invitef86a6203

    Re : Problème UART envoie/réception chaîne de caractère

    Si le module bluetooth est un HC06.
    Elles sont où les commandes AT ?

  9. #8
    invite5a48ffd1

    Re : Problème UART envoie/réception chaîne de caractère

    Je crois que pour le moment il essaie juste de tester son UART

  10. #9
    invitef86a6203

    Re : Problème UART envoie/réception chaîne de caractère

    il faut utiliser les int , et pas des while bloquant.
    C'est du temps réel , si 2 caractères arrivent et qu'on est en attente sur un while l'un des 2 sera perdu.

  11. #10
    invite5a48ffd1

    Re : Problème UART envoie/réception chaîne de caractère

    On ne le dira jamais assez malheureusement...

  12. #11
    invite3edd9fbc

    Re : Problème UART envoie/réception chaîne de caractère

    Oui pour le moment j'essai juste de tester mon UART, j'ai trouvé une piste mais ça ne marche pas et je ne comprends pas pourquoi ^^


    je récapitule je dois envoyer des chaines de caractères et pas une seule lettre.

    UART.c
    Code:
    char tab[7];
    
    void Config_BTM(void)
    {
        //messages d'initialisation
        int m;
        char *message1 = "at&f*\n"; //message_registre
        char *message2 = "ats102=$8\n"; //message_active_headset
        char *message3 = "ats515=$200404\n"; //message_definit_oreillette
        char *message4 = "ats512=4\n"; //message_connectable_permanent
        char *message5 = "at&w\n"; //message_save_setting
        char *message6 = "atz\n"; //message_reset
        char *message7 = "at+btp\n"; //message_visible_connectable
        char *message8 = "at+hsgd501AA5E43709\n"; //message_connection_oreillette
        
        
        /*for (m=0; m<7; m++)
        {*/
            transmission_chaine_char(message1);
            
        //}
    }
    
    
    void transmission_chaine_char(char *Message)
    {
        int i;
        for (i=0;Message[i] != '\0';i++)
        {
            while (U1STAbits.UTXBF == 1){}//while transmit buffer is full
            U1TXREG = Message[i];
        }
    }


    Main.c
    Code:
    int16_t main(void)
    {
    
        /* Configure the oscillator for the device */
        ConfigureOscillator();
    
        /* Initialize IO ports and peripherals */
        InitApp();
    
        /* TODO <INSERT USER APPLICATION CODE HERE> */
        initport();
        Init_UART ();
        
        
         //Reception();
        while(1)
        {
           //transmission_chaine_char();
            Config_BTM();
            //Envoie ();
           //Reception();
               
        }
    }
    ce que j'ai essayé de faire c'est écrire les messages de configuration de mon module BTM (Bluetooth) de les envoyer et la fonction "transmission_chaine_char" lis les caractères un à un pour les transmettre....
    ça ne marche pas apparement ^^

    merci pour vos réponses

  13. #12
    invitef86a6203

    Re : Problème UART envoie/réception chaîne de caractère

    Les commandes AT c est en majuscule, je ne sais pas si ça fonctionne en minuscule...
    Il faudrait déjà tester avec un port usart de PC (5V pas RS232)

    Toujours pas de routine interruption en réception !

    Pour un Pic16F876
    Un truc comme ça ;


    Code:
    ORG 0004
    	movwf	w_temp   	; sauver registre W
    	swapf	STATUS,w	; swap status avec résultat dans w
    	movwf	status_temp	; sauver status swappé
    	movf         FSR , w		; charger FSR
    	movwf	FSR_temp	; sauvegarder FSR
    	movf	        PCLATH, w	; charger PCLATH
    	movwf	PCLATH_temp	; sauvegarder PCLATH
    	clrf	        PCLATH		; passer en Page 0
    	GOTO	_INT_PIC
    
    
    ORG XXXXH ; votre adresse
    _INT_PIC
    			; switch vers différentes interrupts
    			;-----------------------------------
    			; Interruption réception TIMER 0
    			; ----------------------------
    	bnk0
    
    intTMR0
    
    	btfss	INTCON,T0IF
    	GOTO 	intsw0
    ;	============ TIMER 0 ============
           movlw 0xb1 ; 8000 hz (125µs) à 20mhz
    	movwf	TMR0
    	bcf	INTCON,T0IF
    ; lance Adc
          ;      BSF ADCON0,2
          ;      bsf bits3,7 ; ADC (ADRESH) a lire
          ;      bsf PORTB,1
    
    
    ; Interruption réception USART
    ; ----------------------------
    intsw0
    	BANKSEL	PIE1		; sélectionner banque 1
    	btfss	PIE1,RCIE   	; tester si interrupt autorisée
    	GOTO 	intsw1	; non sauter
    	bcf	STATUS,RP0	; oui, sélectionner banque0
    	btfss	PIR1,RCIF	        ; oui, tester si interrupt en cours
    	GOTO 	intsw1	; non sauter
    	call	RX_INT_HANDLER  ; oui, traiter interrupt
    ; on est dans l'int le traitement doit être le plus court possible !!!!
    	bsf	STATUS,RP0	; sélectionner banque1
    ; Fin Interruption transmission USART
    ; -------------------------------
    
    intsw1
    	btfss	PIE1,TXIE	; tester si interrupt autorisée
    	GOTO 	restorereg    ; non sauter
    	bcf	STATUS,RP0	; oui, sélectionner banque0
    	btfsc	PIR1,TXIF	; oui, tester si interrupt en cours
    	call	TX_INT_HANDLER		; oui, traiter interrupt
    ; on est dans l'int le traitement doit être le plus court possible !!!!
    
    ;restaurer registres
    ;-------------------
    restorereg
    	movf	PCLATH_temp, w; charger PCLATH sauvé
    	movwf	PCLATH		; restaurer PCLATH 
    	movf	FSR_temp , w	; charger FSR sauvé
    	movwf	FSR		; restaurer FSR
    	swapf	status_temp,w	; swap ancien status, résultat dans w
    	movwf   STATUS	; restaurer status
    	swapf   w_temp,f	; Inversion L et H de l'ancien W
                           	; sans modifier Z
    	swapf   w_temp,w  	; Réinversion de L et H dans W
    				; W restauré sans modifier status
    	retfie  		; return from interrupt

  14. #13
    invite3edd9fbc

    Re : Problème UART envoie/réception chaîne de caractère

    Alors c'est bon j'ai réglé le problème mes chaines de caractères sont envoyées ...
    les commandes at marchent aussi en minuscule.



    Je reviendrais vers vous pour la réception en cas de problème
    Juste quelqu'un à une idée de pourquoi sur le logiciel ça m'indente mon texte comme ça ?

    Nom : Initialisation BTM().PNG
Affichages : 597
Taille : 6,4 Ko


    Merci

  15. #14
    invitef86a6203

    Re : Problème UART envoie/réception chaîne de caractère

    manque le CR (carriage return) caractère 13 ou 0x0d
    Il reçoit que le 0x0A line feed

Discussions similaires

  1. [Programmation] Envoie et réception de caractère par USB
    Par invite7482d21c dans le forum Électronique
    Réponses: 0
    Dernier message: 06/06/2017, 17h03
  2. [PIC18] Problème de réception uart: Framing Error: FERR
    Par invite42fe2d4f dans le forum Électronique
    Réponses: 15
    Dernier message: 27/08/2012, 23h06
  3. Probleme de chaine de caractere
    Par invitee13c535c dans le forum Électronique
    Réponses: 21
    Dernier message: 17/01/2012, 14h49
  4. Problème réception UART (C8051F310)
    Par invite0282e56d dans le forum Électronique
    Réponses: 0
    Dernier message: 23/02/2010, 11h59
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...