Communication - PC <=> Arduino - par USB
Résolu
Michel_pc4
Messages postés
5
Date d'inscription
Statut
Membre
Dernière intervention
-
Michel_pc4 Messages postés 5 Date d'inscription Statut Membre Dernière intervention -
Michel_pc4 Messages postés 5 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'ai cherché depuis plusieurs jours du code en langage C pour communiquer avec une carte Arduino UNO smraza. Avec de la patience, j'ai réussis une partie du devis.
En effet, je réussi a envoyer des caractères à la carte par USB. Toutefois, je ne réussis pas à recevoir la réponse de la carte Arduino. Je sais avec certitude que la carte Arduino a reçu la commande par le message qu'elle affiche sur le petit LCD que j'y ai branché. Et du côté de ce microcontrôleur, les commandes pour lire et écrire sur le port USB sont assez simple genre :
Ce n'est qu'a la fin du code, ou il y a le "read" que cela flanche ...
Soyez indulgent, mes connaissances en C sont très limité, j'ai passé les 10 dernières années à développer de l'AOS en VB.NET.
Voici mon code reconstitué tant bien que mal :
Merci de votre attention
Michel
J'ai cherché depuis plusieurs jours du code en langage C pour communiquer avec une carte Arduino UNO smraza. Avec de la patience, j'ai réussis une partie du devis.
En effet, je réussi a envoyer des caractères à la carte par USB. Toutefois, je ne réussis pas à recevoir la réponse de la carte Arduino. Je sais avec certitude que la carte Arduino a reçu la commande par le message qu'elle affiche sur le petit LCD que j'y ai branché. Et du côté de ce microcontrôleur, les commandes pour lire et écrire sur le port USB sont assez simple genre :
Serial.println("toto"); String r; r = Serial.readString;
Ce n'est qu'a la fin du code, ou il y a le "read" que cela flanche ...
Soyez indulgent, mes connaissances en C sont très limité, j'ai passé les 10 dernières années à développer de l'AOS en VB.NET.
Voici mon code reconstitué tant bien que mal :
// Linux Mint 20.1 - Code::Blocks. // // Au début ce n'est qu'un jeu de caractères pour garder le contrôle au clavier // Deux entrées similaires successive et le programme continue, ex. : a a , b b , etc ... // Deux entrées différente successive et le programme arrête, ex. : a b // // Pour donner les droits ajouter l'utilisateur à DIALOUT // sudo adduser $USER dialout // //---------------------------------- // C - Librairie d'entête #include <stdio.h> // Definition des entrés et sorties standard #include <stdlib.h> #include <string.h> // Definition des chaines de caracteres #include <unistd.h> // Definition des fonctions standard de UNIX #include <fcntl.h> // Contient les constantes de contrôle de fichier ex.: O_RDWR #include <errno.h> // Erreur integer Et strerror() function #include <termios.h> // Contient les définitions de contrôle pour le terminal POSIX #define Taille 256 // Variable du port USB int PortUSBUno; struct termios tty, old_tio, new_tio; // Variable de saisie au clavier char strEntree[256]="1"; char strCmd[256]="1"; char strAncCmd[256]="1"; char strReponse[256]="1"; char strSimul[256]="1"; //char * lecteur ; char * lecturelocal; // Variable de lecture au clavier char lecture[Taille]; // Variable tampon d'entrée pour le port USB char * mot; int reslec; // Variable témoin d'entrée pour le port USB int reswrt; // Variable témoin de sortie pour le port USB char x; void setup() { // Obtenir les paramètres du terminal pour stdin tcgetattr(STDIN_FILENO,&old_tio); new_tio = old_tio; // Désactivation du mode canonique (entrées/sorties en mémoire tampon) et de l'écho local. new_tio.c_lflag &=(~ICANON & ~ECHO); tcsetattr(STDIN_FILENO,TCSANOW,&new_tio); // Initialise l'espace mémoire nécessaire au port USB memset (&tty, 0, sizeof tty); // Ouverture du port PortUSBUno = open( "/dev/ttyACM0", O_RDWR| O_NONBLOCK | O_NDELAY ); // Si erreur if ( PortUSBUno < 0 ) { // Affichage de lerreur printf("Erreur %d a louverture du port /dev/ttyACM0.\n", errno); } else { // Afficher un message de continuité printf("Port USB ouvert correctement.\n"); } if ( tcgetattr ( PortUSBUno, &tty ) != 0 ) { printf("Erreur [%d] en provenance de tcgetattr : [%s].\n", errno, strerror(errno)); } else { // Afficher un message de continuité printf("Pas de probleme avec tcgetattr.\n"); } printf("Ligne 67 ispeed = %d; ospeed = %d flags = %o, %o, %o %d %d\n", cfgetispeed(&tty), cfgetospeed(&tty), tty.c_cflag, tty.c_lflag, tty.c_oflag, tty.c_cc[VMIN], tty.c_cc[VTIME]); // Configure les vitesses entrée/sortie //cfsetospeed (&tty, (speed_t)28800); // Configure la vitesse en sortie //cfsetispeed (&tty, (speed_t)28800); // Configure la vitesse en entrée //cfsetospeed (&tty, B9600); // Configure la vitesse en sortie //cfsetispeed (&tty, B9600); // Configure la vitesse en entrée cfsetspeed (&tty, B9600); // Configure la vitesse en entrée printf("Ligne 75 ispeed = %d; ospeed = %d flags = %o, %o, %o %d %d\n", cfgetispeed(&tty), cfgetospeed(&tty), tty.c_cflag, tty.c_lflag, tty.c_oflag, tty.c_cc[VMIN], tty.c_cc[VTIME]); // Réglage d'autres éléments du port tty.c_cflag &= ~PARENB; // Pas de bit de parité tty.c_cflag &= ~CSTOPB; // Seulement besoin 1 stop bit tty.c_cflag &= ~CSIZE; tty.c_cflag |= CS8; // Caractere de 8 bits tty.c_cflag &= ~CRTSCTS; // Pas de contrôle de flux du matériel // Pas de mode canonique tty.c_cflag |= CREAD | CLOCAL; // Activer READ et ignorer les lignes de contrôlel tty.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON); tty.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN); // tty.c_lflag = 0; // Pas de caracteres de signilisation, pas décho, pas de traitement canonique tty.c_oflag &= ~OPOST; // tty.c_oflag = 0; // Pas de remappage, pas de délai // Récupérer les octets dès qu'ils sont disponibles tty.c_cc[VMIN] = 0; // La lecture ne block pas tty.c_cc[VTIME] = 5; // 0.5 seconds de délai de lecture "timeout" // tty.c_iflag &= ~(IXON | IXOFF | IXANY); // Désactiver le contrôle du flux s/w // tty.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // Mise à zéro // tty.c_oflag &= ~OPOST; // Mise à zéro // Réinitialise le port USB et applique les attributs tcflush( PortUSBUno, TCIFLUSH ); // Si erreur if ( tcsetattr ( PortUSBUno, TCSANOW, &tty ) != 0) { printf("Erreur %d de transmission/reception tcsetattr.\n", errno); } else { // Afficher un message de continuité - TC SET ATTRIBUT printf("Pas de probleme avec tcsetattr.\n"); } // Affiche la situation printf("Ligne 107 ispeed = %d; ospeed = %d flags = %o, %o, %o %d %d\n", cfgetispeed(&tty), cfgetospeed(&tty), tty.c_cflag, tty.c_lflag, tty.c_oflag, tty.c_cc[VMIN], tty.c_cc[VTIME]); } int main () { // Initialisation setup(); printf("Initialisation termine.\n"); printf("La commande n-1 est [%s].\n",strAncCmd); printf("La commande en cours est [%s].\n",strCmd); printf("La simulation en cours est [%s].\n",strSimul); printf("\n\n"); while (strcmp(strSimul,strCmd) == 0) { printf("Entrez la commande à recevoir : "); lecturelocal = fgets(strEntree,9,stdin); strncpy(strCmd, strEntree, strlen(strEntree)-1); printf("La commande est : [%s].\n", strCmd); printf("Entrez la réponse attendu : "); lecturelocal = fgets(strEntree,9,stdin); strncpy(strSimul, strEntree, strlen(strEntree)-1); printf("La réponse est [%s].\n", strSimul); if (strcmp(strCmd,strSimul) == 0) { printf("Les deux chaînes sont égales.\n"); lecturelocal = fgets(strEntree,9,stdin); strncpy(strReponse, strEntree, strlen(strEntree)-1); } else { printf("Les deux chaînes ne sont pas égales.\n"); lecturelocal = fgets(strEntree,9,stdin); strncpy(strReponse, strEntree, strlen(strEntree)-1); } if (strcmp(strAncCmd,strCmd) == 0) { printf("Meme commande.\n\n"); printf("La commande n-1 est [%s].\n",strAncCmd); printf("La commande en cours est [%s].\n",strCmd); printf("La simulation en cours est [%s].\n",strSimul); printf("\n"); } else { printf("Commande differente.\n"); printf("La commande n-1 est [%s].\n",strAncCmd); printf("La commande en cours est [%s].\n",strCmd); printf("La simulation en cours est [%s].\n",strSimul); printf("\n"); strcpy(strAncCmd, strCmd); } // Envoie de la commande reswrt = write(PortUSBUno, strCmd, 1); // Afficher message printf("Commande envoyé. En attente ...\n"); // Attente ((Nbr Car + 25) * 100) environ 100 usecondes par caractere usleep((1 + 25) * 100); // C'est ici que ça coince ... // Lecture de la réponse memset(&lecture, '\0', sizeof(lecture)); reslec = read(PortUSBUno, &lecture, sizeof(lecture)); if (reslec < 0) { printf("Error reading: %s", strerror(errno)); return 1; } else { printf("MiB"); // Je n'ai pas vu ces lettres encore ... } } close(PortUSBUno); return(0); }
Merci de votre attention
Michel
Configuration: Linux / Firefox 95.0
A voir également:
- Communication - PC <=> Arduino - par USB
- Clé usb non détectée - Guide
- Reinitialiser pc - Guide
- Test performance pc - Guide
- Pc lent - Guide
- Downloader for pc - Télécharger - Téléchargement & Transfert
3 réponses
Bonsoir,
J'ai donc continué à nettoyer ce code et j'ai avancé quelque peu.
En effet, maintenant je n'ai plus d'erreur, mais je ne reçois aucun octets.
J'ai retiré 2 paramètres à l'ouverture du port.
Merci de votre attention.
Michel
J'ai donc continué à nettoyer ce code et j'ai avancé quelque peu.
En effet, maintenant je n'ai plus d'erreur, mais je ne reçois aucun octets.
J'ai retiré 2 paramètres à l'ouverture du port.
//***************************************************************************************************** // Linux Mint 20.1 - Code::Blocks 20.03 // // Pour donner les droits ajouter l'utilisateur à DIALOUT // sudo adduser $USER dialout // // Date de création : 2022-01-01 // Date de modification : 2022-01-01 // //***************************************************************************************************** // C - Librairie d'entête #include <stdio.h> // Definition des entrés et sorties standard #include <stdlib.h> #include <string.h> // Definition des chaines de caracteres #include <unistd.h> // Definition des fonctions standard de UNIX #include <fcntl.h> // Contient les constantes de contrôle de fichier ex.: O_RDWR #include <errno.h> // Erreur integer Et strerror() function #include <termios.h> // Contient les définitions de contrôle pour le terminal POSIX #define Taille 256 // Variable du port USB int PortUSB; struct termios tty, old_tio, new_tio; //struct termios2 tty; // Variable de saisie au clavier char strEntree[256]="1"; char strCmd[256]="1"; char strAncCmd[256]="1"; char strReponse[256]="1"; char strSimul[256]="1"; char * lecturelocal=""; // Variable local de lecture au clavier char lecture[Taille]; // Variable tampon d'entrée pour le port USB char * mot; int reslec; // Variable témoin d'entrée pour le port USB int reswrt; // Variable témoin de sortie pour le port USB char x; void setup() { // Obtenir les paramètres du terminal pour stdin //ioctl(PortUSB, TCGETS2, &tty); if ( tcgetattr ( PortUSB, &tty ) == 0 ) { printf("Début initialisation.\n"); tcgetattr(PortUSB,&old_tio); new_tio = old_tio; // Initialise l'espace mémoire nécessaire au port USB memset (&tty, 0, sizeof tty); // Ouverture du port PortUSB = open( "/dev/ttyACM0", O_RDWR ); // Si erreur if ( PortUSB == 0 ) { // Réglage d'autres éléments du port tty.c_cflag &= ~PARENB; // Pas de bit de parité tty.c_cflag &= ~CSTOPB; // Seulement besoin 1 stop bit tty.c_cflag &= ~CSIZE; // Efface tous les bits du caractere tty.c_cflag |= CS8; // Caractere de 8 bits tty.c_cflag &= ~CRTSCTS; // Pas de contrôle de flux du matériel tty.c_lflag &= ~ICANON; // Pas de mode canonique tty.c_cflag |= CREAD | CLOCAL; // tty.c_lflag &= ~ECHO; // Désactiver l'echo tty.c_lflag &= ~ECHOE; // Désactiver l'effacement tty.c_lflag &= ~ECHONL; // Désactiver la nouvelle ligne de l'echo tty.c_lflag &= ~ISIG; // Désactiver l'interprétation de INTR, QUIT et SUSP // Désactiver le contrôle du flux logiciel s/w tty.c_iflag &= ~( IXANY | IXON | IXOFF); // Désactivation du traitement spécial des octets en réception tty.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL); // Empêcher toute interprétation spéciale des octets de sortie tty.c_oflag &= ~OPOST; // Empêcher la conversion de la nouvelle ligne en retour de chariot/saut de ligne tty.c_oflag &= ~ONLCR; // Récupérer les octets dès qu'ils sont disponibles tty.c_cc[VMIN] = 0; // La lecture ne block pas tty.c_cc[VTIME] = 10; // 1 seconde de délai de lecture "timeout" // Configure les vitesses entrée/sortie cfsetispeed (&tty, B9600); // Configure la vitesse en entrée cfsetospeed (&tty, B9600); // Configure la vitesse en entrée // Réinitialise le port USB et applique les attributs tcflush( PortUSB, TCIFLUSH ); // Si erreur if (tcsetattr(PortUSB, TCSANOW, &tty) != 0) { printf("Error %i from tcsetattr: %s\n", errno, strerror(errno)); return -1; } } else { printf("Erreur [%d] en provenance de tcgetattr : [%s].\n", errno, strerror(errno)); return -1; } } else { // Affichage de lerreur printf("Erreur %d a louverture du port /dev/ttyACM0.\n", errno); return -1; } } int main () { //int boucle; //char b[1]; //int i=0; // Initialisation setup(); printf("Initialisation termine.\n\n"); printf("La commande n-1 est [%s].\nLa commande en cours est [%s].\nLa simulation en cours est [%s].\n\n",strAncCmd,strCmd,strSimul); while (strcmp(strSimul,strCmd) == 0) { printf("Entrez la commande à envoyer : "); lecturelocal = fgets(strEntree,254,stdin); strncpy(strCmd, strEntree, strlen(strEntree)-1); printf("La commande est : [%s].\n", strCmd); printf("Entrez la réponse attendu : "); lecturelocal = fgets(strEntree,9,stdin); strncpy(strSimul, strEntree, strlen(strEntree)-1); printf("La réponse est [%s].\n", strSimul); if (strcmp(strCmd,strSimul) == 0) { printf("Les deux chaînes sont égales.\n"); lecturelocal = fgets(strEntree,9,stdin); strncpy(strReponse, strEntree, strlen(strEntree)-1); } else { printf("Les deux chaînes ne sont pas égales.\n"); lecturelocal = fgets(strEntree,9,stdin); strncpy(strReponse, strEntree, strlen(strEntree)-1); } if (strcmp(strAncCmd,strCmd) == 0) { printf("Meme commande.\n\nLa commande n-1 est [%s].\nLa commande en cours est [%s].\nLa simulation en cours est [%s].\n\n",strAncCmd,strCmd,strSimul); } else { printf("Commande differente.\n"); printf("La commande n-1 est [%s].\n",strAncCmd); printf("La commande en cours est [%s].\n",strCmd); printf("La simulation en cours est [%s].\n",strSimul); printf("\n"); strcpy(strAncCmd, strCmd); } // Envoie de la commande reswrt = write(PortUSB, strCmd, 1); // Afficher message printf("Commande envoyé. En attente ...\n"); // Attente ((Nbr Car + 25) * 100) environ 100 usecondes par caractere usleep((1 + 25) * 1000); if (PortUSB < 0) { printf("Port USB insdiponible.\n"); } else { printf("Port USB disponible.\n"); } // Lecture de la réponse printf("Lecture du port : "); memset(&lecture, '\0', sizeof(lecture)); reslec = read(PortUSB, &lecture, sizeof(lecture)); if (reslec < 0) { printf("Error reading: %s.\n", strerror(errno)); } else { printf("Nombre d'octets reçu : [%d]\n",reslec); } } close(PortUSB); return(0); }
Merci de votre attention.
Michel
Bonsoir,
Alors voilà, j'ai résolu mon problème.
J'avais des écarts des deux côtés, et j'ai nettoyé tout le programme.
Il me reste à synchroniser le tout ...
Pour ceux que ça intéresse, voici le code
Merci de votre attention
Michel
Alors voilà, j'ai résolu mon problème.
J'avais des écarts des deux côtés, et j'ai nettoyé tout le programme.
Il me reste à synchroniser le tout ...
Pour ceux que ça intéresse, voici le code
//***************************************************************************************************** // Linux Mint 20.1 - Code::Blocks 20.03 // // Pour donner les droits ajouter l'utilisateur à DIALOUT // sudo adduser $USER dialout // // Date de création : 2022-01-01 // Date de modification : 2022-01-01 // // Version V102t // //***************************************************************************************************** // C - Librairie d'entête #include <stdio.h> // Definition des entrés et sorties standard #include <stdlib.h> #include <string.h> // Definition des chaines de caracteres #include <unistd.h> // Definition des fonctions standard de UNIX #include <fcntl.h> // Contient les constantes de contrôle de fichier ex.: O_RDWR #include <errno.h> // Erreur integer Et strerror() function #include <termios.h> // Contient les définitions de contrôle pour le terminal POSIX #include <sys/ioctl.h> #include <linux/usbdevice_fs.h> #define Taille 256 // Variable du port USB int PortUSB; struct termios tty, old_tio, new_tio; // Variable de saisie au clavier char strCmd[256]="1"; char strReponse[256]="1"; unsigned char lecture[Taille]; // Variable tampon d'entrée pour le port USB int reslec; // Variable témoin d'entrée (read) pour le port USB int reswrt; // Variable témoin de sortie (write) pour le port USB int lec; // Variable local de lecture au clavier int bascule; void setup() { // Obtenir les paramètres du terminal pour stdin tcgetattr(STDIN_FILENO,&old_tio); new_tio = old_tio; // Initialise l'espace mémoire nécessaire au port USB memset (&tty, 0, sizeof tty); // Ouverture du port PortUSB = open( "/dev/ttyACM0", O_RDWR ); // Si pas erreur if (!(PortUSB < 0 )) { // Obtenir les Attributs du port USB if ( tcgetattr ( PortUSB, &tty ) == 0 ) { // Configure les vitesses entrée/sortie cfsetspeed (&tty, 9600); // Configure la vitesse en entrée // Réglage d'autres éléments du port tty.c_cflag &= ~PARENB; // Pas de bit de parité tty.c_cflag &= ~CSTOPB; // Seulement besoin 1 stop bit tty.c_cflag &= ~CSIZE; // Caractere de 8 bits tty.c_cflag |= CS8; // Caractere de 8 bits tty.c_cflag &= ~CRTSCTS; // Pas de contrôle de flux du matériel // Pas de mode canonique tty.c_cflag |= ( CREAD | CLOCAL ); // Activer READ et ignorer les lignes de contrôle tty.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON); tty.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN); // Récupérer les octets dès qu'ils sont disponibles tty.c_cc[VMIN] = 0; // La lecture ne block pas tty.c_cc[VTIME] = 10; // 0.5 seconds de délai de lecture "timeout" ( 5 = 1/2 seconde = 0.5 ) // Vide les Attributs du port USB tcflush(PortUSB, TCIFLUSH); // Applique les Attributs - Si pas erreur if ( tcsetattr ( PortUSB, TCSANOW, &tty ) != 0) { printf("Erreur %d de transmission/reception tcsetattr.\n", errno); } } else { printf("Erreur [%d] en provenance de tcgetattr : [%s].\n", errno, strerror(errno)); } } else { // Affichage de lerreur printf("Erreur %d a louverture du port /dev/ttyACM0.\n", errno); } } int main () { // Initialisation setup(); memset(&strCmd, '\0', sizeof(strCmd)); while (strCmd[0] != '*') { printf("Entrez la commande à envoyer : "); lec = scanf("%s", strCmd); // Envoie de la commande reswrt = write(PortUSB, strCmd, sizeof(strCmd)); usleep((4 + 25) * 1000); bascule = 1; while (bascule == 1) { if (!(PortUSB < 0 )) { usleep((4 + 25) * 1000); bascule = 0; // Vide la mémoire memset(&lecture, '\0', sizeof(lecture)); // Lecture de la réponse reslec = read(PortUSB, &lecture, sizeof(lecture)); if (sizeof(lecture) > 0) { printf("[%s]\n", lecture); } } else { usleep(100); } } } close(PortUSB); return(0); }
Merci de votre attention
Michel
Bonjour,
Bien sur, je suis désolé de mon ignorance, il y a tellement longtemps que je n'étais venu sur le site ...
je laisse quand même une dernière version amélioré qui prend en considération la lenteur de Arduino.
Merci de votre attention.
Michel
Bien sur, je suis désolé de mon ignorance, il y a tellement longtemps que je n'étais venu sur le site ...
je laisse quand même une dernière version amélioré qui prend en considération la lenteur de Arduino.
//***************************************************************************************************** // Linux Mint 20.1 - Code::Blocks 20.03 // MiB // Version V.104 a // //***************************************************************************************************** // C - Librairie d'entête #include <stdio.h> // Definition des entrés et sorties standard #include <stdlib.h> #include <string.h> // Definition des chaines de caracteres #include <unistd.h> // Definition des fonctions standard de UNIX #include <fcntl.h> // Contient les constantes de contrôle de fichier ex.: O_RDWR #include <errno.h> // Erreur integer Et strerror() function #include <termios.h> // Contient les définitions de contrôle pour le terminal POSIX #include <sys/ioctl.h> #include <linux/usbdevice_fs.h> #define Taille 256 // Variable du port USB int PortUSB; struct termios tty, old_tio, new_tio; // Variable de saisie au clavier char strEntree[256]="1"; // Variable tampon de la lecture au clavier char strCmd[256]="1"; // Variable local du contenu de lecture au clavier char strAncCmd[256]="1"; // Variable local du contenu n-1 de lecture au clavier char * lectureclavier=""; // Variable témoin d'entrée au clavier "fgets" unsigned char lecture[Taille]; // Variable tampon d'entrée pour le port USB int reslec; // Variable témoin d'entrée (read) pour le port USB int reswrt; // Variable témoin de sortie (write) pour le port USB int lec; // Variable local de lecture au clavier int bascule; void setup() { // Obtenir les paramètres du terminal pour stdin tcgetattr(STDIN_FILENO,&old_tio); new_tio = old_tio; // Initialise l'espace mémoire nécessaire au port USB memset (&tty, 0, sizeof tty); // Ouverture du port PortUSB = open( "/dev/ttyACM0", O_RDWR ); // Si pas erreur if (!(PortUSB < 0 )) { // Obtenir les Attributs du port USB if ( tcgetattr ( PortUSB, &tty ) == 0 ) { // Configure les vitesses entrée/sortie cfsetspeed (&tty, 9600); // Configure la vitesse en entrée // Réglage d'autres éléments du port tty.c_cflag &= ~PARENB; // Pas de bit de parité tty.c_cflag &= ~CSTOPB; // Seulement besoin 1 stop bit tty.c_cflag &= ~CSIZE; // Caractere de 8 bits tty.c_cflag |= CS8; // Caractere de 8 bits tty.c_cflag &= ~CRTSCTS; // Pas de contrôle de flux du matériel // Pas de mode canonique tty.c_cflag |= ( CREAD | CLOCAL ); // Activer READ et ignorer les lignes de contrôle tty.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON); tty.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN); // Récupérer les octets dès qu'ils sont disponibles tty.c_cc[VMIN] = 0; // La lecture ne block pas tty.c_cc[VTIME] = 10; // 0.5 seconds de délai de lecture "timeout" ( 5 = 1/2 seconde = 0.5 ) // Vide les Attributs du port USB tcflush(PortUSB, TCIFLUSH); // Applique les Attributs - Si pas erreur if ( tcsetattr ( PortUSB, TCSANOW, &tty ) != 0) { printf("Erreur %d de transmission/reception tcsetattr.\n", errno); } } else { printf("Erreur [%d] en provenance de tcgetattr : [%s].\n", errno, strerror(errno)); } } else { // Affichage de lerreur printf("Erreur %d a louverture du port /dev/ttyACM0.\n", errno); } } int main () { // Initialisation setup(); memset(&strCmd, '\0', sizeof(strCmd)); while (strCmd[0] != '*') { printf("Entrez la commande à envoyer : "); lectureclavier = fgets(strEntree,254,stdin); strncpy(strCmd, strEntree, strlen(strEntree)-1); // Envoie de la commande if (strcmp(strCmd,strAncCmd)!=0) { if (strCmd[0] != '*') { reswrt = write(PortUSB, strCmd, sizeof(strCmd)); strcpy(strAncCmd,strCmd); usleep(20 * 100000); memset(&lecture, '\0', sizeof(lecture));// Vide la mémoire reslec = read(PortUSB, &lecture, sizeof(lecture));// Lecture de la réponse if (sizeof(lecture) > 0) { printf("%s", lecture); } } } } close(PortUSB); return(0); }
Merci de votre attention.
Michel