IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Embarqué Discussion :

Ecrire une valeur ADC sur UART


Sujet :

Embarqué

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 171
    Points : 55
    Points
    55
    Par défaut Ecrire une valeur ADC sur UART
    Bonjour, j'ai un programme qui me permet de lire la valeur de temperature recuperee grace a un capteur et un peu de code pour gerer l'adc et je veux ecrire cette valeur sur un port COM du PC en utilisant Uart.

    J'ai deja reussi a le faire fonctionner grace aux exemples de ST mais le probleme c'est que les valeurs s'entassent dans le buffer et s'ecrivent a la suite les unes des autres et moi (image 1) j'aimerais que chaque valeur de temperature corresponde a une ligne envoyee sur l'UART.

    Ici on voit bien que les valeurs s'ecrivent toutes a la suite:
    Nom : uart.jpg
Affichages : 793
Taille : 224,1 Ko

    Donc pour remedier a ca j'ai laisse tombe les fichiers fourni par ST et j'ai repris un programme ecrit par un de mes profs (pour STM32F1 alors que moi je suis sur STM32L1).

    Avant de regler mon probleme initial du buffer j'essaye deja d'obtenir au moins le meme resultat que sur mon code precedent.

    Donc la j'essaye simplement d'ecrire la valeur des valeurs de temperatures les unes a la suite des autres.

    Le probleme c'est que je ne peux plus lire la valeur avec l'adc comme je le faisais avec l'autre programme et je ne comprends pas pourquoi.

    Dans mon premier programme, la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ret=HAL_ADC_GetValue(&hadc);
    me retournait une certaines valeur, et maintenant elle me retourne 0 a chaque fois.

    Est ce qu'il y a un conflit entre l'uart et l'adc?

  2. #2
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 171
    Points : 55
    Points
    55
    Par défaut
    Bonjour, j'ai resolu mon probleme, la fonction qui me retourne la temperature n'etait pas appelee dans la bonne boucle...

    Maintenant j'ai quelque chose de la forme suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    while (1)
      {
    	          temp1=adc1();
                      temp2=adc2();
    		  printf("Temp 1= %f ",temp1); //PA1
    		  printf(" Temp 2= %f ",temp2); //PA0
    		  printf(" Diff = %f\n",fabs(temp1-temp2)); //Valeur absolue de la difference entre les deux capteurs
    	  	
    	         HAL_Delay(1000);
    }
    Qui me renvoie les valeurs comme cela:

    Nom : tempsensor1et2.jpg
Affichages : 748
Taille : 282,3 Ko

    Cependant comme je l'ai explique plus haut, j'aimerais que mes valeurs s'ecrivent dans l'uart une par une et non pas toutes a la suite. J'ai donc cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    //Initialisation de l'UART à la vitesse de 115200 bauds/secondes (92kbits/s) PB6 : Tx  | PB7 : Rx.
      UART_init(UART1_ID,9600);
      UART_init(UART2_ID,115200);
    
      //"Indique que les printf sortent vers le périphérique UART1."
      SYS_set_std_usart(UART2_ID, UART2_ID, UART2_ID);
    
      while (1)
      {
    	 if(UART_data_ready(UART2_ID))
    	 {
    		  temp1=adc1();
    		  temp2=adc2();
    		  printf("Temp 1= %f ",temp1); //PA1
    		  printf(" Temp 2= %f ",temp2); //PA0
    		  printf(" Diff = %f\n",fabs(temp1-temp2)); //Valeur absolue de la difference entre les deux capteurs
    	 }
    	 HAL_Delay(1000);
    
    }
    Avec la fonction UART_data_ready qui a ete ecrite par quelqu'un d'autre et que je ne comprends visiblement pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    bool_e UART_data_ready(uart_id_e uart_id)
    {
    	assert(uart_id < UART_ID_NB);
    	return buffer_rx_data_ready[uart_id];
    }
    Avec ce code, la fonction est bloquee a la ligne de if, il ne passe jamais a l'interieur et je ne comprends pas pourquoi, merci pour votre aide

  3. #3
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 267
    Points : 4 829
    Points
    4 829
    Par défaut
    Bonjour

    Un terminal a un comportement bien défini, il affiche à l'écran ce qui est reçu sur le port série, et à chaque envoi de \n il passe à une nouvelle ligne.
    Tu peux tenter d'envoyer un \r pour revenir en début de ligne et écrire par dessus, mais je ne comprends pas bien ta question et si c'est ce que tu veux réaliser. Et vu la philosophie du terminal que tu utilises, il est fort possible que le carrier return soit traité également comme une commande de nouvelle ligne.

    Par contre il est en général pas prévu de pouvoir revenir sur les lignes précédentes. Donc afficher un tableau de mesures sur plusieurs lignes et venir y modifier les valeurs n'est pas possible avec un terminal. Il te faut à ce moment développer également le logiciel PC qui interprétera les données arrivant du port série et gérera un affichage. Un terminal est un logiciel de débogage des transmissions, il n'est pas prévu pour un affichage avancé.

    Je n'y connais rien aux STM32, mais au vu du nom de la fonction appelée dans UART_data_ready();, elle renvoie vrai quand il y a une donnée valide dans le buffer de réception, qui d'après ce que tu indiques reste vide. La fonction qui pourrait exister et faire sens dans ce contexte devrait avoir un nom comme tx_ready indiquant que la partie émission de l'UART dispose des capacités à envoyer un octet supplémentaire.

    Delias

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 171
    Points : 55
    Points
    55
    Par défaut
    Salut, merci pour ta reponse!

    Je me suis mal exprime, je vais essayer de reformuler:

    Actuellement j'obtiens mes resultats sous cette forme:

    Nom : tempsensor1et2.jpg
