Valeur d'une broche d'un port série

Valeur d'une broche d'un port série - C - Programmation

Marsh Posté le 29-11-2006 à 09:31:44    

Bonjour à tous,
je cherche le moyen de savoir quand un évènement est levé suite au passage d'un courant sur la broche Ring Indicator d'un port série.
 
Je suis sous Linux et en fait j'ai un device USB vu par l'OS comme une liaison série. Cet équipement a un bouton, qui est reporté sur le RI de la liaison série. Comment je fais en C pour savoir quand on appuie sur le bouton de l'équipement ? J'ai trouvé des exemples pour lire tout ce qui passe sur le port série (en mode caractères) mais pas comment avoir la valeur d'une broche particulière.
 
J'ai bien pensé à ça :
 
int fd, status, RI;
ioctl(fd, TIOCMGET, &status);
RI = status & TIOCM_RNG;
 
ou bien :
ioctl(fd, TIOCMIWAIT, TIOCM_RNG);
pour savoir si la broche a changé de statut mais je ne vois pas comment l'utiliser ensuite.
 
En fait mon problème maintenant c'est comment faire pour qu'à tout moment dans mon code si la borne RI passe à 1 un certain code se déclenche. vous feriez ça comment ? Si quelqu'un avait un lien vers un tuto sur la prog évènementielle en C ça m'aiderait.
 
Merci.

Reply

Marsh Posté le 29-11-2006 à 09:31:44   

Reply

Marsh Posté le 29-11-2006 à 11:19:06    

processus // avec des wait() et signal() je pense.

Reply

Marsh Posté le 29-11-2006 à 12:46:15    

Là je suis parti pour faire 2 processus :
- le fils boucle sur la détection de la broche du port série et se termine quand la valeur que je cherche est détectée.
- le père fait son boulot normal. J'ai mis un traitement sur le signal SIGCHLD. Quand le fils se termine, SIGCHLD est émis et récupéré par le père qui fait alors un autre boulot. Ca devrait marcher.
 
Par contre après la mort du fils, j'ai plus rien qui vérifie le port série. Si la valeur rechange je ne le sais pas. il faudrait que lorsque le fils se termine, le traitement du signal SIGCHLD recrée un fils. Et là je bloque ...

Reply

Marsh Posté le 29-11-2006 à 12:59:25    

Reply

Marsh Posté le 29-11-2006 à 13:12:09    

Oui j'avais pensé à le faire avec une file de messages dans laquelle le fils écrit et que lit le père. Mais y a des choses que je ne comprend pas avec ce genre de système : je veux un système totalement asynchrone, où un certain traitement est effectué par le père quand le fils lui indique qu'il a détecté quelque chose sur la broche du port série. Donc si je me contente de faire envoyer un message par le fils, le père va devoir boucler en lecture sur la file de message. Alors qu'avec un signal c'est asynchrone. Et comme je ne pense pas qu'il y ait de signaux déjà existants pour ce que je veux faire, j'ai fait avec SIGCHLD.
 
Ou alors je suis totalement à côté de la plaque  :cry:

Reply

Marsh Posté le 29-11-2006 à 13:27:53    

Le principe avec les docs, c'est de les lire. Surprenant, hein?
 
Même si celle que j'ai lié est particulierement vielle, je l'ai fait parce qu'elle présente, en partie, l'éventail des IPC. Les possiblités abondent: scruter de la mémoire partagée, fifo et O_NONBLOCK, sémaphores sys V et IPC_NOWAIT... j'en passe et des meilleurs.
 
Lire un bouquin sur la programation système serait un plus à ce stade.

Reply

Marsh Posté le 29-11-2006 à 13:33:04    

Merci je l'ai lu la doc. La prog système j'en ai fait y a des années mais ça m'a tellement passionné que j'ai tout oublié. Et là je suis obligé d'en refaire.
Je dois être trop bête, parce que dans ce que tu m'as gentiment indiqué, je ne comprend pas ce qui pourrait me servir pour faire un truc où le processus père reçoit un évènement déclencheur d'une certaine tâche. Mais je vais retourner m'esquinter les yeux dessus c'est pas grave.


Message édité par Profil supprimé le 29-11-2006 à 13:47:53
Reply

Marsh Posté le 29-11-2006 à 14:04:19    


 
pourquoi tuer le processus fils? Il peut simplement émetteur un signal particulier au processus père lorsqu'il détecte la valeur recherchée et poursuivre la boucle pour détecter la prochaine valeur recherchée.

Reply

Marsh Posté le 29-11-2006 à 14:07:15    

C'est exactement ce que je cherche à faire !  :pt1cable:  
Je fermais le processus fils par facilité (ça balance SIGCHLD d'office) alors que là je dois envoyer un signal moi-même et je ne sais plus faire, tout bêtement. J'ai beau relire le man de signal() et sigaction() je ne comprend pas comment faire.

Reply

Marsh Posté le 29-11-2006 à 14:11:07    

man 2 kill
 
sinon, pense aux signaux SIGUSR1 et SIGUSR2 qui là pour être utilisés comme signaux spécifiques à ton application.


---------------
TriScale innov
Reply

Marsh Posté le 29-11-2006 à 14:11:07   

Reply

Marsh Posté le 29-11-2006 à 14:13:44    

franceso a écrit :

man 2 kill
 
sinon, pense aux signaux SIGUSR1 et SIGUSR2 qui là pour être utilisés comme signaux spécifiques à ton application.


 
c'est à eux que je pensais. Et dans le processus père, faut avoir un wait(SIGUSR1) (ou truc du genre, je me souviens plus le nom de la fonction)

Reply

Marsh Posté le 29-11-2006 à 14:13:50    

OK merci beaucoup je vais faire avec ça  :)

Reply

Marsh Posté le 30-11-2006 à 13:22:37    

Le code ioctl(fd, TIOCMGET, &status) me renvoit un "Invalid argument" ... ça dit quelque chose à quelqu'un ?

Reply

Marsh Posté le 30-11-2006 à 15:11:56    

ton fd est bien un descripteur de fichier valide ?


---------------
TriScale innov
Reply

Marsh Posté le 30-11-2006 à 15:30:58    

Je me demande justement ... vu que ce que je fais s'interconnecte avec un autre code qui m'a été fourni et que le descripteur de fichier m'est donné comme variable "extern" ... je cherche de ce côté là.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed