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
---
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
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
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
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); }
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
---
"jz" <jz@jz.jz> a écrit dans le message news:
41f2d22c$0$14943$626a14ce@news.free.fr...
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);
}
"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); }
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.
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
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.
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.