Affichages : 710
Taille : 282,3 Ko

    Or moi je souhaiterais que l'uart s'arrete apres chaque ligne et se relance des qu'il y a quelque chose a envoyer.

    Sur Docklight ca donnerait quelque chose coomme ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    17/05 14:05:03 [RX] - Temp 1 = 23.1 Temp 2 = 24<LF>
    17/05 14:05:04 [RX] - Temp 1 = 23 .3Temp 2 = 23.9<LF>
    17/05 14:05:05 [RX] - Temp 1 = 23.2 Temp 2 = 24.1<LF>
    17/05 14:05:06 [RX] - Temp 1 = 23.5 Temp 2 = 24.3<LF>
    17/05 14:05:07 [RX] - Temp 1 = 23.4 Temp 2 = 24.1<LF>
    J'en mets un peu plus sur la fonction UART_data_ready:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    bool_e UART_data_ready(uart_id_e uart_id)
    {
    	assert(uart_id < UART_ID_NB);
    	return buffer_rx_data_ready[uart_id];
    }
    Dans l'initialisation de l'uart, le buffer est a false:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    buffer_rx_data_ready[uart_id] = FALSE;
    Le seul moment ou il passe a True c'est dans cette fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    {
    	uint8_t uart_id;
    	if(huart->Instance == USART1)		uart_id = UART1_ID;
    	else if(huart->Instance == USART2)	uart_id = UART2_ID;
    	else if(huart->Instance == USART3)	uart_id = UART3_ID;
    	else return;
    
    	buffer_rx_data_ready[uart_id] = TRUE;	//Le buffer n'est pas (ou plus) vide.
    	buffer_rx_write_index[uart_id] = (buffer_rx_write_index[uart_id] + 1) % BUFFER_RX_SIZE;						//Déplacement pointeur en écriture
    	HAL_UART_Receive_IT(&UART_HandleStructure[uart_id],&buffer_rx[uart_id][buffer_rx_write_index[uart_id]],1);	//Réactivation de la réception d'un caractère
    }
    Mais je ne vois toujours pas comment utiliser toutes ces fonctions pour avoir le comportement que j'ai decris plus haut :/

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 267
    Points : 4 829
    Points
    4 829
    Par défaut
    Bonjour

    Alors détermine simplement quel est la condition pour envoyer, pour l'instant avec tes explications je ne vois pas.
    des qu'il y a quelque chose a envoyer.
    Dès qu'il y a quoi à envoyer?

    En vision simpliste il y a quelque chose à envoyer chaque fois que l'ADC a fini sa conversion et c'est très rapide, beaucoup plus que actuellement car:
    Pour l'instant avec le premier code tu fais un envoi tout les 1000 unités de temps de la fonction HAL_Delay(); (l'unité étant les ms, les µs ???) + la durée de traitement du code d'envoi.

    l'UART c'est toujours deux modules généralement indépendants (à l'exception des configurations). Il y a un système d'envoi généralement désigné TX et un système de réception dénommé RX.
    Dans le cadre d'une transmission STM -> PC on va utilisé le TX du STM et le RX du PC. En voulant baser ta condition d'envoi sur le buffer de réception du STM, tu bloques tant que le STM n'a pas reçu un octet depuis le PC. Et une fois qu'il aura reçu vu que tu ne le lis pas l'envoi sera à nouveau en continu.

    Bonne suite

    Delias

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 171
    Points : 55
    Points
    55
    Par défaut
    Ok je pense que je vois ce que tu veux dire. La fonction delay est de 1s (1000ms).

    Donc pour le moment cette fonction m'est inutile, mais je prevois d'implementer un module GPS. Le Tx sera donc le GPS et le Rx sera la STM, dans ce cas la, la fonction devrait donc etre efficace ?

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/09/2015, 11h54
  2. Réponses: 9
    Dernier message: 05/07/2011, 16h12
  3. Ecrire une requette SQL sur Access
    Par Nadaa dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 18/05/2006, 14h32
  4. [VB6] Ecrire une requete SQL sur plusieurs lignes!
    Par big x dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 08/05/2006, 16h28
  5. Ecrire une requete SQL sur plusieurs lignes
    Par PrinceMaster77 dans le forum ASP
    Réponses: 2
    Dernier message: 15/11/2004, 14h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo