Lire un port com en C

Fermé
Master_Chang Messages postés 30 Date d'inscription mercredi 7 août 2013 Statut Membre Dernière intervention 15 octobre 2014 - Modifié par Master_Chang le 15/10/2014 à 16:50
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 - 9 nov. 2014 à 14:00
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
A voir également:

1 réponse

sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
9 nov. 2014 à 14:00
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

//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 );
}

0