Vous êtes sur la page 1sur 10

Le composant TComPort, description

Par Vincent PETIT - Patrick PETIT

Date de publication : 25 novembre 2003 Dernire mise jour : 8 mars 2013

Dure : 15 minutes

Cet article a pour but de montrer comment accder au port srie du PC avec C++ Builder

Le composant TComPort, description par Vincent PETIT - Patrick PETIT

I - Avant-propos........................................................................................................................................................... 3 II - Gnralit sur le port srie....................................................................................................................................3 II-A - Le brochage vue de face..............................................................................................................................3 III - Format des donnes............................................................................................................................................. 4 IV - Le composant TcomPort.......................................................................................................................................4 IV-A - Ouverture du port........................................................................................................................................ 4 IV-B - Fermeture du port........................................................................................................................................4 IV-C - Changement de niveau sur les sorties RTS et DTR.................................................................................. 5 IV-D - tat d'une broche d'entre, CTS, DSR, RLSD........................................................................................... 5 IV-E - crire une chane de caractres sur TxD................................................................................................... 5 IV-F - crire une valeur sur TxD........................................................................................................................... 6 IV-G - Lecture d'une chane de caractres sur RxD............................................................................................. 6 IV-H - Lecture d'une valeur sur RxD..................................................................................................................... 6 IV-I - Vrifier les erreurs sur le port srie..............................................................................................................6 IV-J - Nombre d'octets prsents dans le buffer d'entre....................................................................................... 7 IV-K - Vider les buffers d'entre et de sortie......................................................................................................... 7 IV-L - Attendre un vnement pour excuter une action...................................................................................... 7 IV-M - Changer les paramtres du port.................................................................................................................8 IV-N - Stocker les paramtres du port dans un fichier .ini.................................................................................... 8 IV-O - Lire les paramtres du port depuis un fichier .ini........................................................................................8 IV-P - Gestion des exceptions............................................................................................................................... 9 V - Conclusion............................................................................................................................................................. 9 VI - Liens......................................................................................................................................................................9

-2Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2013 Vincent PETIT. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://petit.developpez.com/serie/cours_tcomport/

Le composant TComPort, description par Vincent PETIT - Patrick PETIT

I - Avant-propos
Dans les applications industrielles et domotiques, nous avons souvent besoin d'allier un systme lectronique une application logicielle via un port d'entre/sortie de l'ordinateur. Ce peut tre le port parallle, le port srie ou mme l'USB. Par exemple un modem externe, sur le port srie ou une imprimante avec le port parallle. Ceci dans un but d'allgement des montages lectroniques et de commodit pour tout ce qui est calcul. Bien que ce ne soit pas toujours possible, par exemple pour des systmes embarqus, ou l l'emploi d'un micro contrleur est invitable. Ce tutoriel pour but de voir, quelques mthodes de ce composant, pour l'criture, la lecture, les mises 1 des niveaux sur certaine broche, voir l'tat des entres etc... sur le port srie.

II - Gnralit sur le port srie II-A - Le brochage vue de face

Affectation : Nom C++ Builder RLSD Rx Tx DTR -DSR RTS CTS RING Broche Broche n1 Broche n2 Broche n3 Broche n4 Broche n5 Broche n6 Broche n7 Broche n8 Broche n9 Sens

DCD RxD TxD DTR Masse DSR RTS CTS RI

Entre Entre Sortie Entre -Entre Sortie Entre Entre

