2 pièce(s) jointe(s)
Windev : Gestion de liaison série par événement série
bonjour,
voici un exemple de gestion de liaison série par événement.
j'ai choisi pour illustrer la chose, la réception de trames NMEA par une liaison série provenant d'un GPS.
J'ai repris l'exemple en windev 7 de WDGPS ( wdgps.com). Celui-ci utilise un timer pour receptionner les trames.
J'ai donc remplacé le timer par une gestion d'événement série et plus précisément l'événement caractère reçu.
J'ai gardé le décodage des trames et l'affichage par liste des trames reçues.
J'ai enlevé la partie sauvegarde de points et de positions et l'utilisation de la dll de WDGPS.
Tout tient dans une fenêtre ( en téléchargement une copie d'écran et le code en Windev9 ( pour compatibilité).
voici l'initialisation de la ligne série et de la gestion des événements Série, à partir d'un clic sur un bouton ON/OFF :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
LigneCom est un booléen
SI MoiMême..Enfoncé=Vrai ALORS
MoiMême..Libellé="ON"
// Port COM choisi
// ferme le port COM
sFerme(Cb_Port)
LigneCom = sOuvre(Cb_Port, 6000, 6000,400,1)
SI LigneCom = Vrai ALORS
// Paramétrage de COM choisi : , parité paire,
sFixeParamètre(Cb_Port, Cb_Vitesse, 0, 8, 0) // 8 bits sans parité 1 bit de stop
// Détection de caractères sur le port COM choisi
sEvénement(Cb_Port,sEveCaractèreReçu,"LecturePortSérie") // on active la procédure de lecture sur évenement
SINON
Erreur("Erreur d'ouverture du port COM")
FIN
SINON
MoiMême..Libellé="OFF"
sFinEvénement(Cb_Port,sEveCaractèreReçu )
sFerme(Cb_Port)
FIN |
et voici la procédure de lecture sur événement série :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
PROCEDURE LecturePortSérie(NumPort,Event)
OctetsLus est un entier
TempBuffer est une chaîne
i est un entier
OctetsLus = sDansFileEntrée (NumPort)
TempBuffer = sLit (NumPort ,OctetsLus)
POUR i = 1 A OctetsLus
SI TempBuffer[[i]]=Caract(10)ALORS
SI Gauche(phrase,1)<>"$"ALORS phrase="" // Pas NMEA!!! debut de capture
Decodage() // Phrase est variable GLOBALE donc accessible aux procedures globales
//phrase_preced=Phrase
phrase=""
SINON
SI TempBuffer[[i]]<>Caract(13)ALORS phrase=phrase+TempBuffer[[i]]
FIN
FIN// de pour i |
Dans l'affichage des trames par une liste, j'affiche toujours la dernière trame reçue en incluant une sélection de la dernière trame juste après l'avoir ajoutée.
Code:
1 2 3 4
|
SI SansEspace(phrase)<>"" ALORS
ListeAjoute(Liste_Trames,phrase) // remplissage de la liste
ListeSelectPlus(Liste_Trames, Liste_Trames..Occurrence) // pour toujours afficher dernière ligne |
Ami calmant, J.P ;)