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

C Discussion :

liaison série - lire tant qu'il y a des données


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 7
    Par défaut liaison série - lire tant qu'il y a des données
    Bonjour,

    Pouvez-vous m'aider pour trouver une solution concernant la lecture sur la voie série, j'aimerai que la fonction "read" puisse lire tant qu'il y a des données, et dès que tout est lu, que ça stoppe.

    j'ai essayé avec la fonction select mais sans succès, donc y'a t-il moyen de le faire un while directement ? Comment svp ?

    Mon programme actuellement en C est basique :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <termios.h>
     
     
     
    int main(void)
    {
     
    	int port_serie;
    	struct termios options;
    	int reception;
    	char buffer[255] = "";
    	char data[] = "AT+CGMI\n\0"; //message que je veux envoyer
     
     
    	port_serie = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
     
    	//cas d'erreur d'ouverture
    	if(port_serie < 0)
    	{
    		perror("Erreur d'ouverture du port serie");
    		exit(-1);
    	}
     
    	else
    	{
    		printf("Port serie ouvert. \n", port_serie);
     
    		//chargement des données
    		tcgetattr(port_serie, &options);
    		//B115200 bauds
    		cfsetospeed(&options, B115200);
    		options.c_cflag |= (CLOCAL | CREAD);
    		//structure en 8N1 !
    		options.c_cflag &= ~PARENB; //pas de parité
    		options.c_cflag &= ~CSTOPB; // 1 bit de stop
    		options.c_cflag &= ~CSIZE; //option a 0
    		options.c_cflag |= CS8; //8 bits
    		tcsetattr(port_serie, TCSANOW, &options); //enregistrement des valeurs de configuration
    		printf("Configuration OK structure en 8N1. \n");
     
    			// Envoie de donnees.
    			printf("Envoie des donnees en cours ... \n");
    			if (write(port_serie, data, 17) < 0){perror("ERROR\n");}
    			printf("Envoie Termine. \n");
     
     
    			// Lecture des donnees.
    			printf("Lecture des donnees en cours ... \n");
    			fcntl(port_serie,F_SETFL,10);//mode bloquant pour la fonction read() si aucun caractere disponible, le programme attend.
     
    			reception=read(port_serie,buffer,255);//buffer contitendra les données, 255 est le nombre d'octets a copier dans cet espace
    			printf("message recu : %s\n",buffer);
     
     
     
     
    			if (reception == -1)
    			printf("Erreur lecture port serie\n");
     
    			printf("Reception finie.\n" );
     
    	}
     
    	close(port_serie);//fermeture du port serie
     
    return 0;
    }

    La réponse contient plusieurs lignes, actuellement le programme ne me lit que la première.

    Merci.
    Cordialement

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 478
    Par défaut
    Bonjour,

    Déjà, lorsque tu écris sur le port série, les informations sont envoyées vers l'extérieur et, quand tu le lis, les informations provenant de l'extérieur sont reçues. Ce ne sont donc pas les mêmes. Tu ne peux pas t'attendre à lire avec read() ce que tu as envoyé juste avant avec write() sauf si tu utilises un câble en boucle ou que ton port série est relié à un autre ordinateur qui, lui, te répond.

    Ensuite, le port RS-232 est doté de signaux permettant de véhiculer des signaux de contrôle à côté des données, comme RTS, CTS ou la détection de porteuse mais encore faut-il que ton équipement les utilise.

    Du coup, et si ce n'est pas le cas, comment détectes-tu la fin de transmission de tes données ou à quel moment considères-tu que c'est fini ? C'est à cette question qu'il faut répondre en premier lieu et qui déterminera le code que tu dois écrire en conséquence.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Février 2010
    Messages : 87
    Par défaut
    slt

    moi j'ai utiliser le portcom pour communiquer avec les micro mais ton code je le comprend pas, moi j'ai travaller avec le code C de windows
    pour le l'ouverture de port j'utilise "hCom = CreateFile("COM1",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0, NULL);" et toi tu utilise structure "termios" comme "DCB" et ton code il manque deux autre structure "COMSTAT" et "COMMTIMEOUTS" je ne sais sont equivalent dans ton code , voir le fichier jointe pour mieu comprendre et bonne chanse

    (désolé pour la langue )
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. lire un fichier texte et extraire des données
    Par oscar.cesar dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 10/05/2009, 13h40
  2. Réponses: 29
    Dernier message: 11/05/2004, 13h18
  3. liaison série
    Par elodie escande dans le forum MFC
    Réponses: 13
    Dernier message: 14/01/2004, 17h57

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