Lecture port série sur LINUX

ABouras Messages postés 26 Date d'inscription   Statut Membre Dernière intervention   -  
ABouras Messages postés 26 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour j'aimerais lire sur le port série /dev/ttyUSB0, le message suivant :
Heading: 274 Tilt: 7 Roll: -11   
LAT=48.715961 LON=2.203730 SAT=5 PREC=300   
CHARS=32386 SENTENCES=275 CSUM ERR=1


Voici mon code de lecture (après ouverture du fichier) :
bool readMessage(int file, char* message, int nbCharToRead) 
{ 
 int i; 
 char buf[] = "0"; 
 message = (char*)malloc(sizeof(*message)); 
        if (file != -1) 
        { 
         i = 0;  
         while(buf != "\n")  
  { 
   printf("Pas de retour à la ligne ...\n"); 
   if (read(file, &buf, sizeof(buf)) > 0)      
   { 
           message = (char*)realloc(message, sizeof(char)*(i+1)); printf("new sizeof(message) = %d\n", sizeof(*message)); 
    message[i] = buf[0]; printf("%c\n", message[i]); 
    i++; printf("i = %d\n", i); 
    if (i == nbCharToRead) break;      
   } 
   else {printf("Reception error !\n\n"); return false; free(message);} 
  }               
  message[i] = '\0';           
  printf("message : %c", message[i]); 
  return true; 
    } 
    else {printf("Error while reading file !\n"); return false;} 
};


Je veux lire à chaque appel de cette fonction, une ligne du message (que j'ai donné au début de ce post) en détectant les retour à la ligne "\n". A son exécution, j'obtiens soit "Reception error !", soit :
message : A
i = 1
message : AS
i = 2
message : AS:
i = 3
message : AS:4
i = 4
Reception error !


et il s'arrête à un nombre d'itération à chaque fois différent, mais pas plus grand que 5 ... Alors qu'en lisant le fichier /dev/ttyUSB0 avec la commande cat ou screen sur le terminal, ça fonctionne très bien ...

Quelqu'un pour m'aider ?

Quelqu'un pour m'aider ?
Merci d'avance !
A voir également:

6 réponses

totof31 Messages postés 163 Date d'inscription   Statut Membre Dernière intervention   74
 
Tu n'as toujours pas compris que read peut retourner 0 si le buffer est vide ?!?!?! Il ne faut pas traiter ce cas comme une erreur : ton programme vide simplement le buffer plus vite qu'il ne se remplit !
0
totof31 Messages postés 163 Date d'inscription   Statut Membre Dernière intervention   74
 
Attention aussi, il ne faut pas faire :
while(buf != "\n")
mais
while(buf[0] != "\n")
0
ABouras Messages postés 26 Date d'inscription   Statut Membre Dernière intervention  
 
Ok merci pour tes réponses !
Par contre
while (buf[0] != "\n")
me sors une erreur, j'ai mis à la place :
while (buf[0] != '\n')

j'ai aussi modifier la condition sur le read :
if (read(file, &buf, sizeof(buf)) != -1)

Mais ça ne corrige pas le problème ...
0
prefix
 
tu saurais dire quel serait le resultat si ton programme marchait?

ca serait plus simple a comprendre(pour moi en tous cas)
0
totof31 Messages postés 163 Date d'inscription   Statut Membre Dernière intervention   74
 
On recommence :
nb_car=read(file, &buf, sizeof(buf);
if (nb_car > 0)
// une donnée est présente, on ajoute à message
else if (nb_car == 0)
// buffer vide, on ne fait rien, on boucle en attendant qu'il se remplisse
else
// erreur (gravité à voir selon la valeur de nb_car/errno...) ==> il ne faut pas nécessairement terminer le programme !
0
ABouras Messages postés 26 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour, merci de répondre !
Voilà mon code mis à jour :
bool readMessage(int file, char* message, int nbCharToRead)
{
	int i,car;
	char buf[2] = {0};
	message = (char*)malloc(sizeof(*message)*(nbCharToRead+1));
        if (file != -1)
        {
	        i = 0;
	        while(buf[0] != '\n')
		{
			car = read(file, &buf, sizeof(buf));
			if (car > 0)
			{
				message[i] = buf[0];
				i++;
			}
			else if (car == 0); //on continue la boucle ...
			else {printf("Reception error !\n\n"); return false; free(message);}
		}
		printf("Retour à la ligne ...\n");
		message[i] = '\0';
		printf("message : %s", message);
		return true;
    }
    else {printf("Error while reading file !\n"); return false;}
};


Mais j'ai toujours le même problème, je n'arrive pas à obtenir la ligne entière, il s'arrête avant ... Ce que je veux, c'est voir sur le prompteur, une ligne entière s'afficher à chaque execution de la fonction readMessage ...
0

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

Posez votre question
totof31 Messages postés 163 Date d'inscription   Statut Membre Dernière intervention   74
 
erreur (gravité à voir selon la valeur de nb_car/errno...) ==> il ne faut pas nécessairement terminer le programme !

Essaie d'enlever le else et sa suite !!!
0
totof31 Messages postés 163 Date d'inscription   Statut Membre Dernière intervention   74
 
Et renforce aussi ton test pour ne pas déborder :
while(buf[0] != '\n')
==> while ((buf[0] != '\n') && (i < nbCharToRead))
0
ABouras Messages postés 26 Date d'inscription   Statut Membre Dernière intervention  
 
ça y est ça marche, j'ai enlever le else (erreur) !
Donc là j'affiche un bout d'une ligne jusqu'au retour à la ligne, mais j'aimerais maintenant afficher une ligne entière. Pour cela, mon algo est le suivant :
1) trouver un saut de ligne
2) afficher et enregistrer dans message[] les caractères qui suivent ce retour à la ligne jusqu'au prochain saut de ligne.

et ainsi de suite (je ferai ensuite une boucle dans le main pour afficher ligne par ligne le message). Ma fonction readMessage doit juste afficher et enregistrer une seule ligne complète.
0