Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

probleme avec communication serie

7 réponses
Avatar
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.

file://includes
#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>
// ajouté pour le outb, nessesaire pour alimenter la maquette.
#include <asm/io.h>
// fin insertion par sm1
#include "rs232.h"
#include "main.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é\n");
exit (0);
}

if (debug) printf("\nfd : %i \r\n",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.

Merci de m'aider

----
Stéphane
steph10200_no_spam@ifrance.com
retirez nospam pour répondre par mail

---

7 réponses

Avatar
Thomas Labourdette
Steph a écrit le Samedi 22 Janvier 2005 00:42 :
[...]

write (fd, s, strlen(s));
read (fd, buf, 2);
printf(" recu : %s",s);

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.


Comment sais-tu que tu ne reçois pas de données ?
ton printf affiche ce que tu as écris (s) et non ce que tu a reçu (buf).

@+
--
Raymond NOMSURLALISTE (signature aléatoire)
Qui ne pète ni ne rote est voué à l'explosion.

Avatar
Steph
"Thomas Labourdette" a écrit dans le message
news:
Steph a écrit le Samedi 22 Janvier 2005 00:42 :
[...]

write (fd, s, strlen(s));
read (fd, buf, 2);
printf(" recu : %s",s);

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.


Comment sais-tu que tu ne reçois pas de données ?
ton printf affiche ce que tu as écris (s) et non ce que tu a reçu (buf).

@+
--
Raymond NOMSURLALISTE (signature aléatoire)
Qui ne pète ni ne rote est voué à l'explosion.

bonjour,


Oui je sais bien, j'ai corrigé ce n'etait rien.

voila ou j'en suis pour le moment :

// ... (ouverture fichier ...
char *s='N';
ecrit=write (fd, s,1);
// tcdrain(fd);
lu=read (fd, buf, 1);

printf("ecrit : %d, buff : %c-%c-%c-%c-%c-%c-%c-%c-%c (%d)n lu : %d n
buff complet : %s
n",ecrit,buf[0],buf[1],buf[2],buf[3],buf[4],buf[5],buf[6],buf[7],buf[8],buf
[3],lu,buf);
// ...
// fermeture ...

d'apres la notice du kit, si j'envoie un N, on devrait me répondre un N

Merci


--
----

Stéphane

retirez nospam pour répondre par mail

---


Avatar
jz
Steph wrote:
...
char *s='N';
ecrit=write (fd, s,1);


Ton compilateur accepte ça sans râler ?

Il faudrait faire :
char *s="N"; // guillemets, pas apostrophes
ecrit=write (fd, s,1);

ou bien :
char s='N';
ecrit=write (fd, &s,1);

Un caractère isolé n'est pas assimilable à une chaîne d'un seul
caractère.


// tcdrain(fd);
lu=read (fd, buf, 1);


Pour lire sur des sockets ou autres devices "lents" il vaut mieux
faire un truc du genre :
while ((lu=read (fd, buf, 1)) == 0)
{}
Attend une lecture sans rien faire, mais ça peut ne jamais finir, et
le processeur bosse pour rien. Il faut un compteur d'échecs ou un
timer quelconque.

ou encore mieux utiliser select(...) qui permet de gérer facilement et
proprement des délais d'attente.


...
d'apres la notice du kit, si j'envoie un N, on devrait me répondre un N


C'est vachement puissant comme kit :)

A+
Jacques

Avatar
Steph
"jz" a écrit dans le message news:
41f2d22c$0$14943$
Steph wrote:
...
char *s='N';
ecrit=write (fd, s,1);


Ton compilateur accepte ça sans râler ?


Oui aucun probleme. justement, si je met "N" ou pas de *, il me retourne un
warning.

Il faudrait faire :
char *s="N"; // guillemets, pas apostrophes
ecrit=write (fd, s,1);

ou bien :
char s='N';
ecrit=write (fd, &s,1);

Un caractère isolé n'est pas assimilable à une chaîne d'un seul
caractère.


// tcdrain(fd);
lu=read (fd, buf, 1);


Pour lire sur des sockets ou autres devices "lents" il vaut mieux
faire un truc du genre :
while ((lu=read (fd, buf, 1)) == 0)
{}


Le truc c'est que read me retourne toujours -1. (donc erreur je suppose)

Attend une lecture sans rien faire, mais ça peut ne jamais finir, et
le processeur bosse pour rien. Il faut un compteur d'échecs ou un
timer quelconque.

ou encore mieux utiliser select(...) qui permet de gérer facilement et
proprement des délais d'attente.


J'ai vu quelques exemple avec select, mais j'ai quelques problemes a
saisir tout ca.
Je n'ai pas vraiment de delais d'attente (enfin de l'ordre de 500ms max)


...
d'apres la notice du kit, si j'envoie un N, on devrait me répondre un N


C'est vachement puissant comme kit :)


Bin ouais comme ca on sait si ce que l'on a envoyé a été correctement
reçu !!


A+
Jacques



Débutons par le commencement, je pense que j'ai 1 mauvaise config des
registres du port.
Je dois configurer mon port avec 1 vitesse de 9600, pas de parité, 8 bits de
données, 1 bit d'arret, pas de controle de flux (d'apres notice)

voici ce que j'ai mis dans mon ouverture de port : (d'apres plusieurs
sites, (j'ai pas vraiment de connaissance la dessus))


void main (void){

int fd;
struct newtio;
struct termios termios_p;

char buf[10];
int ecrit, lu;
int i;
char data='!';
int debug=2;
int com=1;
if (debug) printf("comport:%i n",com);
if (debug) printf("ntrying to open com 1 fd=");
fd = open(COM_PORT1,O_RDWR | O_NOCTTY | O_NONBLOCK); //
ouverture du port en non bloquant
if (debug) printf("nPort com 1 ouvert");
if (fd==-1) {
printf("Ne peux pas ouvrir le port com demandén");
exit (0);
}

if (debug) printf("nfd : %i rn",fd);

tcgetattr(fd,&termios_p);

termios_p.c_cflag &= ~CBAUD;
termios_p.c_cflag &= ~CBAUDEX;
termios_p.c_cflag |= BAUDRATE;

termios_p.c_cflag &= ~PARODD; // pas parité
termios_p.c_cflag &= ~PARENB; // Pas de parité
termios_p.c_cflag &= ~CSIZE; // 8 bits
termios_p.c_cflag |= CS8; // 8 bits

/* Sauvegarde des nouveaux parameres */
tcsetattr(fd,TCSANOW,&termios_p);

write
read

close


Voila,

Y a t il quelque chose qui cloche la dedans ?

Merci


--
----

Stéphane

retirez nospam pour répondre par mail

---


Avatar
Emmanuel Delahaye
Steph wrote on 23/01/05 :
char *s='N';
ecrit=write (fd, s,1);


Ton compilateur accepte ça sans râler ?


Oui aucun probleme. justement, si je met "N" ou pas de *, il me retourne un
warning.


J'y crois pas.

char *s = 'N';

n'est pas du C.


char s = 'N';
char *s = "N";

sont corrects.

Quel est ton compilateur ?

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"Mal nommer les choses c'est ajouter du malheur au
monde." -- Albert Camus.



Avatar
Steph
"Emmanuel Delahaye" a écrit dans le message news:

Steph wrote on 23/01/05 :
char *s='N';
ecrit=write (fd, s,1);


Ton compilateur accepte ça sans râler ?


Oui aucun probleme. justement, si je met "N" ou pas de *, il me retourne
un


warning.


J'y crois pas.

char *s = 'N';

n'est pas du C.


char s = 'N';
char *s = "N";


autant, pour moi,
j'ai
char s = 'N';
et
write(fd,&s,1);

sont corrects.

Quel est ton compilateur ?


gcc 3.2

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"Mal nommer les choses c'est ajouter du malheur au
monde." -- Albert Camus.






Avatar
jz
Steph wrote:
...
char *s='N';
ecrit=write (fd, s,1);


Ton compilateur accepte ça sans râler ?


Oui aucun probleme. justement, si je met "N" ou pas de *, il me retourne un
warning.


char *s='N';
revient à initialiser un pointeur avec un code ascii. Dans l'absolu tu
as le droit, mais ça n'a que rarement un sens, et le compilateur
devrait le signaler. gcc le fait, même sans l'option -Wall.

ecrit=write (fd, s,1);
envoie alors le contenu de cette adresse. *Si tu as le droit de la
lire*, il y a 1 chance sur 256 que ce soit un 'N', c'est peu.

...
Pour lire sur des sockets ou autres devices "lents" il vaut mieux
faire un truc du genre :
while ((lu=read (fd, buf, 1)) == 0)
{}
Le truc c'est que read me retourne toujours -1. (donc erreur je suppose)



Là j'ai écrit trop vite. Il faut plutôt :
while ((lu=read (fd, buf, 1)) != 1){}

mais de toute façon j'insiste, ce n'est pas la bonne solution,
select() est là pour faire ça proprement.

Je n'ai pas vraiment de delais d'attente (enfin de l'ordre de 500ms max)


500ms c'est très très long pour une machine.

Je dois configurer mon port avec 1 vitesse de 9600, pas de parité, 8 bits de
données, 1 bit d'arret, pas de controle de flux (d'apres notice)


En fait c'est une communication série classique.
Comme tu as ouvert un fil sur fr.comp.os.unix je t'envoie un exemple
là-bas, c'est mieux pour la charte.

A+
Jacques