Description des signaux: Broche 1 : DCD ou RLSD (Data Carrier Detect) ou (Receive Line Signal Detect) cette ligne est une entre active l'tat haut. Elle signale l'ordinateur qu'une liaison a t tablie avec un correspondant ; Broche 2 : RxD (Receive Data) cette ligne est une entre. C'est ici que transitent les informations du correspondant vers l'ordinateur ; Broche 3 : TxD (Transmit Data) cette ligne est une sortie. Les donnes de l'ordinateur vers le correspondant sont vhicules par son intermdiaire ; Broche 4 : DTR (Data Terminal Ready) cette ligne est une sortie active l'tat haut. Elle permet l'ordinateur de signaler au correspondant que le port srie a t libr et qu'il peut tre utilis s'il le souhaite ; Broche 5 : GND (Ground) c'est la masse ; Broche 6 : DSR (Data Set Ready) cette ligne est une entre active l'tat haut. Elle permet au correspondant de signaler qu'une donne est prte ; Broche 7 : RTS (Request To Send) cette ligne est une sortie, qui quand elle est active est l'tat haut. Elle indique au correspondant que l'ordinateur veut lui transmettre des donnes ; Broche 8 : CTS (Clear To Send) cette ligne est une entre active l'tat haut. Elle indique l'ordinateur que le correspondant est prt recevoir des donnes ; Broche 9 : RI ou RING (Ring Indicator) cette ligne est une entre active l'tat haut. Elle permet l'ordinateur de savoir qu'un correspondant veut initier une communication avec lui.

D'un point de vue lectronique, les signaux TX et RX en sortie des prises rpondent aux normes RS232, c'est dire: 1 logique compris entre -3 et -25V et 0 logique compris entre +3 et +25V.

-3Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2013 Vincent PETIT. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://petit.developpez.com/serie/cours_tcomport/

Le composant TComPort, description par Vincent PETIT - Patrick PETIT

Bien sur, nous pouvons utiliser les broches comme bon nous semble, c'est dire par exemple, se servir de CTS autrement que pour signaler l'ordinateur que le priphrique est prt recevoir, mais il vaut quand mme mieux respecter la norme.

III - Format des donnes


La communication srie ncessite trois fils au minimum: une masse pour rfrencer les signaux, un fil metteur et un fil rcepteur. Notre liaison srie est en effet full-duplex, c'est dire que l'on peut mettre et recevoir en mme temps (comme le tlphone par exemple). La diffrence principale entre le port parallle et le port srie est que les informations ne sont pas transmises simultanment sur des fils spars (D0 D7) mais les unes aprs les autres sur un mme fil. Cela amne une conomie de cble (un fil au lieu de 8) mais un montage dcodeur devient ncessaire pour retransformer les donnes srialises. Il est bon de rappeler que le port srie, lors d'une criture par exemple, envoi le bit de poids faible (LSB) en premier. La liaison srie est totalement asynchrone. Aucune horloge n'est transmise. Il faut donc se mettre d'accord sur la vitesse de transfert des bits et rajouter des bits de synchronisation. Voici un petit rsum des diffrents paramtres rentrant en jeu lors d'une communication srie: Longueur de mot : sur le PC, le BIOS ne permet une longueur de mot que de 7 ou 8 bits ; Parit : le mot transmis peut tre suivi d'un bit de parit qui sert dtecter les erreurs ventuelles de transmission. Il existe deux parits: la parit paire et la parit impaire. Dans le cas de la parit paire, et pour le mot 10110101 contenant 5 tats 1, le bit de parit sera 1 amenant ainsi le nombre total de 1 un nombre pair (6). Dans le cas de la parit impaire, le bit de parit aurait t 0 car le nombre total de 1 est dj impair. L'intrt de ce rajout est le suivant: si jamais lors de la transmission un tat 1 est transform en tat 0 (perturbation du canal par des parasites par exemple) le nombre total de 1 change et donc le bit de parit recalcul par le rcepteur ne correspond plus celui reu. L'erreur est donc dtecte. videmment, si deux tats 1 passent 0, l'erreur ne sera pas dtecte mais la probabilit pour que cela arrive est trs faible ; Bit de start : lorsque rien ne circule sur la ligne, celle-ci est l'tat haut. Pour indiquer qu'un mot va tre transmis, la ligne passe bas avant de commencer le transfert. Cette prcaution permet de resynchroniser le rcepteur ; Bits de stop : ces bits signalent la fin de la transmission. Selon le protocole utilis, il peut y avoir 1, 1.5, ou 2 bits de stop (ces bits sont toujours 1) ; Vitesse de transmission : la plupart des cartes srie permettent de choisir une vitesse entre 300 et 9600 bauds (par exemple 300 bauds, un bit est transmis tout les un trois-centime de seconde). Les cartes rcentes proposent des vitesses jusqu' 115200 bauds. Ces vitesses ne vous paraissent peut-tre pas normes mais il faut garder l'esprit que la liaison srie est avant tout pense pour les liaisons tlphoniques par modems, dont la bande passante est trs limite.

