Fonction screen /dev/ttyUSB0 en C sur LINUX

Fermé
ABouras Messages postés 26 Date d'inscription vendredi 16 novembre 2012 Statut Membre Dernière intervention 7 décembre 2012 - Modifié par ABouras le 19/11/2012 à 15:27
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 21 nov. 2012 à 19:39
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 :
$ screen /dev/ttyUSB0
ou
$ cat /dev/ttyUSB0

J'aimerais pouvoir lire ses données avec un programme C. J'ai déjà commencé le programme par :
#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 :
CHARS : 363764    SENTENCES : 0    CHECKSUM : 669  
Heading : 52    Tilt : -48    Roll : -2  
CHARS : ... ainsi de suite ...

Merci beaucoup d'avance pour votre aide !!
A voir également:

5 réponses

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
19 nov. 2012 à 15:22
À ce stade tu arrives à ouvrir ton fichier avec succès ? Est ce qu'avec fscanf ou read tu parviens à lire le flux ?

Ensuite la question, c'est est ce que tu connais la structure du flux de données (par exemple qu'est ce qu'on trouve dans le bloc "chars") ? Si oui peux-tu nous donner un lien vers les spécifications et nous dire plus précisément ce qui te bloque ?

Bonne chance
0
ABouras Messages postés 26 Date d'inscription vendredi 16 novembre 2012 Statut Membre Dernière intervention 7 décembre 2012
19 nov. 2012 à 15:58
Bonjour et merci de répondre.

J'arrive bien à ouvrir le fichier, mais je ne sais pas comment m'y prendre avec la fonction read.
J'ai essayé ça :
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 donne pas ce que je veux, d'autant plus, que j'ai mis 60 mais en vérité je ne sais pas quoi mettre, je sais pas si il faut faire une boucle ... bref, je ne sais pas utiliser la fonction read dans mon cas !
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
Modifié par mamiemando le 19/11/2012 à 22:52
Oui c'est ce qu'il faut faire (en gros). Mais maintenant il faut que tu saches ce qui est dans ce flux pour savoir quoi en faire. A priori c'est une structure de donnée "normalisée", il faut regarder les spécifications du protocole Xbee.

Supposons que tu saches que dans le flux, tu vas tomber sur une structure de type toto_t. Cette structure sera définie dans les spécifications de ton protocole, donc soit tu réécris la structure à la main à partir de spécifications de Xbee, soit tu connais une librairie qui définit cette structure dans un header et tu inclues ce header.

Une fois la structure toto_t définie il ne reste plus qu'à la lire dans le flux :

int ret; 
toto_t toto; 
ret = read(file, &toto, sizeof(toto_t)); 
if (ret == -1) { 
  perror("read failed"); 
} 


Attention aussi car tu peux avoir des soucis avec l'endianness, donc peut être que des fonctions comme ntohl peuvent t'aider à t'en abstraire.

Bonne chance
0
ABouras Messages postés 26 Date d'inscription vendredi 16 novembre 2012 Statut Membre Dernière intervention 7 décembre 2012
Modifié par ABouras le 20/11/2012 à 11:16
J'ai écris la fonction suivante pour lire les données :
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 [CODE]nbCharToread[/CODE] pour connaître le nombre de caractère à lire ... Vous en connaissez une ?

Merci d'avance !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
21 nov. 2012 à 19:39
Je pense que tu fais fausse route. Il faut savoir ce que tu t'attends à lire dans ton flux pour savoir combien d'octets lire. À moins d'avoir un "caractère d'arrêt" dans ton flux, tu n'as aucun moyen de savoir quand t'arrêter. As-tu trouvé une documentation qui spécifie le flux que tu es en train d'essayer de parser ?
0