logo Recherche
 
 

Mise en oeuvre du port série

Le port série, ou port RS232, est connu pour permettre le raccordement d'un modem, mais son usage est bien plus universel : imprimantes, photocopieurs, automates, balances, scanners, lecteurs de codes barres et autres nombreux appareils utilisent ce port de communication.
 
La Connectique
Le port série se présente sous la forme d'un connecteur SUB-D9 male. Il offre un moyen simple pour communiquer avec des appareils et microcontrôleurs jusqu'à plusieurs centaines de mètres et les quelques signaux qu'il supporte peuvent aussi être utilisés comme lignes d'E/S directes pour la commande de petites interfaces.
Le dessin ci-contre montre l'organisation de ce connecteur.
 
 
La DLL IO_Acces_Com
 
Cette DLL s'intègre à vos Applications C++, Delphi, ou Visual Basic. Elle exploite les fonctions de l'API Windows et est donc compatible avec toutes les versions de ce système d'exploitation ainsi qu'avec les adaptateurs sur port USB.
La Dll supporte des fonctions permettant d'établir une communication série ainsi que des fonctions pour le positionnement et la consultation des signaux de contrôle qui pour simplifier sont indexés avec une numérotation allant de 0 à 1 pour les sorties et de 0 à 4 pour les entrées.
 
La DLL supporte 8 fonctions qui vous sont présentés ici sous la syntaxe Pascal et en C:
 
int ComUsePort (int nCOM);
Function ComUsePort (No:Integer):boolean;
Défini le Port en usage.
Appelez ComUsePort pour ouvrir et désigner le Port en usage. Les Ports sont désignés par un numéro d'index à partir de 1, 0 permettant de refermer le port en cours d'utilisation. La fonction renvoie True si le port a été ouvert sans erreur.
 
int ComStateIn(char nLIG);
Function ComStateIn (Ligne:Byte):boolean;
Renvoie l'état logique d'une ligne en entrée
Utilisez ComStateIn pour consulter l'état logique des lignes orientées en entrées. La fonction accepte les index 0 à 4 correspondant respectivement aux signaux Cd, Dsr, Rts, Ctr et Ri, et la valeur renvoyée correspond à l'état électrique de la ligne (True= +12V, False = -12V)
 
void ComStateOut (char nLIG, int Etat);
Procedure ComStateOut (Ligne:Byte ; Etat:Boolean);
Affecte un état logique à une ligne en sortie
Utilisez PrnStateOut pour affecter un état logique à une ligne orientée en sortie. La fonction accepte les index de ligne 0 pour DTR et 1 pour RTS et la valeur d'état correspond à l'état électrique de la ligne (True= +12V, False = -12V)
 
int ComConfig (int Debit, int WorLength, int NbrStopBit, int Parity);
Function ComConfig (Debit,WordLength,NbrStopBit,Parity:Integer):Boolean;
Configure le port

Utilisez ComConfig pour définir le format des communications séries. Les paramètres autorisés en argument sont les suivants: Debit : en Bauds. 110,300,1200,2400,4800,9600,14400,19200,38400,56000,57600,115200,256000 WordLength : longueur des mots, de 5 à 8 bits. NbrStopBit : nombre de bit de stop, 1=un bit de stop, 2=2 bits de Stop. Parity : parité, 0=aucune, 1=Impaire, 2=Paire,3= Toujours 0, 4= Toujours 1.

La fonction ne vérifie pas la validité des paramètres et renvoie false, seulement en cas de tentative de configuration sur un port fermé ou invalide.
 
void ComSetDataOut (unsigned char Data);
Procedure ComSetDataOut(Data:Byte);
Envoie une donnée
Utilisez ComSetDataOut pour transmettre un octet de donnée (ou un mot de 5 à 7 bits suivant la configuration du port). ComSetDataOut place l'octet à transmettre dans le buffer de transmission et n'attend pas sa transmission effective.
 
int ComGetDataIn (unsigned char* data);
Function ComGetDataIn(Var Data:Byte):Boolean;
Réceptionne une donnée
Utilisez ComGetDataIn pour récupérer une donnée reçu. La fonction consulte le buffer d'entrée et ci celui-ci est vide attend une réception durant 100ms. La fonction renvoie True si une donnée valide a bien été récupéré et sinon false.
 
void ComSetBlockOut (void* buf, int SzBlk);
Procedure ComSetBlockOut(const Buffer; SzBlk:Integer);
Envoie un Bloc de données
Utilisez ComSetBlockOut pour transmettre un bloc de données : valeur numérique sur plusieurs octets, chaîne de texte, tableau binaire, zone de mémoire,. SzBlk permet d'indiquer la taille du bloc en octets. La fonction place les datas dans le buffer de transmission et n'attend pas sa transmission effective.
 