IV - Le composant TcomPort IV-A - Ouverture du port


On dfinit pralablement, le port COM1, 2, 3 ou 4 dans l'inspecteur d'objets, (proprit Port).
//------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender) { ComPort1->Connected=true; //Ouverture du port (prt communiquer) } //-------------------------------------------------------

Le port et maintenant ouvert et prt communiquer avec un priphrique externe.

IV-B - Fermeture du port


//-------------------------------------------------------

-4Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2013 Vincent PETIT. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://petit.developpez.com/serie/cours_tcomport/

Le composant TComPort, description par Vincent PETIT - Patrick PETIT

void __fastcall TForm1::Button2Click(TObject *Sender) { ComPort1->Connected=false; //Fermeture du port (arrt des communications) } //-------------------------------------------------------

Le port srie est ferm, toutes tentatives de lecture, d'criture ou autre, dclenchera une erreur.

IV-C - Changement de niveau sur les sorties RTS et DTR


Il peut tre ncessaire d'envoyer un signal au montage reli au port du PC par une sortie. Admettons que celui ci ai besoin d'une impulsion pour diverses raisons. Nous pouvons faire ceci via RTS.
//------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender) { ComPort1->SetRTS(true); //Mise +15V de RTS ComPort1->SetRTS(false); //Mise -15V de RTS } //-------------------------------------------------------

Ou par DTR comme cela. c //------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender) { ComPort1->SetDTR(true); //Mise +15V de DTR ComPort1->SetDTR(false); //Mise -15V de DTR } //------------------------------------------------------0 1

IV-D - tat d'une broche d'entre, CTS, DSR, RLSD


Il peut tre utile de savoir quelle est le niveau sur une broche d'entre. Il faut pour cela, agir dans les vnements, des ces broches. Prenons un exemple avec CTS.
//------------------------------------------------------void __fastcall TForm1::ComPort1CTSChange(TObject *Sender, bool OnOff) { if (OnOff == true) Button1->Caption = "tat haut sur CTS"; //tat haut = +15V else Button1->Caption = "tat bas sur CTS"; //Etats bas = -15V } //-------------------------------------------------------

Si le Caption du TButton indique "tats haut sur CTS", c'est que le niveau sur celle ci est +15V. Nous pouvons procder de mme pour les autres vnements, DSR et RLSD (DCD).

IV-E - crire une chane de caractres sur TxD


Vous serez peut tre amen envoyer des caractres ASCII vers le correspondant. Voil un petit exemple de la manire procder pour faire cela.
//------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender)

-5Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2013 Vincent PETIT. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://petit.developpez.com/serie/cours_tcomport/

Le composant TComPort, description par Vincent PETIT - Patrick PETIT

} //-------------------------------------------------------

AnsiString Phrase; Phrase = Edit1->Text; ComPort1->WriteStr(Phrase); //crit toute la chane "Phrase" sur le port srie

IV-F - crire une valeur sur TxD


//------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender) { unsigned char tableau[7] = {'V', 'i', 'n', 'c', 'e', 'n', 't'}; ComPort1->Write(tableau, 7); //Ecrit 7 octets de "tableau" sur le port srie } //-------------------------------------------------------

IV-G - Lecture d'une chane de caractres sur RxD


