Lire les trames d'une e-dam à travers un port série (RS232) sous Linux (debian)

cs_cartapus Messages postés 2 Date d'inscription mardi 11 janvier 2005 Statut Membre Dernière intervention 13 janvier 2005 - 12 janv. 2005 à 15:14
cs_Nashua Messages postés 48 Date d'inscription lundi 29 novembre 2004 Statut Membre Dernière intervention 16 mars 2005 - 13 janv. 2005 à 19:10
Je suis en BTS informatique
industriel et mon projet consiste à lire les trames d'une e-dam à travers un port série (RS232) sous Linux (debian) .
En
utilisant le langage C, J'aimerai obtenir un exemple de source pour y
arriver car j'ai du mal et je ne c comment m'y prendre .
Merci d'avance de me répondre

3 réponses

cs_Nashua Messages postés 48 Date d'inscription lundi 29 novembre 2004 Statut Membre Dernière intervention 16 mars 2005
13 janv. 2005 à 06:40
ouvrir le port avec open(),

Il faut configurer le tty en mode Raw, avec la fonction ci-dessous.'il devient transparent.

Apres cela tu lis le port avec un read().

pour plus de precision fais un man termios ( pas termio!!)



Ci -dessous une fonction qui passe la ligne en mode "raw" . juste pour
ne pas rester bloque en attente apres avoir recu 1 caractere. VTIME et
VMIN sont expliques dans le man de termios. Dans mon code on
attend VMIN = 1 caractere et l'on retourne immediatement. il n'y
a pas de timeout VTIME.


**************************************************************************/

#include <stdio.h>



#include <termios.h>




struct termios Line_New_Setting,




Line_Old_Setting;
/***************** un exemple d'utilisation de la fonction ********/
int main(){
int c;
unsigned char car;

c = open(/dev/ttyS0,O_RDWR);

setRawAttr(fileno(c));
while(1)
read (c,&car,1);
}

/*****************************************************/
int setRawAttr(int fd){
extern struct termios Line_New_Setting,
Line_Old_Setting;

if(tcgetattr(fd,&Line_Old_Setting) < 0) {
perror("Ioctl Get error");
return -1;
}
Line_New_Setting = Line_Old_Setting;

Line_New_Setting.c_lflag &= ~ICANON; /* non canonical mode */
Line_New_Setting.c_lflag &= ~ISIG; /* ignore ^C*/
Line_New_Setting.c_cc[VMIN] = 1; /* return after 1 char has been read */
Line_New_Setting.c_cc[VTIME] = 0; /* in .1 seconds */
Line_New_Setting.c_cc[VQUIT] = 0;
Line_New_Setting.c_lflag &= ~ECHO; /* disable echo */
Line_New_Setting.c_oflag |= (OPOST | ONLCR); /* enable Opost and nl to cr nl conversion */

/* set the new terminal attributes */
if(tcsetattr(fd,TCSAFLUSH,&Line_New_Setting) < 0){
perror("Ioctl Set error");
return -1;
}
return (0);
}







Yves
0
cs_cartapus Messages postés 2 Date d'inscription mardi 11 janvier 2005 Statut Membre Dernière intervention 13 janvier 2005
13 janv. 2005 à 13:09
merci de m'avoir répondu,

j'ai compilé ton prog mais j'ai trouvé 2err:



essai.c: Dans la fonction « main »:

essai.c:13: error: erreur d'analyse syntaxique before '/' token

essai.c:15: attention : passage de l'argument n°1 de « fileno » transforme un entier en pointeur sans transtypage



shé pa comment les corriger!!
0
cs_Nashua Messages postés 48 Date d'inscription lundi 29 novembre 2004 Statut Membre Dernière intervention 16 mars 2005
13 janv. 2005 à 19:10
Fais un man de fileno et tu auras la reponse a l'erreur de la ligne 15.

De meme fais un man de open ( int open(const char
*pathname, int flags); tu vois que le premier argument est un
pointeur sur chaine tu dois donc encadrer /dev/ttyS0 avec le " (doulbe
quote) pour que ce soit correct.

Ceci etant dit seule la fonction setraw est correcte et compilable, le
reste donne un exemple non fonctionnel d'utilisation que j'assimile a
une variante du pseudo code.


Yves
0
Rejoignez-nous