PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV 2024 → Transmission sur port serie
Transmission sur port serie
Iniciado por Amine, mai., 30 2020 8:32 PM - 1 resposta
Membro registado
137 mensagems
Popularité : +7 (7 votes)
Publicado em maio, 30 2020 - 8:32 PM
Bonjour à tous, je galère depuis 3 jours pour la transmision d'une trame sur un port serie (comunication avec un equipement ophtlamologie)
ci-joint mon code
merci pour votre aide

chp_shp est une chaîne = "- 1.25"
chp_Cyl est une chaîne = "- 0.75"
chp_axe est une chaîne = "165"
Cmb_Sphere1 est une chaîne = "- 1.35"
Cmb_Cyl1 est une chaîne = "- 0.85"
Cmb_Axe1 est une chaîne = "175"
Cmb_addD est une chaîne = "+ 2.00"
Cmb_addG est une chaîne = "+ 2.25"


SHH est Buffer = Caract(0x01)
EBB est Buffer = Caract(0x17)
ETT est Buffer = Caract(0x03)
SXX est une Buffer = Caract(0x02)
crr est une Buffer = Caract(0x0D)




ARSCAR est une chaîne ="OR+ 2.25- 0.75180"
ARSCAL est une chaîne ="OL+ 3.50- 1.00 75"
ARPD est chaîne = "PD63"
ARBLOC est chaîne = "DRM"+SXX+ARSCAR+EBB+ARSCAL+EBB+ARPD

LMSCAR est une chaîne = " R- 2.25- 0.75180"
LMSCAL est une chaîne = " L- 2.25- 0.75180"
LMADDR est une chaîne = "AR+ 3.00"
LMADDL est une chaîne = "AR+ 3.00"
LMPRIR est une chaîne = "PR 2.80I"+EBB+"PR 3.10U"
LMPRIL est une chaîne = "PL 2.80I"+EBB+"PL 3.10D"
LMPD est une chaîne = "PD63"
LMBLOC est une chaîne = "DLM"+SXX+LMSCAR+EBB+LMSCAL+EBB+LMADDR+EBB+LMADDL+EBB+LMPRIR+EBB+LMPRIL+EBB+LMPD
RS est un Buffer = SHH+"C**"+SXX+"RS"+EBB+ETT
SD est un Buffer = SHH+"CRL"+SXX+"SD"+EBB+ETT


SI ExeLancé("GestiCabLink.exe") ALORS
ExeTermine("GestiCabLink.exe")
FIN
ExeTermine("GestiCabLink.exe")
ThreadPause(30)
nPort est un entier = 3
sFerme(nPort)
sFerme(nPort)
sFerme(nPort)
sFerme(nPort)
sFerme(nPort)
ThreadPause(30)


_ok est un booléen = sOuvre(nPort, 4096, 4096, sTimeoutDéfaut, Vrai)
SI _ok ALORS
sFixeParamètre(3, 9600, 1, 7, 2,0,0,0)
WHILE NOT sEchap(3,"SETDTR")
sEchap(3,"SETDTR")
FIN
sEcrit(nPort, RS)
// sEcrit(3,Caract(0x01)+"C**"+Caract(0x02)+"RS"+Caract(0x17)+caract(0x03))

WHILE sDansFileSortie(3)<>0
Multitâche()
END


ThreadPause(30)
ThreadPause(30)
ThreadPause(30)

Nombre est un entier
MessageLu est une chaîne
Nombre = sDansFileEntrée(3)
MessageLu = sLit(3, Nombre)


SI MessageLu <> SD ALORS
sClose(nPort)
SINON
ChaîneAEcrire est chaîne= SHH+ARBLOC+EBB+LMBLOC+EBB+ETT
TailleEcrite est un numérique= sEcrit(nPort, ChaîneAEcrire)
BOUCLE
SI sDansFileSortie(2) = 0 ALORS
SORTIR
FIN
FIN
SI TailleEcrite = Taille(ChaîneAEcrire) ALORS
Info("Jai ecrit")
FIN
FIN








FIN

Sablier(False)


la transmission doit suivre ce process








Membro registado
945 mensagems
Popularité : +102 (110 votes)
Publicado em maio, 31 2020 - 12:01 AM
Bonsoir
Mettre des chaines à la place des buffers.
Supprimer le code inutile.

Pour gérer les communications série j'utilisais la méthode par gestion d'événements :

CODE DU PROJET
BufferCom est une chaîne = ""
nPort est un entier = 3

PROCÉDURE OpenCom()
sFerme(nPort)
IF not sOuvre(nPort, 4096, 4096, sTimeoutDéfaut, True) THEN RENVOYER False
IF not sFixeParamètre(nPort, 9600, 1, 7, 2, True, False, False) THEN sFerme(nPort); RENVOYER False
IF not sEvénement(nPort,sEveCaractèreReçu, ReceiveData) THEN sFerme(nPort); RENVOYER False
RENVOYER True

AVEC UN BOUTON
BufferCom = ""
sEcrit(nPort, <data sous forme d'une chaine>)

PROCÉDURE ReceiveData()
BufferCom += sLit(nPort, sDansFileEntrée(nPort))
// ici il faut analyser les données présentes dans BufferCom
// ne pas oublier que le pc va beaucoup plus vite qu'une transmission à 9600 bds

--
« L'erreur ne devient pas vérité parce qu'elle se propage et se multiplie ; la vérité ne devient pas erreur parce que nul ne la voit. » Gandhi