Aprs avoir envoy une chane de caractres sur la ligne TxD, il serait bien de savoir comment la recevoir. crivons dans l'vnement OnRxChar :
//------------------------------------------------------void __fastcall TForm1::ComPort1RxChar(TObject *Sender, int Count) { AnsiString Phrase2; ComPort1->ReadStr(Phrase2, Count); //Lit les "Count" octet(s) prsent(s) dans le buffer d'entre et le(s) place dans Phrase2 } //-------------------------------------------------------

La phrase reut est stocke dans le buffer d'entre du port, qui cela dit en passant est paramtrable en taille dans l'inspecteur d'objets, proprit Buffer / Input et OutputSize. Dans cette exemple, nous remarquons bien que la lecture se fait caractre par caractre, ReadStr vient effacer le caractre dans le buffer, puis il passe au suivant et refait de mme. Une lecture peut se faire, aussi, en dehors de l'vnement OnRxChar.

IV-H - Lecture d'une valeur sur RxD


Toujours dans l'vnement OnRxChar :
//------------------------------------------------------void __fastcall TForm1::ComPort1RxChar(TObject *Sender, int Count) { unsigned char *Buf = new unsigned char [Count]; ComPort1->Read(Buf, Count); //Lit "Count" octet(s) prsent(s) dans le buffer d'entre et le(s) place dans "Buf" delete [] Buf; Buf = NULL; } //-------------------------------------------------------

Une lecture peut aussi se faire hors de cette vnement.

IV-I - Vrifier les erreurs sur le port srie


Il est possible, via l'vnement OnError, de savoir si une erreur a eu lieu sur le port srie.

-6Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2013 Vincent PETIT. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://petit.developpez.com/serie/cours_tcomport/

Le composant TComPort, description par Vincent PETIT - Patrick PETIT

//------------------------------------------------------void __fastcall TForm1::ComPort1Error(TObject *Sender, TComErrors Errors) { if (Errors.Contains(ceFrame)) { // Une erreur de frame a eu lieu, mauvaise vitesse de communication !? } if (Errors.Contains(ceOverrun)) { // Une erreur d'overrun a eu lieu, la donne suivante est errone !? } // voir l'aide de TComPort sur "LastErrors" pour continuer la gestion des erreurs } //-------------------------------------------------------

IV-J - Nombre d'octets prsents dans le buffer d'entre


//------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender) { int NbrBits; NbrBits = ComPort1->InputCount(); } //-------------------------------------------------------

Chaque fonction de lecture Read, ReadStr etc... dcrmente InputCount.

IV-K - Vider les buffers d'entre et de sortie


Nous pouvons effacer les Buffers, si une donne est juge inexploitable pour quelques raisons que se soit.
//------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender) { ComPort1->ClearBuffer(true, false); // buffer d'entre vid, celui de sortie intacte } //-------------------------------------------------------

IV-L - Attendre un vnement pour excuter une action


Lors d'un dialogue, il est parfois ncessaire d'attendre une rponse du correspondant avant de lui envoyer une commande.
//------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender) { ComPort1->Events = TComEvents(); // Effacer tous les venements ComPort1->Connected = true; TComEvents Ev; Ev << evRxChar; ComPort1->WaitForEvent (Ev, 0, 5000); // Attend un vnement OnRxChar ou 5 secondes avant de continuer if (Ev.Contains(evRxChar)) { // Executer une action, une donne est arrive } else { // Executer autre action, les 5 secondes se sont coules }
-7Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2013 Vincent PETIT. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://petit.developpez.com/serie/cours_tcomport/

Le composant TComPort, description par Vincent PETIT - Patrick PETIT

} //-------------------------------------------------------

L'utilisation de WaitForEvent se fait de la manire suivante : on efface tous les vnements de la proprit Events de TComPort. Ce qui implique qu'aucun thread n'est cr ; on ouvre le port srie ; on dclare les vnements dclencheurs de l'application ; on appel la mthode WaitForEvent avec comme paramtre, les vnements dclencheurs, 0 puis le timeout en ms. Il est possible de remplacer le timeout par "WaitInfinite" ; on test le(s) vnement(s) qui ont dclench(s).

