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