File "portserie.htm"
Full Path: /home/analogde/www/Emile/PATRICE/Prog/portserie.htm
File size: 18.92 KB
MIME-type: text/html
Charset: 8 bit
<html><head><title>CodePPC - Programmez votre Pocket PC</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css">
<!--
.daterubrique { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 8pt; font-style: normal; font-weight: normal; color: #000000; background-color: #CCCCFF}
.rubrique { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 8pt; font-style: normal; font-weight: normal; color: #003333 }
.Code { font-family: "Courier New", Courier, mono; font-size: 8pt; background-color: #CCCCCC}
-->
</style></head>
<body bgcolor="#000000">
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody><tr>
<td height="41" valign="top" width="170">
<div align="center"><a href="http://www.codeppc.com/index.htm"><img src="portserie_fichiers/logo.jpg" border="0" height="186" width="160"></a></div>
</td>
<td bgcolor="#ffffff" height="41" width="10"> </td>
<td bgcolor="#ffffff" height="41" valign="top">
<p align="center"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><img src="portserie_fichiers/codeppc.gif" height="40" width="150"><br>
<span class="rubrique"><b>Le premier site francophone ddi
au dveloppement Pocket PC</b></span></font></p>
<hr>
<p align="center"><img src="portserie_fichiers/titreevc2.gif" height="91" width="355"></p>
<table class="rubrique" align="center" border="1" cellpadding="0" cellspacing="0" width="100%">
<tbody><tr>
<td width="40">
<div align="center"><img src="portserie_fichiers/api.gif" height="32" width="32"></div>
</td>
<td>
<div align="center"> <b>Gestion du port srie pour Pocket PC
et Windows CE</b></div>
</td>
</tr>
</tbody></table>
</td>
<td bgcolor="#ffffff" height="41" width="10"> </td>
</tr>
<tr>
<td height="227" valign="top" width="170"> </td>
<td bgcolor="#ffffff" height="227" width="10"> </td>
<td align="center" bgcolor="#ffffff" height="227" valign="top">
<div class="rubrique" align="left">
<p><br>
<br>
Les ports sries sont l'un des modes de communication qui est
souvent utilis en industrie. Lors de projet, on doit implmenter
une couche de communication pour les ports sries et rgulirement
le document associ fournit par le constructeur de carte lectronique
est un exemple en C pour attaquer directement le HardWare de votre matriel.
Or si vous disposez d'un OS tel que Windows CE, alors vous vous rendrez
rapidement compte que ce type d'accs direct vous est interdit.
Vous tes obligs de passer par un driver.</p>
</div>
<p class="rubrique" align="left">Cet article vous expliquera l'utilisation
des fonctions API qui utilisent les fonctions de vos drivers de base qui
vous seront utiles pour programmer une communication via les ports srie
que se soit pour Pocket PC ou Windows CE en gnral.</p>
<p class="rubrique" align="left"><br>
<img src="portserie_fichiers/checkmark.gif" align="middle" height="20" width="20"><b>Comment
utiliser un port srie via les API ?</b></p>
<p class="rubrique" align="left">Pour pouvoir effectuer une communication
via un port srie, il faut en premier lieu pouvoir l'atteindre
par l'intermdiaire de l'OS. Pour effectuer cette manœuvre,
on dispose d'API permettant d'obtenir un chemin entre votre application
et le port srie en passant successivement les couches de l'OS
et des drivers associs la gestion des ports srie.</p>
<p class="rubrique" align="left">La fonction <b>CreateFile</b> va vous renvoyer
une instance sur le chemin d'accs qui vous permettra d'utiliser
votre port srie. Il vous suffit seulement de lui passer en paramtre
le nom du port que vous souhaitez utiliser. Cette fonction va par la suite
rcuprer dans la base de registre les informations correspondant
au port de communication dsign tel que son adresse de
base, etc …</p>
<p class="rubrique" align="left">Une fois que vous possdez ce chemin
d'accs, vous devez passer l'tape suivant qui
est la configuration du port srie. Pour ce faire, il faut configurer
le registre hardware du port via les fonctions <b>GetCommState</b> &
<b>SetCommState</b>.</p>
<p class="rubrique" align="left">Ces fonctions vont rcuprer
dans une structure les informations du registre pour ensuite les remettre
modifies selon vos dsirs. </p>
<p class="rubrique" align="left">Une fois ces tapes finalises,
vous pouvez commencer dialoguer. Pour envoyer un caractre
sur le port srie, vous devez utiliser la fonction <b>WriteFile</b>.
Pour Recevoir un caractre sur le port srie, vous devez
utiliser la fonction <b>ReadFile</b>.</p>
<p class="rubrique" align="left">Pour mettre fin la communication,
il vous suffit de librer le port srie en librant
l'instance cre prcdemment. Pour cette
manœuvre utiliser la fonction <b>CloseHandle</b>.</p>
<p class="rubrique" align="left"><br>
Explication dtaille de l'utilisation de ces fonctions
ci-aprs.</p>
<p align="left"></p>
<p class="rubrique" align="left"><img src="portserie_fichiers/checkmark.gif" align="middle" height="20" width="20"><b>Comment
avoir accs au port srie ?</b></p>
<p class="rubrique" align="left">Pour avoir accs au port srie,
il vous faut crer une instance de type HANDLE qui vous permettra
via les drivers d'activer l'utilisation d'un port.</p>
<p class="rubrique" align="left">Pour ce faire, vous disposez de cette fonction
:</p>
<div align="left">
<pre class="rubrique" align="left"><span class="Code">HANDLE CreateFile(
LPCTSTR lpFileName, // pointer sur le nom du port utiliser
DWORD dwDesiredAccess, // mode d'accs (read-write)
DWORD dwShareMode, // share mode
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // pointer to security attributes
DWORD dwCreationDisposition, // Condition pour crer l'instance
DWORD dwFlagsAndAttributes, // file attributes
HANDLE hTemplateFile // handle to file with attributes to copy
);</span></pre>
</div>
<p class="rubrique" align="left">Exemple comment:</p>
<div align="left">
<pre class="rubrique" align="left"><span class="Code">// Dclaration de notre instance pour accueillir l'accs au port srie
HANDLE hPort;
//Nom du port srie auquel on veut accder
LPSTR lpszPortName = _T("COM1:");
// Les deux points ( : ) sont important ils indiquent la
//fonction qu'il s'agit du chemin d'une ressource de communication.
//Ce chemin est connu de Windows grce la base de registre de l'OS
//Il n'est donc pas ncessaire de connatre l'adresse de
//</span><span class="Code">base du port srie en question
</span><span class="Code">//Open the serial port.
hPort = CreateFile (
lpszPortName, //Pointer to the name of the port
GENERIC_READ | GENERIC_WRITE, //accs en lecture ou en criture
0, //Share mode
NULL, //Pointer to the security attribute
OPEN_EXISTING, //Cela indique que l'instance sera cre
// condition que le port de
//communication demand existe
//et donc est connu de l'OS
0, //Port attributes
NULL); //Handle to port with
//attribute to copy</span></pre>
<pre class="rubrique" align="left"><span class="Code">//vrification sur la cration de l'instance
if ( hPort == INVALID_HANDLE_VALUE )
{
//insrer votre code d'erreur ici
}</span></pre>
</div>
<p class="rubrique" align="left"><br>
<img src="portserie_fichiers/checkmark.gif" align="middle" height="20" width="20"><b>Comment
configurer le port srie ?</b></p>
<p class="rubrique" align="left">Pour qu'une communication entre deux appareils
puisse exister, il faut qu'ils parlent le mme langage. Pour ce
faire, la configuration des ports srie doit tre identique
des deux cots.</p>
<p class="rubrique" align="left">Le procd de configuration
est simple et se passe en trois temps. <br>
- Rcuprer la structure de configuration du port srie<br>
- Mettre jour cette structure selon vos critres<br>
- Renvoyer la structure vers le port srie</p>
<p class="rubrique" align="left">Au bout de cette tape les registres
de vos ports srie sont prts, vous pouvez communiquer.</p>
<p class="rubrique" align="left">La structure du port srie :</p>
<div align="left">
<pre class="Code" align="left">typedef struct _DCB { //dcb
DWORD DCBlength; //sizeof(DCB)
DWORD BaudRate; //current baud rate
DWORD fBinary: 1; //binary mode, no EOF check
DWORD fParity: 1; //enable parity checking
DWORD fOutxCtsFlow:1; //CTS output flow control
DWORD fOutxDsrFlow:1; //DSR output flow control
DWORD fDtrControl:2; //DTR flow control type
DWORD fDsrSensitivity:1; // DSR sensitivity
DWORD fTXContinueOnXoff:1; // XOFF continues Tx
DWORD fOutX: 1; //XON/XOFF out flow control
DWORD fInX: 1; //XON/XOFF in flow control
DWORD fErrorChar: 1; //enable error replacement
DWORD fNull: 1; //enable null stripping
DWORD fRtsControl:2; //RTS flow control
DWORD fAbortOnError:1; //abort reads/writes on error
DWORD fDummy2:17; //reserved
WORD wReserved; //not currently used
WORD XonLim; //transmit XON threshold
WORD XoffLim; //transmit XOFF threshold
BYTE ByteSize; //number of bits/byte, 4-8
BYTE Parity; //0-4=no,odd,even,mark,space
BYTE StopBits; //0,1,2 = 1, 1.5, 2
char XonChar; //Tx and Rx XON character
char XoffChar; //Tx and Rx XOFF character
char ErrorChar; //error replacement character
char EofChar; //end of input character
char EvtChar; //received event character
WORD wReserved1; //reserved; do not use
} DCB; </pre>
</div>
<p align="left"></p>
<p align="left"></p>
<p class="rubrique" align="left">La fonction de rcupration
:</p>
<div align="left">
<pre class="Code" align="left">BOOL GetCommState(
HANDLE hFile, //instance d'accs de votre port srie
LPDCB lpDCB //Pointeur sur votre structure de configuration
);</pre>
</div>
<p class="rubrique" align="left">La fonction de renvoie :</p>
<div align="left">
<pre class="rubrique" align="left"><span class="Code">BOOL SetCommState(
HANDLE hFile, // instance d'accs de votre port srie
LPDCB lpDCB // Pointeur sur votre structure de configuration
);</span></pre>
<pre class="rubrique" align="left">Exemple comment :</pre>
</div>
<p class="rubrique" align="left">Vous n'tes pas oblig de
mettre jour entirement votre structure, car elle reprsente
une copie du registre du port srie et donc ce que vous ne remplirez
pas restera son ancienne valeur ou celle par dfaut.</p>
<div align="left">
<pre class="rubrique" align="left"><span class="Code">DCB PortDCB;</span></pre>
<pre class="rubrique" align="left"><span class="Code">//Rcupration des informations enregistes du port srie dans votre structure.
GetCommState (hPort, // instance d'accs de votre port srie
&PortDCB); // Structure de configuration</span></pre>
<pre class="rubrique" align="left"><span class="Code">// mise jour de la structure
PortDCB.DCBlength = sizeof (DCB);
PortDCB.BaudRate = 9600;
PortDCB.fBinary = TRUE;
PortDCB.fParity = TRUE;
PortDCB.fOutxCtsFlow = FALSE;
PortDCB.fOutxDsrFlow = FALSE;
PortDCB.fDtrControl = DTR_CONTROL_ENABLE;
PortDCB.fDsrSensitivity = FALSE;
PortDCB.fTXContinueOnXoff = TRUE;
PortDCB.fOutX = FALSE;
PortDCB.fInX = FALSE;
PortDCB.fErrorChar = FALSE;
PortDCB.fNull = FALSE;
PortDCB.fRtsControl = RTS_CONTROL_ENABLE;
PortDCB.fAbortOnError = FALSE;
PortDCB.ByteSize = 8;
PortDCB.Parity = NOPARITY;
PortDCB.StopBits = ONESTOPBIT; </span></pre>
<pre class="rubrique" align="left"><span class="Code">//Renvoie des nouvelles informations dans le registre de votre port srie
if (!SetCommState (hPort, &PortDCB))
{
//Mettre ici votre code d'erreur
}</span></pre>
<p class="rubrique" align="left"><img src="portserie_fichiers/checkmark.gif" align="middle" height="20" width="20"><b>Comment
crire sur le port srie ?</b></p>
</div>
<p class="rubrique" align="left">Pour ce faire, utiliser cette fonction
:</p>
<div align="left">
<pre class="rubrique" align="left"><span class="Code">BOOL WriteFile(
HANDLE hFile, //Instance de votre accs au port srie
LPCVOID lpBuffer, //Pointeur sur la donne crire
DWORD nNumberOfBytesToWrite, //Nombre de bytes crire
LPDWORD lpNumberOfBytesWritten, //pointeur to number of bytes written
LPOVERLAPPED lpOverlapped //Doit tre NULL pour windows CE
);</span></pre>
<div align="left">
<p> </p>
</div>
</div>
<div align="left">
<p class="rubrique" align="left">Exemple comment :</p>
</div>
<div align="left">
<pre class="rubrique" align="left"><span class="Code">DWORD dwNumBytesWritten;
BYTE Byte = 'a';</span></pre>
<pre class="rubrique" align="left"><span class="Code">if (!WriteFile (hPort, // Instance d'accs de votre port srie
&Byte, //Pointeur sur la donne envoyer
1, //Nombre de byte envoyer
&dwNumBytesWritten, //Pointer sur la variable contenant le nombre
//byte crit dans le buffer
NULL)) //Doit tre NULL pour Windows CE
{
//code d'erreur
}</span></pre>
</div>
<p align="left"></p>
<p class="rubrique" align="left"><img src="portserie_fichiers/checkmark.gif" align="middle" height="20" width="20"><b>Comment
lire sur le port srie ?</b></p>
<p class="rubrique" align="left">Le port srie peut recevoir diffrents
types d'vnements comme l'arrive d'une donne,
buffer d'envoie vide ou diffrents signaux (CTS, DSR) ce qui permet
une large manipulation de ceux-ci</p>
<p class="rubrique" align="left">Ici seul l'arrive d'une donne
nous intresse. </p>
<p class="rubrique" align="left">Exemple comment :</p>
<div align="left">
<pre class="rubrique" align="left"><span class="Code">BYTE Byte;
DWORD dwCommStatus, // variable de stockage pour les vnements
DWORD dwBytesTransferred;
//Cette fonction dfinit les vnements pour lesquels
//ont va ragir par rapport notre instance
SetCommMask (hPort,
EV_RXCHAR ); //ici EV_RXCHAR indique que l'on va dtecter la rception
//de donnes (cette entre est de type DWORD)</span></pre>
<pre class="rubrique" align="left"><span class="Code">//Cette fonction est bloquante, elle va attendre
//des vnements dfinit par le mask et
//Elle stockera le type d'vnement qui l'aura rveille dans une variable.
WaitCommEvent (hPort, //instance d'accs du port srie
&dwCommStatus, //Pointeur sur la variable de stockage pour les vnements
//Cette entre est de type LPDWORD
0); //pointeur sur la structure d'overlapped.
//Ici il n'y en a pas.
//cette entre est de type LPOVERLAPPED
//</span><span class="Code">Cette fonction permet la lecture du buffer d'entre du port srie
ReadFile (hPort, //Instance sur l'accs du port srie
&Byte, //Conteneur pour rcuprer le byte lu
1, //Nombre de byte lire
&dwBytesTransferred, //Pointer sur le nombre de byte lu, sert
//la gestion propre de la fonction read.
0); //Doit tre NULL pour Windows CE
</span><span class="Code">// Permet l'affichage de votre conteneur
Printf("%c",Byte);</span></pre>
<p><b><img src="portserie_fichiers/checkmark.gif" align="middle" height="20" width="20"></b><span class="rubrique"><b>Comment
fermer l'accs au port srie ?</b></span></p>
</div>
<p class="rubrique" align="left">Pour ce faire, utilisez cette fonction
:</p>
<div align="left">
<pre align="left" class="Code">BOOL CloseHandle(
HANDLE hObject //Instance d'accs du port srie
);</pre>
<div align="right">
<p> </p>
<p class="rubrique"><b><a href="http://www.codeppc.com/partenaires/mfactories/mfactories.htm">mFactories</a></b></p>
</div>
</div>
</td>
<td bgcolor="#ffffff" height="227" width="10"> </td>
</tr>
<tr>
<td height="27" valign="top" width="170"> </td>
<td bgcolor="#ffffff" height="27" width="10"> </td>
<td bgcolor="#ffffff" height="27" valign="top"> </td>
<td bgcolor="#ffffff" height="27" width="10"> </td>
</tr>
<tr>
<td height="29" valign="top" width="170"> </td>
<td bgcolor="#ffffff" height="29" width="10"> </td>
<td bgcolor="#ffffff" height="29" valign="top">
<div align="center"><img src="portserie_fichiers/codeppc.gif" height="40" width="150"></div>
</td>
<td bgcolor="#ffffff" height="29" width="10"> </td>
</tr>
<tr>
<td height="9" valign="top" width="170"> </td>
<td bgcolor="#ffffff" height="9" width="10"> </td>
<td bgcolor="#ffffff" height="9" valign="top">
<div align="center"><font face="Verdana, Arial, Helvetica, sans-serif" size="1"><b><font color="#6666ff">Copyright 2001-2004 - Tous droits rservs</font></b></font></div>
</td>
<td bgcolor="#ffffff" height="9" width="10"> </td>
</tr>
<tr>
<td height="34" valign="top" width="170"> </td>
<td bgcolor="#ffffff" height="34" width="10"> </td>
<td bgcolor="#ffffff" height="34" valign="top">
<div align="center">
<p><font color="#999999" face="Verdana, Arial, Helvetica, sans-serif" size="1">iPAQ
est un produit de COMPAQ.<br>
Visual Tools est un produit de Microsoft Corporation.<br>
Toutes les autres marques et produits prsents dans ces pages
sont la proprit exclusive de leurs socits
respectives.</font><font color="#999999"><br>
</font></p>
<p> </p>
</div>
</td>
<td bgcolor="#ffffff" height="34" width="10"> </td>
</tr>
</tbody></table>
</body></html>