Bonjour,
J'ai développé un programme avec "termios.h" lisant mon port série.
J'utilise donc un read pour faire la lecture du port.
J'ai développer 2 variantes, une 1ère qui lit 13 caractères d’un coup (correspond à la taille actuel des trames qui passe dans mon port série) et qui fait correctement ce que je cherche. Cependant cette 1ère version ne me satisfait pas car elle n'est pas dynamique du fait que je force la lecture à 13 caractères. Cela peut poser problème si la taille des trames que je lit sur le port série change, car le programme ne marchera plus.
J'ai alors développé un second programme qui lit cette fois-ci caractère par caractère. Cela est effectué dans une boucle while qui boucle jusqu'à la lecture d'un caractère \n (dernier caractère d’une trame, c’est donc dynamique la taille de la trame peut changer sans pb). Lorsqu'elle lit se caractère, la boucle s'arette le buffer est réinitialisé et on peut recommence la boucle avec le read qui se remet en attente de reception d’une nouvelle trame.
Ces 2 programmes fonctionne très bien sur ma machine de développement, une distribution debian. Mais le hic, c’est que les progs sont destiné à l’embarqué, je les recompile donc pour un processeur arm. Une fois installer dans le module embarqué à base de processeur arm, le 1er programme fonctionne mais le 2ème plante.
En fait dans le premier cas la lecture des 13 caractères s’effectue bien, mais dans le second cas mon programme ne sort jamais de la boucle while attendant un \n, pour la simple et bonne raison que mon read lit en permanence le 1er caractère d’une trame. Si il y a 13 caractère qui arrive d’un coup le read ne lira tjs que le 1er alors que le même programme sur ma machine de développement boucler bien sur les 13 caractères. Je suppose donc que le read ne se comporte pas de la même façon sur le module embarqué, apparemment il ne bufferise pas les caractère.
Avez vous une idée, faut t’il utiliser le read différemment, ou bien faut t’il utiliser une autre fonction que le read ?
Voici pour info mon code :
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 int main () { int fd,n; int i,j,num_int,somme,CRC_calc,CRC_lu; char recup_port[20],num_str[20]; char c; /* Ouverture de la liaison série */ fd = open(PORT, O_RDWR | O_NOCTTY); if (fd <0) {perror(PORT); exit(-1); } /* Lecture des parametres courants */ tcgetattr(fd,&termios_p); /* On ignore les BREAK et les caracteres avec erreurs de parite */ termios_p.c_iflag = IGNBRK | IGNPAR; /* Pas de mode de sortie particulier */ termios_p.c_oflag = 0; /* Liaison a 9600 bps avec 8 bits de donnees et une parite paire */ termios_p.c_cflag = B9600 | CS8 | CLOCAL | CREAD; /* Mode non-canonique avec echo */ termios_p.c_lflag = ECHO; /* Caractères immediatement disponibles */ termios_p.c_cc[VMIN] = 1; termios_p.c_cc[VTIME] = 0; /* Sauvegarde des nouveaux parametres */ tcsetattr(fd,TCSANOW,&termios_p); /* Boucle de lecture du port */ while(1){ /* Vide le buffer */ tcflush(fd, TCIFLUSH); /* Initialise le caractère et le compteur de caractère */ c='\0'; i=0; while(c!=0x0a){ // boucle jusqu'à la lecture de \n /* Récupère un caractère */ n=read(fd, &c, 1); printf("%c\n",c); /* Concatène le caractère dans le string recup_port */ recup_port[i]=c; i++; } } }
Partager