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">&nbsp;</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">&nbsp;</td>
  </tr>
  <tr> 
    <td height="227" valign="top" width="170">&nbsp;</td>
    <td bgcolor="#ffffff" height="227" width="10">&nbsp;</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&#339;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 &#8230;</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> &amp; 
        <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&#339;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
 &amp;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, &amp;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>&nbsp;</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
 &amp;Byte,                //Pointeur sur la donne  envoyer
 1,                    //Nombre de byte  envoyer
 &amp;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
 &amp;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
 &amp;Byte,               //Conteneur pour rcuprer le byte lu
 1,                   //Nombre de byte  lire
 &amp;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>&nbsp;</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">&nbsp;</td>
  </tr>
  <tr> 
    <td height="27" valign="top" width="170">&nbsp;</td>
    <td bgcolor="#ffffff" height="27" width="10">&nbsp;</td>
    <td bgcolor="#ffffff" height="27" valign="top">&nbsp;</td>
    <td bgcolor="#ffffff" height="27" width="10">&nbsp;</td>
  </tr>
  <tr> 
    <td height="29" valign="top" width="170">&nbsp;</td>
    <td bgcolor="#ffffff" height="29" width="10">&nbsp;</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">&nbsp;</td>
  </tr>
  <tr> 
    <td height="9" valign="top" width="170">&nbsp;</td>
    <td bgcolor="#ffffff" height="9" width="10">&nbsp;</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">&nbsp;</td>
  </tr>
  <tr> 
    <td height="34" valign="top" width="170">&nbsp;</td>
    <td bgcolor="#ffffff" height="34" width="10">&nbsp;</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>&nbsp;</p>
      </div>
    </td>
    <td bgcolor="#ffffff" height="34" width="10">&nbsp;</td>
  </tr>
</tbody></table>
</body></html>