7 - Afficher des infos avec le "Virtual COM port" : Différence entre versions

De Wiki L.A.B
Aller à : navigation, rechercher
(Redirection du "output" de la fonction "C" "printf")
(Afficher un message dans le virtual port COM)
 
(13 révisions intermédiaires par 2 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
 
== 7 - Afficher des infos avec le "Virtual COM port" ==
 
== 7 - Afficher des infos avec le "Virtual COM port" ==
  
Les cartes de développement de ST implémentent un "Virtual COM port". Ainsi les signaux  "RX" et "TX" d'un périphérique UART ou USART (dépendant de la carte utilisé) sont redirigé via le debug port "ST-Link" sur le USB du PC. Ainsi l'utilisateur peut ouvrir un terminal sur ce USB port un "virtual COM port".
+
Le but de cet atelier est de mettre en évidence la communication entre l'ordinateur avec la carte STM32. La carte NUCLEO-L476RG est équipée d'une fonction periphérique USART (Universal Synchronous/Asynchronous Receiver Transmitter), un emetteur-recepteur synchrone et asynchrone universel, qui permet de faire la liaison entre l'ordinateur et le port série.
 +
On qualifie une liaison d'asynchrone lorsque qu'aucune horloge (bit clock) n'est transmise entre l’émetteur et le récepteur. Le récepteur ignore quand il va recevoir une donnée. Contrairement à un UART (Universal Asynchronous Receiver Transmitter), un USART peut travailler en mode "synchrone".
  
Ainsi si le code embarqué envoie des chaînes de caractères sur l'UART, ils vont être affiché dans le terminal.
+
Afin de visualiser les échanges entre la carte et l'ordinateur, nous utiliserons le "Virtual COM port" qui nous permettra de visualiser ce qui se passe au niveau de la carte à travers une fenêtre de terminal.
  
=== Le "Virtual COM port" sur la carte Nucleo ===
 
  
Sur notre carte "NUCLEO-L476RG", le périphérique USART2 est utilisé. Ainsi on va le mettre en service dans le logiciel STM32CubeMX comme déjà vu dans les ateliers précédents. Ainsi le code d'initialisation va être créé automatiquement.
+
== Configuration du périphérique USART dans STM32CubeMX ==
 +
 
 +
- Créer un nouveau projet et configurer l'USART comme défini sur l'image suivante
  
 
<br>
 
<br>
 
[[Fichier:TestUart.PNG|center|]]
 
[[Fichier:TestUart.PNG|center|]]
  
=== Redirection du "output" de la fonction "C" "printf" ===
+
- Dans l'onglet "Configuration", sélectionner une longueur de mot de 8 bits (Word Length : 8 Bits)
  
Pour afficher du texte à l'interieur d'un code "C", la standard librairie propose la fonction "printf" comme "print formaté".
+
[[Fichier:USART ConfigurationWordLength.png|center|]]
 +
 
 +
== Configuration du Virtual COM port ==
 +
 
 +
- Sur un ordinateur Windows, aller dans le gestionnaire de périphérique (Device Manager) pour visualiser le numéro du port (COM4 dans le cas présent)
 +
 
 +
[[Fichier:COM4-DeviceManager.png|center]]
 +
 
 +
 
 +
== Affichage du terminal de la carte STM32 ==
 +
 
 +
- Pour établir la connexion avec la laison série RS-232, nous utiliserons un émulateur de terminal (logiciel libre disponible sous différents OS) : Putty.
 +
- Sélectionner le type de connexion "série" (Connection type : Serial)
 +
- Serial line : COM4 (Cf étape précédente)
 +
- Speed : 9600 ([[à préciser]])
 +
 
 +
[[Fichier:Putty-COM4.png|center]]
 +
 
 +
Note : Pour éviter un soucis de visualisation au niveau du terminal (Cf image suivante, activer l'option du terminal "Implicit CR in every LF" disponible).
 +
 
 +
 
 +
[[Fichier:VisualisationIssue-Putty.png|center]]
 +
 
 +
[[Fichier:Putty-terminalOption.png|center]]
 +
 
 +
 
 +
 
 +
 
 +
=== Afficher un message dans le virtual port COM ===
 +
 
 +
Pour afficher du texte à l'interieur d'un code "C", la librarie standard propose la fonction "printf" comme "print formaté".
 +
 
 +
La fonction prend un premier paramètre de "format". Ceci peut être un texte à afficher lui même ou contenir des balises qui seront remplacées par des valeurs de paramètres lors de l'affichage.
 +
 
 +
''Exemple :
 +
 
 +
La suite d'instructions:
 +
 
 +
  char B = 'A';
 +
  printf("Le caractère %c a le code %i !\n", B, B);
 +
va afficher sur l'écran:
 +
  Le caractère A a le code 65 !
 +
''
  
La fonction prend un premier paramètre de "format". Ceci peut être un texte à afficher lui même ou contenir des balise qui seront remplacé dans le display par des valeurs des paramètres suivantes ou des caractères "échappé" (e.g.: "\n". Exemples:
 
 
   
 
   
* printf(
+
[[Code à expliciter]]
  
  
Ligne 24 : Ligne 67 :
 
int _write(int file, char *ptr, int len)
 
int _write(int file, char *ptr, int len)
 
{
 
{
  HAL_UART_Transmit( &huart2, ( unsigned char* ) ptr, len, 1000 );
+
  if ( HAL_UART_Transmit( &huart2, ( unsigned char* ) ptr, len, 1000 ) != HAL_OK )
 +
  return -1;
 
  return len;
 
  return len;
 
}
 
}
 +
 +
 +
 +
int _read(int file, char *ptr, int len)
 +
{
 +
HAL_StatusTypeDef status;
 +
int retcode = 0;
 +
 +
if (len != 0)
 +
{
 +
  status = HAL_UART_Receive( &huart2, (uint8_t *) ptr, len, HAL_MAX_DELAY);
 +
 +
  if (status == HAL_OK)
 +
  retcode = len;
 +
  else
 +
  retcode = -1;
 +
}
 +
return( retcode);
 +
}
 +
 +
 +
 +
 +
  /* Infinite loop */
 +
  /* USER CODE BEGIN WHILE */
 +
  printf( "Hello world\n" );
 +
 +
  char Text[ 10 ];
 +
  setvbuf(stdin, NULL, _IONBF, 0);
 +
  while (1)
 +
  {
 +
 +
  printf( "Secret Number: \n" );
 +
 +
  int ch, i;
 +
  i = 0;
 +
  while ( i < sizeof( Text ) - 1 )
 +
  {
 +
    ch = getchar();
 +
    printf( "%c", ch );
 +
    if ( ch == '\n' || ch == '\r' )
 +
    break;
 +
    Text[ i++ ] = ch;
 +
  }
 +
  Text[ i ] = 0;
 +
 +
  if ( strcmp( Text, "1234" ) )
 +
    printf( "Bad code\n");
 +
  else
 +
    printf( "Code OK\n");
 +
 +
 +
  /* USER CODE END WHILE */
 +
 +
  /* USER CODE BEGIN 3 */
 +
 +
  }
 +
  /* USER CODE END 3 */
 +
 +
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
=== Afficher dans Eclipse (Windows) un message provenant du Virtual COM PORT ===

Version actuelle en date du 22 mars 2018 à 13:12

7 - Afficher des infos avec le "Virtual COM port"

Le but de cet atelier est de mettre en évidence la communication entre l'ordinateur avec la carte STM32. La carte NUCLEO-L476RG est équipée d'une fonction periphérique USART (Universal Synchronous/Asynchronous Receiver Transmitter), un emetteur-recepteur synchrone et asynchrone universel, qui permet de faire la liaison entre l'ordinateur et le port série. On qualifie une liaison d'asynchrone lorsque qu'aucune horloge (bit clock) n'est transmise entre l’émetteur et le récepteur. Le récepteur ignore quand il va recevoir une donnée. Contrairement à un UART (Universal Asynchronous Receiver Transmitter), un USART peut travailler en mode "synchrone".

Afin de visualiser les échanges entre la carte et l'ordinateur, nous utiliserons le "Virtual COM port" qui nous permettra de visualiser ce qui se passe au niveau de la carte à travers une fenêtre de terminal.


Configuration du périphérique USART dans STM32CubeMX

- Créer un nouveau projet et configurer l'USART comme défini sur l'image suivante


TestUart.PNG

- Dans l'onglet "Configuration", sélectionner une longueur de mot de 8 bits (Word Length : 8 Bits)

USART ConfigurationWordLength.png

Configuration du Virtual COM port

- Sur un ordinateur Windows, aller dans le gestionnaire de périphérique (Device Manager) pour visualiser le numéro du port (COM4 dans le cas présent)

COM4-DeviceManager.png


Affichage du terminal de la carte STM32

- Pour établir la connexion avec la laison série RS-232, nous utiliserons un émulateur de terminal (logiciel libre disponible sous différents OS) : Putty. - Sélectionner le type de connexion "série" (Connection type : Serial) - Serial line : COM4 (Cf étape précédente) - Speed : 9600 (à préciser)

Putty-COM4.png

Note : Pour éviter un soucis de visualisation au niveau du terminal (Cf image suivante, activer l'option du terminal "Implicit CR in every LF" disponible).


VisualisationIssue-Putty.png
Putty-terminalOption.png



Afficher un message dans le virtual port COM

Pour afficher du texte à l'interieur d'un code "C", la librarie standard propose la fonction "printf" comme "print formaté".

La fonction prend un premier paramètre de "format". Ceci peut être un texte à afficher lui même ou contenir des balises qui seront remplacées par des valeurs de paramètres lors de l'affichage.

Exemple :

La suite d'instructions:

  char B = 'A';
  printf("Le caractère %c a le code %i !\n", B, B);

va afficher sur l'écran:

  Le caractère A a le code 65 !


Code à expliciter


int _write(int file, char *ptr, int len)
{
 if ( HAL_UART_Transmit( &huart2, ( unsigned char* ) ptr, len, 1000 ) != HAL_OK )
  return -1;
 return len;
}



int _read(int file, char *ptr, int len)
{
 HAL_StatusTypeDef status;
 int retcode = 0;

 if (len != 0)
 {
  status = HAL_UART_Receive( &huart2, (uint8_t *) ptr, len, HAL_MAX_DELAY);

  if (status == HAL_OK)
   retcode = len;
  else
   retcode = -1;
 }
 return( retcode);
}




  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  printf( "Hello world\n" );

  char Text[ 10 ];
  setvbuf(stdin, NULL, _IONBF, 0);
  while (1)
  {

   printf( "Secret Number: \n" );

   int ch, i;
   i = 0;
   while ( i < sizeof( Text ) - 1 )
   {
    ch = getchar();
    printf( "%c", ch );
    if ( ch == '\n' || ch == '\r' )
     break;
    Text[ i++ ] = ch;
   }
   Text[ i ] = 0;

   if ( strcmp( Text, "1234" ) )
    printf( "Bad code\n");
   else
    printf( "Code OK\n");


  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

Afficher dans Eclipse (Windows) un message provenant du Virtual COM PORT