connexion serie en C
Le
Steph
Bonjour,
Je suis entrain de faire un programme communicant avec un kit herakles (kit
ITC).
Je suis sous linux.
Voici une partie du code que j'ai ecrit.
fichier : rs232.c
#include <sys/types.h>
#include <sys/stat.h>
#include <asm/ioctls.h>
#include <asm/termios.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <asm/io.h>
#include "rs232.h"
#define COM_PORT1 "/dev/ttyS0"
#define BAUDRATE B9600
int fd;
struct termios oldtio,newtio;
void main (void)
fd=open(COM_PORT1,O_RDWR | O_NOCTTY | O_NDELAY);
fcntl(fd,F_SETFL,0);
if (fd==-1) {
printf("Ne peux pas ouvrir le port com demandé");
exit (0);
}
if (debug) printf("fd : %i ",fd);
tcgetattr(fd, &newtio);
cfsetospeed(&newtio,BAUDRATE);
cfsetispeed(&newtio,BAUDRATE);
newtio.c_cflag |= (CLOCAL | CREAD);
tcsetattr(fd, TCSANOW, &newtio);
newtio.c_cflag &= ~CSIZE; /*Mask the character size bits*/
newtio.c_cflag |= CS8; /*Select 8 data bits*/
newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
newtio.c_oflag &= ~OPOST;
newtio.c_cc[VMIN] = 0;
newtio.c_cc[VTIME] = 10;
read_write(); // appel a la fct read_write
}
void read_write(void){
char *s = "N0Sxx";
char buf[2];
write (fd, s, strlen(s));
read (fd, buf, 2);
printf(" recu : %s",s);
}
// --
Voici une partie de mon code.
Le probleme que j'ai est le suivant :
je ne peux pas recevoir des données j'ai l'impression qu'elles se croisent
l'une sur Tx et l'autre sur Rx.
j'aimerais savoir si il n'existe pas 1 autre moyen pour ecrire ou lire sur
le port que celui d'utiliser un write et read qui semble poser probleme.
De plus, j'ai trouvé comment ne pas bloquer en cas de non reception de
données en read, mais justement ca ne lit plus rien.
Je sais que mon read fonctionne correctement puisque je peux lire
l'identification de la carte lors de son redemarrage si je suis en attente
de lecture.
Merci de m'aider un peu.
-
Stéphane
steph10200_no_spam@ifrance.com
retirez nospam pour répondre par mail
Je suis entrain de faire un programme communicant avec un kit herakles (kit
ITC).
Je suis sous linux.
Voici une partie du code que j'ai ecrit.
fichier : rs232.c
#include <sys/types.h>
#include <sys/stat.h>
#include <asm/ioctls.h>
#include <asm/termios.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <asm/io.h>
#include "rs232.h"
#define COM_PORT1 "/dev/ttyS0"
#define BAUDRATE B9600
int fd;
struct termios oldtio,newtio;
void main (void)
fd=open(COM_PORT1,O_RDWR | O_NOCTTY | O_NDELAY);
fcntl(fd,F_SETFL,0);
if (fd==-1) {
printf("Ne peux pas ouvrir le port com demandé");
exit (0);
}
if (debug) printf("fd : %i ",fd);
tcgetattr(fd, &newtio);
cfsetospeed(&newtio,BAUDRATE);
cfsetispeed(&newtio,BAUDRATE);
newtio.c_cflag |= (CLOCAL | CREAD);
tcsetattr(fd, TCSANOW, &newtio);
newtio.c_cflag &= ~CSIZE; /*Mask the character size bits*/
newtio.c_cflag |= CS8; /*Select 8 data bits*/
newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
newtio.c_oflag &= ~OPOST;
newtio.c_cc[VMIN] = 0;
newtio.c_cc[VTIME] = 10;
read_write(); // appel a la fct read_write
}
void read_write(void){
char *s = "N0Sxx";
char buf[2];
write (fd, s, strlen(s));
read (fd, buf, 2);
printf(" recu : %s",s);
}
// --
Voici une partie de mon code.
Le probleme que j'ai est le suivant :
je ne peux pas recevoir des données j'ai l'impression qu'elles se croisent
l'une sur Tx et l'autre sur Rx.
j'aimerais savoir si il n'existe pas 1 autre moyen pour ecrire ou lire sur
le port que celui d'utiliser un write et read qui semble poser probleme.
De plus, j'ai trouvé comment ne pas bloquer en cas de non reception de
données en read, mais justement ca ne lit plus rien.
Je sais que mon read fonctionne correctement puisque je peux lire
l'identification de la carte lors de son redemarrage si je suis en attente
de lecture.
Merci de m'aider un peu.
-
Stéphane
steph10200_no_spam@ifrance.com
retirez nospam pour répondre par mail

Poser une question


Essaie de reposer ta question sur fr.comp.os.unix, tu as plus de chance
de trouver des gens qui connaissent la réponse qu'ici...
[...]
Je n'y connais rien en lecture/écriture des ports séries, mais ça me
semble curieux d'utiliser un unique "file descriptor" en
lecture/écriture au lieu de deux, l'un pour la lecture, l'autre pour
l'écriture.
--
Richard
je vais essayer d'utiliser 2 fd.
Merci
--
----
Stéphane
retirez nospam pour répondre par mail
---
"Richard Delorme" 41f22aac$0$26212$
Non, il peut être en mode read-write, ça dépend du pilote qui est
derrière (dans ce cas précis je n'en sais rien).
Par contre ce que je trouve étrange c'est de lire dans "buf" et
d'envoyer "s" à printf.
En plus je ne crois pas que "%s" soit le format correspondant à ce que
tu veux.
Je verrais plutôt : printf(" recu : %c%cn",buf[0],buf[1]);
car "buf" n'est pas une chaîne de caractères bien formée avec son joli
' ' final.
A+
Jacques
ouais, je c, g depuis le post, corrigé la petite erreur, mais rien ne change
!!
Es ce qu'il y a 1 registre de reception que l'on pourrait lire directement
sans passer par une fonction haut niveau comme read ?
----
Stéphane
retirez nospam pour répondre par mail
---
"jz" 41f234d5$0$16411$
On dirait qu'il manque des lettres à ton clavier.
Pour être bien vu (et bien lu) :
http://www.giromini.org/usenet-fr/repondre.html :)
C'est le rôle du pilote de ton appareil. Pour simplifier, il
intercepte les read et write sur le device et il les adapte au
matériel. Si tu as accès aux sources ou à une documentation décente tu
peux savoir comment il fait, sinon...
Tu dis avoir "débloqué" le read. S'il bloquait, c'est que la carte
n'envoyait pas de données. Elle est peut-être mal initialisée, ou
simplement lente. Forcer un mode non bloquant ne résout pas le
problème. Il faut tester la valeur de retour de read pour savoir s'il
a réussi ou échoué (idem pour write).
Il faut peut-être aussi ne pas lire et écrire trop vite (un seul octet
à la fois, avec un petit délai entre eux).
select(...) peut aider ton programme à s'adapter si c'est juste un
problème de temps de réponse de la carte.
Comme te l'a dit Richard, essaie de poser ta question sur un groupe
unix, tu auras un peu plus de chance de trouver quelqu'un qui sait
comment piloter ta carte.
A+
Jacques