Lire un port com en C
Master_Chang
Messages postés
32
Date d'inscription
Statut
Membre
Dernière intervention
-
sambia39 Messages postés 610 Date d'inscription Statut Membre Dernière intervention -
sambia39 Messages postés 610 Date d'inscription Statut Membre Dernière intervention -
bonjour
je voudrais analyser des infos envoyer par un ardunio sur le port com ne maîtrisant pas biens le C c'est a vous que je m'en remet pour me conseiller telles ou telles commandes. je sait que google est mon ami mais je ne pige pas grand chose de ce qu'il y a sur les différents forums. pour info je suis sou win7 et j'ai essayer une manip semblable en batch mais il n'y a pas de solutions propre dans ce language.
merci
je voudrais analyser des infos envoyer par un ardunio sur le port com ne maîtrisant pas biens le C c'est a vous que je m'en remet pour me conseiller telles ou telles commandes. je sait que google est mon ami mais je ne pige pas grand chose de ce qu'il y a sur les différents forums. pour info je suis sou win7 et j'ai essayer une manip semblable en batch mais il n'y a pas de solutions propre dans ce language.
merci
A voir également:
- Lire un port com en C
- Lire le coran en français pdf - Télécharger - Histoire & Religion
- Lire un fichier epub - Guide
- Waptrik com - Télécharger - Divers TV & Vidéo
- Comment lire un message supprimé sur whatsapp - Guide
- Lire fichier bin - Guide
1 réponse
Bonjour
Il n'y a pas vraiment de commande à faire dans une terminale Windows et l'interfacer avec ton application voir même bidouille pour rediriger le flux vers ton application ou de l'inverse.
Le mieux a faire est d'écrire une fonction qui va te permettre de communiquer directement avec le matériel en question donc, tu dois implémenter plus ou moins une interface "causète" avec ton matériel qui doit prendre:
-> l'adresse du port série
-> la vitesse d'écriture et une variable "buffer" pour écrire les commandes et les réceptionner.
Bref, cela donnerait un exemple ci-dessous que je poste et qui n'est pas optimiser le reste des instructions s'est à toi de le faire selon tes besoins et documente-toi sur la structure "termios" pour vraiment savoir ce que tu veux faire car mon exemple est utilisé pour une application perso donc certains paramètres de configuration du "termios" me sont utiles pour mon application mais pas forcement les tiennes.
à bientôt
Il n'y a pas vraiment de commande à faire dans une terminale Windows et l'interfacer avec ton application voir même bidouille pour rediriger le flux vers ton application ou de l'inverse.
Le mieux a faire est d'écrire une fonction qui va te permettre de communiquer directement avec le matériel en question donc, tu dois implémenter plus ou moins une interface "causète" avec ton matériel qui doit prendre:
-> l'adresse du port série
-> la vitesse d'écriture et une variable "buffer" pour écrire les commandes et les réceptionner.
Bref, cela donnerait un exemple ci-dessous que je poste et qui n'est pas optimiser le reste des instructions s'est à toi de le faire selon tes besoins et documente-toi sur la structure "termios" pour vraiment savoir ce que tu veux faire car mon exemple est utilisé pour une application perso donc certains paramètres de configuration du "termios" me sont utiles pour mon application mais pas forcement les tiennes.
à bientôt
//libC #include <stdio.h> #include <stdlib.h> //Système #include <unistd.h> #include <termios.h> #include <sys/fcntl.h> #define BUFF 1024 //Fonction connexion void f_ConnexionCom( const char *pCom, const unsigned Baud ){ int flag = 0; struct termios OldT; struct termios NewT; flag = open( pCom, O_RDWR|O_NOCTTY ); if( flag <= 0 ){ printf( "*\tImpossible d'ouvrir le port série\n" ); printf( "*\tAssurer vous que vous avez les droits administrateurs\n" ); perror( "*\tEtat Erreur" ); exit( EXIT_FAILURE ); } /** * Sauvegarde & Creation d'une * nouvelle termios à utiliser **/ tcgetattr( flag, &OldT ); tcgetattr( flag, &NewT ); //Config du termios personaliser (&NewT)->c_iflag = IGNBRK; (&NewT)->c_oflag = 0L; (&NewT)->c_lflag = 0L; (&NewT)->c_cc[VMIN] = 1; (&NewT)->c_cc[VTIME] = 0; (&NewT)->c_cflag |= CREAD; (&NewT)->c_cflag &=~ ( CSIZE|PARENB|CSTOPB|CRTSCTS ); (&NewT)->c_cflag |= CS8; (&NewT)->c_cflag |= CLOCAL; (&NewT)->c_iflag &=~ ( IXON|IXOFF|IXANY ); //Configuration de Baudrate exemple 19200 cfsetispeed( &NewT, Baud ); cfsetospeed( &NewT, Baud ); tcsetattr( flag, TCSANOW, &NewT ); tcflush( flag, TCIFLUSH ); //Allocation variable de commande char *pCmd = (char*)calloc( BUFF, sizeof(char) ); if( pCmd == NULL ){ perror( "Impossible de d'initialiser la variable de commande\n" ); exit( EXIT_FAILURE ); } /** * Envoie de commande sur * le port série/Com * pas optimiser la condition de * sorti ( à refaire ) **/ do{ int ret; //Envoie de la commande printf( "Entrer votre commande\t: "); scanf( "%c", pCmd ); printf("\n"); //Lecture des informations ret = write( flag, pCmd, sizeof(pCmd) ); if( ret ){ printf( "# Attente de lecture.....\n"); ret = read( flag, pCmd, 1 ); if( ret ){ printf("=>Reçut\t:%s\n", pCmd ); pCmd = 0; } if( ret <= 0 ){ printf( "\n *\tAucune donné reçut\n" ); return; } } }while( *pCmd != '@'); //condition de sortie bidon /** * Désalocation & Restitution du * Termios initiale **/ free( pCmd ); tcsetattr( flag, TCSANOW, &OldT); close( flag ); } //Fonction principale int main( void ){ /** * Attention ici j'utilise le terminal * Ctrl+Alt+F1 sous UNIX pour faire ce teste * et je le déconseil. utiliser addr de * votre port serie et assurer vous d'être en mode "su" **/ f_ConnexionCom("/dev/tty1", 19200 ); return ( EXIT_SUCCESS ); }