Bonjour à tous,
Je sèche un peux sur l'algo de programmation d'une liaison série de type RS232 en utilisant termios pour lire le changement d'état des signaux DSR /CTS.
Dans le cas d'un PC standard linux sur x86 je souhaiterai lire l'état des signaux de contrôles par interruption et non en scrutant toutes les 3ms. Je souhaiterai que ma fonction getDSR soit bloquante et réveillé seulement sur changement d'état. Mais je ne vois pas comment faire ça.
Donc je viens vers vous pour savoir si il est possible que ma fonction DSR soit bloquante ou si je dois me contenter de ma tempo?
Ci-dessous le code simpliste qui illustre mon problème.
int getDSR()
{
int val = 0;
if(ioctl(fd, TIOCMGET, &val) < 0 )
{
printf("ioctl TIOCMGET errno=%d\n", errno);
exit(EXIT_FAILURE);
}
if( val & TIOCM_DSR)
{
return 1;
}
else
{
return 0;
}
}
int main( int argc, char** argv )
{
...
int last_state, new_state;
last_state = 0;
while(1)
{
if ((new_state = getDSR()) != last_state)
{
printf("get DSR=%d", new_state);
last_state = new_state;
}
usleep(3000); // 3ms
}
...
}
Merci d'avance pour vos réponses,
Nicofonk
# TIOCMIWAIT
Posté par Mali (site web personnel) . Évalué à 2.
un exemple en python, mais celà doit être traduisible en C
http://stackoverflow.com/questions/5904895/python-monitor-serial-port-rs-232-handshake-signals
[^] # Re: TIOCMIWAIT
Posté par Mali (site web personnel) . Évalué à 4.
Tu as un exemple en C ici
http://www.linuxquestions.org/questions/programming-9/serial-port-programming-285597/
Bonne chance,
[^] # Re: TIOCMIWAIT
Posté par nicofonk (site web personnel) . Évalué à 2.
J'avais épluché l'header termios.h mais j'ai pas pensé à aller voir le ioctls.h. Je me doutais bien qu'il y avait une astuce mais j'arrivais pas à la trouver.
Par contre la requête TIOCMIWAIT est compatible uniquement sur des système à base de Linux avec un appel ioctl j'ai l'impression. Et n'est pas POSIX à priori. Du moins je ne retrouve pas la requête TIOCMIWAIT sur le système embarqué propriétaire sur lequel je bosse qui est "POSIX.1 Standard". Aucune primitive POSIX correpond à un appel bloquant pourrait faire l'affaire. Un tcgetattr à la limite mais le man ne référence pas TIOCMIWAIT.
Du coup je suis obligé d'adapter mon code suivant la plateforme(OS Linux, OS Posix) ou de faire du pooling dans tous les cas :/
Je m'y perds un peut un peu avec tout ce qui est POSIX je vais creuser un peu cette norme/certification...
En tout cas, merci pour la réactivité,
[^] # Re: TIOCMIWAIT
Posté par Mali (site web personnel) . Évalué à 2.
Ah bah ouais, en même temps, c'est linuxfr ici :D
[^] # Re: TIOCMIWAIT
Posté par nicofonk (site web personnel) . Évalué à 2.
Je viens de trouver un article excellent sur Linux ou POSIX.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.