> 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";

Répondre à