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 :

Lire sur un port série com


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2015
    Messages : 3
    Par défaut Lire sur un port série com
    Bonjour,

    Après de longues recherches infructueuses, j'en appel à votre aide. J'essaie de lire des informations sur le port COM 6 de ma machine cependant une fois le programme lancée, en sachant qu'il compile et se lance sans soucis, rien ne s'affiche. Serait-ce de la magie ?

    Je requiers donc votre aide Merci d'avance
    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
    73
    74
    75
    76
    77
    78
     
    //	| Recupere la configuration du port serie
        tcgetattr(port_serie, &options);
     
    //	| Vitesse de transmission en Baud (9600 Baud => B9600)
        cfsetospeed(&options, B38400);
     
    /*  Description des flags dans Termios.h :
    		options . c_iflag;        modes d'entrée
    		options . c_oflag;        modes de sortie
    		options . c_cflag;        modes de contrôle
    		options . c_lflag;        modes locaux
    		options . c_cc[NCCS];     caractères de contrôle   */
     
    //	| Declare l'ecoute du port
        options.c_cflag |= CREAD;
     
     
    /*  | Desactivation de certaines fonctionnatlitees. Demande un affichage brut des informations
        " man termios " pour + d'informations !*/
    	  options.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | ICRNL | IXON );
     
    //  ~~ Ces options ne sont pas utile dans notre cas, donc par defaut tous desactiver
        options.c_oflag = 0;
     
    //  | La valeur du bit canon ICANON de c_lflag détermine si le terminal opère en mode canonique
    //  (ICANON positionné) ou en mode non canonique (ICANON non positionné). Par défaut, ICANON est positionné.
        options.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
     
    //  | Structure de la liaison rs232 (7 bit, 1 stop, paire)
        options.c_cflag &= ~CSTOPB;          // Desactive l'utilisation de deux bits de stop plutôt qu'un.
        options.c_cflag &= ~CSIZE;           // Masque de longueur des caractères.
        options.c_cflag |= PARENB;           // Valider le codage de parité en sortie, et la vérification de parité en entrée.
        options.c_cflag |= PARODD;           // S'il est positionné, la parité en entrée et en sortie sera impaire ; sinon, une parité paire sera utilisée.
        options.c_cflag |= CS7;              // 7 Bits |  Les valeurs sont CS5, CS6, CS7 ou CS8.
    /*
     Fonction | tcsetattr() :
     		fixe les paramètres du terminal (à moins que le matériel sous-jacent ne le prenne pas en charge) en lisant la structure termios
     		pointée par termios_p. optional_actions précise quand les changements auront lieu :
      Option : TCSANOW
        Les modifications sont effectuées immédiatement.   */
     
    	if ( tcsetattr(port_serie, TCSANOW, &options) == -1)
    	{
    		fprintf(stderr, "%s\n", strerror(errno));
    	}
     
    	printf("~~ | Reception des donnees..\n");
     
     
    //	| Mode bloquant pour la fonction read(), attend jusqu'a reception d'une donnee
        sock_non_bloquante(port_serie, false);
     
        memset(tmpstr, '\0', sizeof(tmpstr));
        do
        {
            memset(buffer, '\0', sizeof(buffer));
     
    //      | Ecoute par block :
    //		size_read = read(port_serie, buffer, sizeof(buffer)-1);
     
    //      | Ecoute par caractere :
            size_read = read(port_serie, buffer, sizeof(char));
     
    		if ( size_read <= 0 )
    		 {
    			fprintf(stderr, "%s", strerror(errno));
    		 }
    		else
    		 {
    			printf("%c", *buffer);
    		 }
    	}
        while ( 1 );
     
    	//  | Fermeture du port serie
    	if (close(port_serie) < 0)
    		fprintf(stderr, "%s\n", strerror(errno));

  2. #2
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    872
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 872
    Par défaut
    Si tu ne fais pas de retour à la ligne dans printf, le buffer ne sera pas affiché. Si tu ne veux pas afficher de retour à la ligne tu peux flusher de cette façon :

    Si le problème est autre, désolé mais je ne l'ai pas vu. J'avais écris une classe (disponible ici) pour gérer ça en C++ mais le code est très proche du C.

    Bon courage !

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2015
    Messages : 3
    Par défaut
    J'ai préféré utiliser le retour à la ligne dans printf.
    En revanche, après modification de mes options j'obtiens quelque chose de fonctionnel

    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
     
    //	| Declare l'ecoute du port
     //   options.c_cflag |= CREAD;
     
        options.c_cflag = (options.c_cflag & ~CSIZE) | CS8;     // 8-bit chars
        // disable IGNBRK for mismatched speed tests; otherwise receive break
        // as \000 chars
        options.c_iflag &= ~IGNBRK;         // disable break processing
        options.c_lflag = 0;                // no signaling chars, no echo,
                                        // no canonical processing
        options.c_oflag = 0;                // no remapping, no delays
        options.c_cc[VMIN]  = 0;            // read doesn't block
        options.c_cc[VTIME] = 5;            // 0.5 seconds read timeout
     
        options.c_iflag &= ~(IXON | IXOFF | IXANY); // shut off xon/xoff ctrl
     
        options.c_cflag |= (CLOCAL | CREAD);// ignore modem controls,
                                        // enable reading
        options.c_cflag &= ~(PARENB | PARODD);      // shut off parity    
        options.c_cflag &= ~CSTOPB;
        options.c_cflag &= ~CRTSCTS;

  4. #4
    Futur Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2015
    Messages : 3
    Par défaut
    Il ne me reste plus qu'à écrire mon buffer dans un fichier avec des jolis retours à la ligne quand il faut bien

    Ce qui fonctionne avec le fflush.
    Merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lire et écrire sur le port série
    Par helmi03 dans le forum Débuter
    Réponses: 1
    Dernier message: 11/05/2011, 15h26
  2. [pyserial] lire et écrire sur le port série
    Par elscorpio dans le forum Bibliothèques tierces
    Réponses: 3
    Dernier message: 29/05/2008, 13h39
  3. Comment lire une pin sur le port série du pc
    Par KENPACHI dans le forum LabVIEW
    Réponses: 1
    Dernier message: 25/05/2007, 12h56
  4. Lire sur un port série de manière synchrone ?
    Par Hokagge dans le forum MFC
    Réponses: 26
    Dernier message: 09/06/2005, 12h16
  5. Quel langage choisir pour lire sur le port série ?
    Par Nico76 dans le forum Windows
    Réponses: 7
    Dernier message: 28/04/2004, 10h42

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