GNT sans publicité, site mobile, fonctionnalitées exclusives...

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

Lire les 7 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Richard Delorme
Le #811946
Bonjour,

Je suis entrain de faire un programme communicant avec un kit herakles (kit
ITC).
Je suis sous linux.


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...

[...]
write (fd, s, strlen(s));

read (fd, buf, 2);

[...]

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.


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

Steph
Le #811945
ok, je vais reposter,

je vais essayer d'utiliser 2 fd.

Merci


--
----

Stéphane

retirez nospam pour répondre par mail

---
"Richard Delorme" 41f22aac$0$26212$
Bonjour,

Je suis entrain de faire un programme communicant avec un kit herakles
(kit


ITC).
Je suis sous linux.


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...

[...]
write (fd, s, strlen(s));

read (fd, buf, 2);

[...]

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.


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



jz
Le #811944
Richard Delorme wrote:

...
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.



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).

char buf[2];
...
read (fd, buf, 2);
printf(" recu : %s",s);
...


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

Steph
Le #811943
bonjour,

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$
Richard Delorme wrote:

...
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.



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).

char buf[2];
...
read (fd, buf, 2);
printf(" recu : %s",s);
...


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




jz
Le #811942
Steph wrote:
bonjour,

ouais, je c, g depuis le post, corrigé la petite erreur, mais rien ne change
!!


On dirait qu'il manque des lettres à ton clavier.

Pour être bien vu (et bien lu) :
http://www.giromini.org/usenet-fr/repondre.html :)


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 ?


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

Publicité
Suivre les réponses
Poster une réponse
Anonyme