IV-M - Changer les paramtres du port


La premire possibilit est d'appeler la mthode ShowSetupDialog.
//--------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender) { ComPort1->ShowSetupDialog (); } //---------------------------------------------------------------------------

La seconde est de placer par exemple un TComRadioGroup et d'affecter ses proprits : "AutoApply" true ; "ComPort" sur le port voulu, ComPort1, ComPort2 etc... ; "ComProperty" sur le paramtre regler, cpPort pour le port, cpBaudRate pour la vitesse etc...

La mme technique peut tre employ pour un TcomComboBox.

IV-N - Stocker les paramtres du port dans un fichier .ini


Lors de la fermeture de l'application nous pouvons crire.
//--------------------------------------------------------------------------void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { ComPort1->StoreSettings (stIniFile, GetCurrentDir() + "\\mon_fichier.ini"); ComPort2->StoreSettings (stIniFile, GetCurrentDir() + "\\mon_fichier.ini"); } //---------------------------------------------------------------------------

Attention prendre les prcautions ncessaire en cas d'chec d'criture !

IV-O - Lire les paramtres du port depuis un fichier .ini


Lors de la cration de l'application nous pouvons crire.
//--------------------------------------------------------------------------void __fastcall TForm1::FormCreate(TObject *Sender) { ComPort1->LoadSettings (stIniFile, GetCurrentDir() + "\\mon_fichier.ini"); ComPort2->LoadSettings (stIniFile, GetCurrentDir() + "\\mon_fichier.ini"); ComRadioGroup1->UpdateSettings (); // si vous avez plac un TComRadioGroup
-8Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2013 Vincent PETIT. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://petit.developpez.com/serie/cours_tcomport/

Le composant TComPort, description par Vincent PETIT - Patrick PETIT

// avec la mthode explique en 2.12 } //---------------------------------------------------------------------------

On peut procder de la mme manire pour un TcomComboBox.

IV-P - Gestion des exceptions


Il est possibles de grer les exceptions provoques par le composant TcomPort.
//--------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString msg = ""; try {

ComPort1->Connected = true; } catch (EComPort &e) { switch (e.Code) { case CError_OpenFailed : msg = "Votre port srie est dj ouvert" ; break ; case CError_WriteFailed : msg = "Erreur d'criture sur le port srie" ; break ; // voir l'aide de TComPort sur "Error codes" pour continuer la gestion des erreurs } } ShowMessage(msg);

} //---------------------------------------------------------------------------

V - Conclusion
Attention le composant TComPort se rvle tre inactif sans l'emploi des TComLed, il vous suffit de placer 3 TComLed et d'attribuer leurs proprits : "ComPort" sur le port voulu, ComPort1 ou ComPort2 etc... ; "LedSignal" une sur IsConn pour l'ouverture du port, l'autre sur IsRx pour la ligne RxD et enfin une sur IsTx pour TxD.

Malheureusement le port srie tend disparatre sur les ordinateurs actuels pour laisser place aux ports USB. Referez vous aux liens ci dessous pour savoir o et comment installer le composant TcomPort.

VI - Liens
Nos articles C++ Builder : Piloter le port srie avec C++ Builder : le composant TComPort, description, le composant TComPort, installation ; Piloter le port parallle avec C++ Builder : le composant TDLPortIO, description, le composant TDLPortIO, installation.

-9Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2013 Vincent PETIT. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://petit.developpez.com/serie/cours_tcomport/

Le composant TComPort, description par Vincent PETIT - Patrick PETIT

Sans oublier : la FAQ C++ Builder ; la FAQ C++ ; la FAQ C.

- 10 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2013 Vincent PETIT. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://petit.developpez.com/serie/cours_tcomport/