Le premier site francophone dédié au développement Pocket PC


Le contrôle liaison série (partie 2)
 
   

 

Partie 2

Notion de buffers

Le contrôle de communication série gère 2 buffers, l'un pour l'écriture et l'autre pour la lecture. Ces buffers sont des zones de stockage temporaires qui permettent de ne pas sans arrêt attendre un caractère en lecture ou attendre que tous les caractères soient envoyés avant de passer à autre chose. Ces buffers permettent un travail asynchrone, très pratique.

Le Handshaking (poignée de mains)

Lorsqu'un matériel envoie des données par liaison série, il doit être sûr que celui qui les reçoit à le temps de les traiter. C'est le cas typique des imprimantes qui possèdent un buffer de reception limité et qui, du fait du temps d'impression, doivent parfois demander à l'envoyeur de suspendre momentanément l'envoi des données. La manière d'annoncer l'arrêt ou la reprise de l'envoi des données s'appelle le Handshaking. Il en existe 3 sortes. Le premier est matériel, ce sont des fils supplémentaires dans le cable série qui indiquent que la voie est ouverte ou fermée. Pour que ça marche, ces fils doivent être présents (ce qui n'est pas toujours le cas). Le second est logiciel. On utilise des caractères réservés (XON et XOFF) pour demander l'arrêt (XOFF) ou la reprise (XON) de l'envoi des données. Le dernier est le plus simple, on ne contrôle rien et on part du principe que l'autre écoute et traite en permanence les données envoyées.

Le contrôle de communication fourni avec eVB permet de choisir le Handshaking en utilisant la propriété 'Handshaking' (tout simplement) :

Rem On utilise un contrôle matériel
Comm1.Handshaking = comRTS

Rem On utilise un contrôle logiciel (xon et xoff)
Comm1.Handshaking = comXonXoff

Rem On utilise un contrôle matériel doublé d'un contrôle logiciel
Rem (le casque et les bretelles)
Comm1.Handshaking = comRTSXonXoff

Rem Pas de contrôle
Comm1.Handshaking = comNone

Choisir le type de données

Il est possible d'envoyer (et de recevoir du même coup) les données sous 2 formats. Le premier format, la chaine de caractères, est le plus habituel. Le second, moins utilisé, est le format binaire (le tableau d'octets).

Note: Si les données que vous envoyez ou que vous recevez contiennent des caractères de contrôle qui doivent être considérés comme des données, il faut choisir le type binaire.

Pour que le contrôle sache comment vous fournir les données (chaine ou tableau d'octets) il faut donner à la propriété 'InputMode' le type de données à utiliser en réception :

Rem On veut recevoir les données sous forme de chaine de caractères
Comm1.InputMode = 0

Rem On veut recevoir les données sous forme de tabeau d'octets (byte array)
Comm1.InputMode = 1

Note: Nous allons utiliser le mode texte (valeur par défaut) pour envoyer et recevoir des données.

Envoyer des données

Note: Avant d'envoyer ou de recevoir des données, il faut que le port série ait été paramètré et ouvert. Si vous ne savez pas (ou plus) comment faire, veuillez vous référer à la première partie de cet article.

Pour envoyer des données sur le port série, il sufft d'utiliser la propriété 'Output' avec comme valeur la chaine de caractères que vous souhaitez envoyer

Comm1.Output = "Bonjour"

Les caractères de la chaine "Bonjour" sont placés dans le buffer de sortie, puis envoyés 1 à 1 par la liaison série. L'envoi effectif est géré en tâche de fond par le contrôle.

Il est possible de connaître le nombre de caractères attente dans le buffer de sortie en lisant le contenu de la propriété 'OutBufferCount' :

Rem Lecture du nombre de caractères dans le buffer de sortie
MyOutBufferCount = Comm1.OutBufferCount

Recevoir des données

Toutes les données reçus sont stockées par le contrôle liaison série dans le buffer d'entrée. Ainsi, il est théoriquement impossible de louper des caractères.

Il est possible à tout moment de connaitre le nombre de caractères disponibles dans le buffer d'entrée en lisant le contenu de la propriété 'InBufferCount' :

Rem Lecture du nombre de caractères dans le buffer d'entrée
MyInBufferCount = Comm1.InBufferCount

La réception des données peut se faire de deux manières. Vous pouvez demander la lecture de tout le buffer d'entrée d'un coup ou vous pouvez demander la lecture d'un nombre précis de caractères. La propriété 'InputLen' indique combien de caractères doivent être retirés du buffer d'entrée. Si vous placez la valeur zéro, tout le buffer d'entrée sera lu. Si vous placer une valeur suppérieure à zéro, seuls le nombre de caractères demandés seront lu et retirés du buffer d'entrée. La propriété 'Input' active la lecture :

Rem Nous allons lire tous les caractères présents dans le buffer d'entrée
Dim MaLecture As String
Comm1.InputLen = 0
MaLecture = Comm1.Input

Rem Nous allons lire 5 caractères du buffer d'entrée
Dim MaLecture As String
Comm1.InputLen = 5
MaLecture = Comm1.Input

Important : Si le nombre de caratères présents dans le buffer d'entrée est insufisant, le contrôle attend le nombre de caractères demandés avant de rendre la main à votre application eVB. Le mieux est de contrôler le nombre de caractères disponibles avant de lancer une lecture.

Rem Nous devons lire les caractères 2 par 2
Rem Nous vérifions qu'il y a au moins 2 caractères 
Rem dans le buffer d'entrée avant de lire If Comm1.InBufferCount >= 2 Then Comm1.InputLen = 2 MaLecture = Comm1.Input End If

Conclusion partie 2

Voila, vous savez maintenant envoyer et recevoir des données. Dans la 3ème partie nous parlerons de quelques astuces pour simplifier la gestion d'une liaison série.

 

Stéphane Sibué

 
       
   
 
   
Copyright 2001-2004 - Tous droits réservés
 
   

iPAQ est un produit de COMPAQ.
Visual Tools est un produit de Microsoft Corporation.
Toutes les autres marques et produits présents dans ces pages sont la propriété exclusive de leurs sociétés respectives.