2010-07-30 7 views
0

Je suis un débutant à développer des pilotes pour Linux .... Je développe un pilote SMS (commandes AT sur le port série vers le modem) en utilisant TTY pour accéder au port série. Le pilote est écrit en C.Pilote commandé par interruption utilisant un téléscripteur?

Dans les messages de conception du modem au conducteur peut être déclenchée par deux événements:

1) Statut de répondre aux commandes AT émises par le conducteur (ie messages attendus)

2) Indication de nouveaux messages (messages inattendus)

J'ai prévu deux fils de discussion - un pour l'écriture sur ATS et un pour la lecture ATS. Est-il possible de configurer TTY de sorte que mon thread de lecture se réveille sur les caractères entrants (c'est-à-dire que read-thread est déclenché par un événement et n'est pas basé sur l'interrogation)?

Cordialement, Witek

+0

Add-on commentaire: Je l'ai utilisé le « Guide de programmation série pour POSIX Systèmes d'exploitation » (http: // www. easysw.com/~mike/serial/serial.html) en tant qu'inspection mais n'a pas trouvé de réponse à ma question là-bas. – Witek

+0

Ce que vous voulez, c'est comment un 'read()' fonctionne sur un descripteur de fichier normal bloquant - il dort jusqu'à ce que les données soient disponibles pour la lecture (ou qu'un signal soit intercepté ou une autre condition exceptionnelle). – caf

Répondre

2

Je ne pense pas que vous voulez vraiment deux fils. Le flux de programme typique (commande d'écriture AT, réponse de réponse, etc ...) sera plus facile à écrire et déboguer dans un programme monothreaded.

L'attente des caractères peut être effectuée avec l'appel select(). La couche tty est principalement configurée par l'appel système tcsetattr, tcgetattr et amis. Avec cet appel, vous pouvez configurer si vous voulez être interrompu sur une nouvelle ligne ou sur chaque caractère par exemple. Voir man termios pour la page de manuel. Les deux grandes options sont si vous voulez que les caractères spéciaux comme EOF, EOL Ctrl-C etc ... soient traités avec des données (mode brut) ou interprétés par la couche tty (mode canonique).

Voir la partie sur une sélection dans le guide de programmation série, ou sélectionnez manpage pour plus d'informations

+1

D'accord - un seul thread devrait être bien. Utilisez 'select()' pour bloquer jusqu'à ce que les données soient disponibles depuis le port série ou tout autre client de votre pilote, puis lisez() 'les données et manipulez-les. – caf

Questions connexes