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 :

Fonction screen /dev/ttyUSB0 en C sur LINUX


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 46
    Par défaut Fonction screen /dev/ttyUSB0 en C sur LINUX
    Bonjour !

    J'ai un module GPS qui envoie par protocole XBee sur une clé USB les coordonnées GPS.
    Ses données se trouvent dans le fichier /dev/ttyUSB0 et j'arrive à les lire en utilisant le terminal :
    ou
    J'aimerais pouvoir lire ses données avec un programme C. J'ai déjà commencé le programme par :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <termios.h>
    #include <sys/fcntl.h>
    #include <unistd.h>
    #include "serial_port.h"
     
    void read_Serial_Port(const char* DEVICE_PORT)
    {
    	int file;
    	struct termios options;
    	char data[60] = "";
    	unsigned int sizeMax = 60;
     
    	file = open(DEVICE_PORT, O_RDONLY | O_NOCTTY | O_NDELAY);
     
    	if(file == -1){
    	    perror("Unable to open the serial port\n");
    	}
    	printf("Serial port open successful\n");
     
    	tcgetattr(file, &options); 			
    	cfsetispeed(&options, B9600); 					
    	cfsetospeed(&options, B9600); 					
    	options.c_cflag |= (CLOCAL | CREAD); 			  
    	options.c_cflag |= PARENB; 						//No parity					
    	options.c_cflag |= PARODD; 						
    	options.c_cflag &= ~CSTOPB; 					
    	options.c_cflag &= ~CSIZE; 						
    	options.c_cflag |= CS8; 						//8 bits					
    	options.c_iflag |= (INPCK | ISTRIP); 			
    	tcsetattr(file, TCSANOW, &options); 	     
    	fcntl(file, F_SETFL, FNDELAY);			
     
    	printf("Reading serial port ...\n\n"); 
    	...
    	close(file);
    };
    Seulement, je n'arrive pas à écrire la fonction de lecture et d'affichage des données.

    Pour info, les données à lire ressemblent à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CHARS : 363764    SENTENCES : 0    CHECKSUM : 669
    Heading : 52    Tilt : -48    Roll : -2
    CHARS : ... ainsi de suite ...
    Merci beaucoup d'avance pour votre aide !!

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 452
    Par défaut
    Hello,

    Vois du côté de la fonction read().

    Bon courage.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 46
    Par défaut
    Bonjour, merci pour ta réponse.

    En vérité, j'ai déjà essayé avec la fonction read, voilà ce que j'ai écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void readMessage(char *data, unsigned int sizeMax, int file)
    {
        int i;
        int ret = 0;
     
        while (1)
        {
    	    for (i=0; i<sizeMax; i++)
    	    {
    	        ret = read(file, &data[i], 60);
    	        printf("%c\n", data[i]);
    	    }
        }
    }
    mais ça me donne pas ce que je veux. En fait j'ai mis 60 mais en vérité je ne sais pas quoi mettre (je connais pas la taille du fichier étant donné que je reçois régulièrement les coordonnées GPS sur ma clé ... ?), je sais pas si je dois faire un boucle comme j'ai essayé de faire, Bref .... je sais pas utiliser la fonction read dans mon cas ...

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 46
    Par défaut
    Rebonjour

    J'ai écris la fonction suivante pour lire les données :
    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
    bool readMessage(int file, char *message, unsigned int nCountMax, unsigned long* pCountRead)
    {
        int nbCharToRead;
        char data[] = "";
        int i;
     
        if (file != 0)
        {
    	    nbCharToread = ?????
    	    i = 0;
    	    if (nbCharToRead > 30)
    	    {
    		    while (i<nCountMax && data != ".")
    		    {
    			    if (read(file,&data,1) == 0)
    			    {
    				    printf("reception error\n");
    				    return false;
    			    }
    			    else
    			    {   
    				    message[i] = data;
    				    i++;
    			    }
    		    }
    	    }
    	    message[i] = "\0";
    	    *pCountRead = (unsigned long) i;
    	    return true;
    };
    Mais il me manque une fonction pour remplir la variable pour connaitre le nombre de caractère à lire ... Vous en connaissez une ?

    Merci d'avance !

  5. #5
    Membre très actif

    Homme Profil pro
    Collégien
    Inscrit en
    Juillet 2010
    Messages
    585
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Juillet 2010
    Messages : 585
    Par défaut
    En fait j'ai mis 60 mais en vérité je ne sais pas quoi mettre
    Met la taille de ton buffer de reception

    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
    void readMessage(int file)
    {
        const size_t buff_size = 1024;
        char buff[buff_size];
        int buff_index = 0;
        int n = 0;
        while (n>=0)
        {
            if((n = read(file, &buff[buff_index],buff_size-buff_index)) < 0)
            {   
                printf("ERREUR DE LECTURE :%d",n);
            }
            else
            {
                buff_index += n;
                /* traitement sur les donnees recues*/
                printf("BUFFER:\n");
                for(int i = 0 ; i < buff_index ; i++)
                {
                    printf("%c",buff[i]);
                }
                printf("\n");
     
                /* si traitement terminé alors vide le buffer de reception */
                buff_index = 0;
            }
        }
    }

Discussions similaires

  1. Réponses: 18
    Dernier message: 21/11/2012, 13h04
  2. Réponses: 0
    Dernier message: 12/12/2011, 18h07
  3. Eclipse sur Windows et dev local sur Linux : comment faire ?
    Par fredouille31 dans le forum Eclipse PHP
    Réponses: 2
    Dernier message: 17/01/2011, 10h26
  4. [GD] Est-ce que c'est possible qu'une fonction tourne mieux sur Win et pas sur Linux
    Par nkki_nkki dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 22/07/2007, 17h34
  5. SVN sur Windows, Dev en remote sous serveur Linux commun
    Par matjap dans le forum Subversion
    Réponses: 7
    Dernier message: 10/01/2007, 17h55

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