> Le Mercredi 24 Septembre 2003 15:40, PierreDu a écrit : > > Je suis en train de programmer un petit truc en Python, qui doit envoyer > > des données sur port série... Quelqu'un sait-il comment on fait sous > > linux (un didacticiel en français serait le bienvenu !!!) > > Probablement en utilisant le fichier /dev/ttyS0 (ou les autres, suivant le > port que tu veux utiliser), mais je n'en sais pas plus.
Pour python je n'ai rien. Mais pour le port série c'est la après : Le port série sous LINUX : Il existe pas mal d'aide sur le net, je m'en suis inspiré pour tapper cela. Vous trouverez qcq lien a la fin de ce document. Avant toute chose prenez la peine de lire le how to linux sur la programmation serie, cela donne une bonne entrée en matière. Voyons maintenant ce qui est utile pour la programmation : * Les options de open : SYNOPSIS #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); int creat(const char *pathname, mode_t mode); DESCRIPTION open essaye d'ouvrir un fichier et retourne un descripteur de fichier (petit entier non négatif à utiliser avec read, write, etc...) flags est l'un des éléments O_RDONLY, O_WRONLY ou O_RDWR qui réclament respectivement l'ouverture du fichier en lecture seule, écriture seule, ou lecture/écriture. flags peut aussi être un OU binaire ( | ) avec un ou plusieurs des éléments suivants : O_CREAT Créer le fichier s'il n'existe pas. O_EXCL En conjonction avec O_CREAT, déclenchera une erreur si le fichier existe, et open échouera. La solution consiste à créer un fichier unique sur le même système de fichiers (par exemple avec le pid et le nom de l'hôte), utiliser link(2) pour créer un lien sur un fichier de verrouillage et d'utiliser stat(2) sur ce fichier unique pour vérifier si le nombre de liens a augmenté jusqu'à 2. Ne pas utiliser la valeur de retour de link(). O_NOCTTY Si pathname correspond à un périphérique de terminal -- voir tty(4) --, il ne deviendra pas le terminal contrôlant le processus même si celui-ci n'est attaché à aucun autre terminal. O_TRUNC Si le fichier existe il sera tronqué. O_APPEND Le fichier est ouvert en mode "ajout". Initialement, et avant chaque write, la tête de lecture/écriture est placée à la fin du fichier comme avec lseek... O_NONBLOCK or O_NDELAY Le fichier est ouvert en mode "non-bloquant". Ni la fonction open ni aucune autre opération ultérieure sur ce fichier ne laissera le processus appelant en attente. O_SYNC Le fichier est ouvert en écriture synchronisée. Chaque appel à write sur le fichier bloquera le processus appelant jusqu'à ce que les données aient été écrites physiquement sur le support matériel.(voir la section RESTRICTIONS dans le man). Certains de ces attributs optionnels peuvent être modifies par la suite avec la fonction fcntl. * La configuration de la liaison : DESCRIPTION Les fonctions termios établissent une interface générale sous forme de terminal, permettant de contrôler les ports de communication asynchrone. Plusieurs fonctions décrites (man) utilisent un argument termios_p qui est un pointeur sur une structure termios. Cette structure contient les membres suivants : tcflag_t c_iflag; /* modes d'entrée */ tcflag_t c_oflag; /* modes de sortie */ tcflag_t c_cflag; /* modes de contrôle */ tcflag_t c_lflag; /* modes locaux */ cc_t c_cc[NCCS]; /* caracteres de contrôle */ Les champs de la structure termios Nous n'allons pas détailler ici l'ensemble des champs de cette structure car ils sont trop nombreux. Seuls les champs utiles seront abordés. c_iflag : les modes d'entrée Ils définissent un traitement à appliquer sur les caractères en provenance de la liaison série : IGNBRK : les caractères BREAK sont ignorés. IGNPAR : les caractères qui comportent une erreur de parité sont ignorés. ISTRIP : dans le cas d'une transmission sur 8 bits, le huitième bit est systématiquement mis à zéro. c_oflag : les modes de sortie Ils définissent un traitement à appliquer sur les caractères envoyés sur la liaison série. On y trouve notamment OLCUC qui transforme les minuscules (non accentuées !) en majuscules. c_cflag : Les modes de contrôle Ce champ est important, car c'est ici que l'on définit le débit, la parité utilisée, les bits de donnée et de stop, ... CLOCAL : si ce flag n'est pas utilisé, une déconnexion (ie. chute du signal DCD) entraîne la fermeture automatique du port série et les prochains appels à read() renverront la valeur -1. (connexion locale, pas de controle par le modem) CRTSCTS : controle de flux materiel (uniquement utilise si le cable a les lignes necessaires. Voir la section 7 du Serial-HOWTO). CREAD : permet la reception des caracteres IGNPAR : ignore les octets ayant une erreur de parite. ICRNL : transforme CR en NL (sinon un CR de l'autre cote de la ligne ne terminera pas l'entree). Sinon, utiliser l'entree sans traitement (device en mode raw). CS5 : chaque caractère est composé de 5 bits. CS6 : chaque caractère est composé de 6 bits. CS7 : chaque caractère est composé de 7 bits. CS8 : chaque caractère est composé de 8 bits (c'est le cas le plus fréquent). CSTOPB : on utilise 2 bits de stop au lieu d'un seul par défaut (sauf en 5 bits, où on utilise 1,5 bits). HUPCL (Hang UP on CLose) : provoque la déconnexion (ie. chute des signaux DTR et RTS) lors de la fermeture du port série par l'appel système close(). PARENB : activation du mécanisme de parité paire. PARODD : utilisation d'une parité impaire au lieu d'une parité paire par défaut. B50 : liaison à 50 bits/s. B75 : liaison à 75 bits/s. ... 230400 : liaison à 230400 bits/s. 460800 : liaison à 460800 bits/s. c_lflag : les modes locaux Ce champ est d'une importance capitale : il définit le mode (canonique ou non) et la gestion de l'écho. ECHO : un écho des caractères reçus est effectué. ICANON : passage en mode canonique, c'est-à-dire que les caractèes reçus sont stockés dans un tampon et qu'ils ne sont disponibles qu'à la réception d'un caractère eol (de code ASCII décimal 10). Les caractères erase et kill permettent respectivement d'effacer le dernier caractère et tous les caractères de la ligne courante. En mode non-canonique (le mode par défaut), tous les caractères sont immédiatement disponibles à la lecture. Entree canonique C'est le mode de fonctionnement normal pour les terminaux, mais peut egalement etre utilise pour communiquer avec d'autres peripheriques. Toutes les entrees sont traitees lignes par lignes, ce qui signifie qu'un read ne renverra qu'une ligne complete. Une ligne est terminee par defaut avec un caractere NL (ACII LF), une fin de fichier, ou un caractere de fin de ligne. Un CR (le caractere de fin de ligne par defaut de DOS et Windows) ne terminera pas une ligne, avec les parametres par defaut. L'entree canonique peut egalement prendre en charge le caractere erase, d'effacement de mot, et de reaffichage, la traduction de CR vers NL, etc... Entree non canonique L'entree non canonique va prendre en charge un nombre fixe de caractere par lecture, et autorise l'utilisation d'un compteur de temps pour les caracteres. Ce mode doit etre utilise si votre application lira toujours un nombre fixe de caracteres, ou si le peripherique connecte envoit les caracteres par paquet. Entree asynchrone Les deux modes ci-dessus peuvent etre utilises en mode synchrone ou asynchrone. Le mode synchrone est le mode par defaut, pour lequel un appel a read sera bloquant, jusqu'a ce que la lecture soit satisfaite. En mode asynchrone, un appel a read retournera immediatement et lancera un signal au programme appelant en fin de transfert. Ce signal peut etre recu par un gestionnaire de signal. Attente d'entree depuis de multiples sources Cela ne constitue pas un mode d'entree different, mais peut s'averer etre utile, si vous prenez en charge des peripheriques multiples. Dans mon application, je traitais l'entree depuis une socket TCP/IP et depuis une connexion serie sur un autre ordinateur quasiment en meme temps. L'exemple de programme donne plus loin attendra des caracteres en entree depuis deux sources. Si des donnees sur l'une des sources deviennent disponibles, elles seront traitees, et le programme attendra de nouvelles donnees. L'approche presentee plus loin semble plutot complexe, mais il est important que vous vous rappeliez que Linux est un systeme multitache. L'appel systeme select ne charge pas le processeur lorsqu'il attend des donnees, alors que le fait de faire une boucle jusqu'a ce que des caracteres deviennent disponibles ralentirait les autres processus. c_cc : les caractères de contrôle C'est un tableau de caractères. Des constantes sont définies pour accéder à quelques éléments particuliers : VERASE : en mode canonique, c'est le caractère erase, qui provoque l'effacement du dernier caractère. VKILL : en mode canonique, c'est le caractère kill, qui provoque l'effacement de toute la ligne. VEOF : en mode canonique, c'est le caractère de fin de fichier lorsqu'il est utilisé seul sur une ligne. Le prochain appel à read() renverra une valeur nulle. VEOL : en mode canonique, c'est le caractère de fin de ligne. C'est lui qui rend disponibles à la lecture tous les caractères précédents. VMIN : en mode non-canonique, spécifie le nombre de caractéres que doit contenir le tampon pour être accessible à la lecture. En général, on fixe cette valeur à 1. VTIME : en mode non-canonique, spécifie, en dixièmes de seconde, le temps au bout duquel un caractère devient accessible, même si le tampon ne contient pas c_cc[VMIN] caractères. Une valeur de 0 représente un temps infini. * Read et Select : ssize_t read(int fd, void *buffer, size_t n); Cette fonction lit n octets dans le fichier dont le descripteur est fd et les place dans un buffer. En cas de réussite, elle renvoie le nombre d'octets transferés, sinon elle retourne -1. Multiplexage d'entrées-sorties NOM select, FD_CLR, FD_ISSET, FD_SET, FD_ZéRO - Multiplexage d'entrées/sorties synchrones. SYNOPSIS #include <sys/time.h> #include <sys/types.h> #include <unistd.h> int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); FD_CLR(int fd, fd_set *set); FD_ISSET(int fd, fd_set *set); FD_SET(int fd, fd_set *set); FD_ZéRO(fd_set *set); DESCRIPTION select attend des changements d'état sur plusieurs descripteurs de fichiers. Il y a trois ensembles indépendants de descripteurs qui sont surveillés simultanement. Ceux de l'ensemble readfds seront surveillés pour vérifier si des caracteres deviennent disponibles en lecture. Les descripteurs de l'ensemble writefds seront surveillés pour vérifier si l'on peut écrire immédiatement sur eux. Ceux de l'ensemble exceptfds seront surveillés pour l'occurence de conditions exceptionnelles.Il en existe deux types : l'arrivée de données hors-bande sur une socket, et la disponibilite d'informations d'état concernant un pseudo-terminal en mode paquet. On peut indiquer un pointeur NULL à la place d'un ensemble si l'on ne veut pas en tenir compte. En sortie, les ensembles sont modifiés pour indiquer les descripteurs qui ont changé de statut. Quatre macros sont disponibles pour la manipulation des ensembles : FD_ZéRO efface un ensemble (initialisation à zéro d'un ensemble). FD_SET et FD_CLR : ajoutent et suppriment un descripteur dans un ensemble. FD_ISSET verifie si un descripteur est contenu dans un ensemble, principalement utile après le retour de select. n est le numero du plus grand descripteur des 3 ensembles, plus 1. En fait, c'est le plus élevé numéro de descripteur d'E/S présent dans l'un des 3 ensembles de descripteurs (readfds, writefds, exceptfds) timeout est une limite supérieure au temps passé dans select avant son retour. Elle peut être nulle, ce qui conduit select à retourner immédiatement. Si le timeout est NULL (aucun), select peut bloquer indéfiniment. VALEUR RENVOYÉE En cas de réussite select renvoie le nombre de descripteurs dans les ensembles, qui peut être nul si le délai de timeout a expiré avant que quoi que ce soit d'intéressant ne se produise. select retourne -1 s'il échoue, auquel cas errno contient le code d'erreur. Si vous voulez plus de détails sur select faîtes man select. * Write : ssize_t write(int fd, const void *buffer, size_t n); Cette fonction écrit n octets dans le fichier dont le descripteur est fd à partir d'un buffer. Cette fonction retourne le nombre d'octets écrits ou -1 en cas d'erreur. Liens internet: http://charmed.chez.tiscali.fr/howtofr/Serial-Programming-HOWTO.gz http://www.linuxmag-france.org/vrac/serie.html http://echo-linux.alienor.fr/articles/ports-series/ports_series.html http://users.skynet.be/pcamus/isil/rs232.pdf http://perso.wanadoo.fr/bernard.le.fol/tp_manip_fichiers/node8.html
Vous souhaitez acquerir votre Pack ou des Services MandrakeSoft? Rendez-vous sur "http://www.mandrakestore.com"