int ComGetBlockIn (void* buf, int* SzBlk);
Function ComGetBlockIn (var Buffer; Var SzBlk:Integer):Boolean;
Réceptionne un bloc de données
Utilisez ComGetBlockIn pour récupérer un bloc de données. SzBlk permet d'indiquer la taille du bloc à récupérer en octets. La fonction consulte le buffer d'entrée jusqu'à avoir récupéré les SzBlk demandés. Si le buffer est vide ou incomplet, la fonction attend une réception durant 100ms x par le nombre d'octets demandé. La fonction renvoie True si au moins 1 octet a été récupéré et SzBlck indique le nombre d'octets effectivement récupéré.
 
Vous trouverez dans le pack zip en téléchargement, le source Pascal de cette DLL (IO_Acces_Com.dpr) ainsi que des exemples d'integration pour Delphi (DemoIoCom.dpr) et pour le C (Test_dll_IO_Acces_Com.c).
Toutes les fonctions de la DLL sont au format d'appel StdCall.
Remarquez que contrairement au C++, le langage C, ne supporte pas les booléens. Aussi, des types int sont utilisés à la place, ceux-ci pouvant prendre la valeur 0 pour false et sinon, toutes autres valeurs pour True.
 
Si vous êtes amené à faire une intégration de cette DLL pour un autre langage, il plus important de respecter la taille des paramètres passé dans les fonctions que leur type effectif et à l'exception du type pascal Byte (c'est à dire char pour le C) qui fait 8 bits, tous les autres types utilisés sont sur 32 bits.
 
Les montages de base
 
Les niveaux électriques des signaux RS232 plutôt exotiques de +12V et -12V n'ont rien de problématique et peuvent facilement être adapté à une logique TTL sans forcement faire appel à un MAX232, même-ci celui-ci à l'avantage de respecter scrupuleusement les spécifications de la norme RS232.
 
Adaptateur RS232 <-> TTL (standard)
Pour relier un circuit de niveau TTL (comme par exemple un microcontrôleur) aux lignes Tx et Rx d'un port RS232, 2 transistors et 2 paires de résistances suffisent. Théoriquement, la norme RS232 stipule que les seuils de basculement logiques sont à -1,5V pour le niveau haut et à +1,5V pour le niveau bas. Seulement, l'électronique de la RS232 est bien obligée de respecter un état de repos lorsqu'elle n'est pas connectée, sinon elle réceptionnerait en permanence des données aléatoires et le montage profite de cette "faiblesse" pratique. Ainsi, lorsque la ligne Tx coté TTL est au repos (c'est à dire au niveau haut à +5V) le transistor PNP est bloqué et son collecteur en haute impédance, la ligne Rx coté RS232 prend alors " naturellement " son état de repos, permettant ainsi de se passer d'une tension négative. Si cette polarisation négative vous semble indispensable (afin de respecter la norme, ou simplement pour être sur d'une totale compatibilité ou encore pour améliorer la portée qui sinon est vite dégradé par la capacité de la ligne), vous pouvez toujours rajouter une résistance de 4,7K entre le collecteur du PNP et l'un des signaux en sortie Dtr ou Rts qui au repos présentent du -12V. A noter aussi que ce montage est valable pour les signaux de commande Cd, Dsr, Cts et Ri. Coté émission RS232, le transistor NPN est juste là pour effectuer une adaptation de tension. Ainsi lorsque la Ligne Tx coté RS232 est au repos (c'est à dire au niveau haut à - 12V) le transistor NPN est bloqué permettant à la ligne Rx coté TTL d'être au +5V à travers la résistance de 4,7K.
 
Adaptateur RS232 <-> TTL (très économique)
Plus simple encore, ce montage ne fait appel qu'à deux résistances et une Zener et reste parfaitement accepté par plupart des ports RS232. Le seul problème est que les signaux sont inversés (coté TTL, le 1 logique correspond au 0V et le 0 logique au 5V), mais si vous programmez vous même vos microcontrôleurs il vous suffit de prévoir cette inversion dans les routines de transmission série et ainsi profiter de cette simplification de l'électronique pour vos montage.
 
Commande de relais
Un simple transistor NPN suffit pour commander un relais. La résistance de sa bobine dépend de la tension d'alimentation et ne doit pas être inférieure à 50 ohms pour 5V, 120 ohms pour 12V et 240 ohms pour 24V.
 
Commande de transistor de puissance
Rien de compliquer non plus pour réaliser une commande à transistor. La charge est intercalée entre l'alimentation et le collecteur du transistor de puissance et une diode protège celui-ci des courants inverses en cas de commande d'un moteur ou d'une bobine. Le courant maxi peut atteindre 1,5 ampère en continu sans radiateur et jusqu'à 4A si le BD679 est équipé d'un radiateur approprié.
 
 
Commande de triacs
Le MOC3041, est un opto-triac permettant de commander un triac de puissance à partir d'une commande logique. Il offre une isolation galvanique de 7500V entre le secteur et la partie logique et dispose d'une détection de passage par 0 de la tension secteur, limitant ainsi les parasites sur le secteur lors des commutations. Quel que soit le modèle de triac choisi, celui-ci pourra commander des charges jusqu'à 2A, un radiateur sera par contre nécessaire pour l'exploiter au maximum de ces caractéristiques.
 
 
 
 
http://www.automatepc.fr
© 2004 - 2010