Aprés avoir effectué les essais sur site, je pense avoir cerné mon problème de réception, mais ne parvient pas à le résoudre.
L'ordinateur sur lequel est implémanté l'application PureBasic interroge tour à tour 7 boitiers construits chacuns autour d'un microcontroleur.
La communication s'effectue en boucle de courant sur liaison série RS232.
L'interrogation d'un boitier se fait en envoyant une chaine de 4 caractères. Exemple pour le boitier 1:
Chr(192)+Chr(27)+Chr(4)+Chr(95)
Ces paramètres sont définis par le constructeur des boitiers électroniques.
L'ordinateur reçoit d'abord cette même chaine, en boucle de courant on reçoit d'abord la question posée comme un eccho.
Mon programme fonctionne parfaitement, le paramétrage de la liaison série est donc correcte.
Vient ensuite la réponse du boitier interrogé. La réponse est une chaine de 10 caractères.
D'abord 3 caractères qui confirment l'adresse du boitier 1 : Chr(128)+Chr(27)+Chr(4)
Puis 6 caractères qui donnent les valeurs des événements gérés par le boitier : température de sonde, poids sur balance, débit d'eau etc.
Et enfin le dixième et dernier caractère qui la checksum.
Mon problème réside dans la gestion des valeurs zéros. Exemple:
quand le boitier doit envoyé la chaine : Chr(192)+Chr(27)+Chr(4)+Chr(95)+Chr(22)+Chr(18)+Chr(
0)+Chr(54)+Chr(
0)+Chr(195)
Mon programme reçoit :
192 27 4 95 22 18 54 195 0 0
A mon avis quand la valeur 0, correspondant au code ASCII 0 (NULL), aucune valeur est déposée dans la zone mémoire. Les zéros sont ignorés.
Comme la trame est sur 10 caractères, l'algorithme de réception ne trouvant pas de valeurs dans les mémoires vides, elles sont ignorées, et à la fin n'ayant pas de valeur il m'est des 0.
J'ai tenté sans succès diverses stratégies, la réception d'une trame de 14 caractères (l'eccho 4 caractères, plus la données 10 caractères). J'ai imaginé des algorithmes les plus fumeux les uns que les autres sans succès. Vous en trouverez des exemples ci-dessous.
Comme créer 14 zones mémoires (une par caratère) afin de gérer individuellement la réception des caratères afin de traiter la réception des 0.
Tout cela sans succès.
Pouvez-vous m'aider? Il est possible qu'une mauvaise maitrise du port série soit la cause de mes difficultés.
Code : Tout sélectionner
Procedure EmissionCom(NumeroBoitier.i)
*Memoire=AllocateMemory(4)
If IsSerialPort(#PortSerie) <> 0
Debug NumeroBoitier
Debug boitier(NumeroBoitier)
Resultat = PokeS(*Memoire, boitier(NumeroBoitier) , 4,#PB_Ascii)
WriteSerialPortData(#PortSerie,*Memoire,4)
Else
Debug "le port série n'est pas initialisé"
EndIf
;####################################
;# RECEVOIR ECCHO #
;####################################
;Reception.s=PeekS(*Memoire,14,#PB_Ascii)
*Memoire1=AllocateMemory(1)
*Memoire2=AllocateMemory(1)
*Memoire3=AllocateMemory(1)
*Memoire4=AllocateMemory(1)
*Memoire5=AllocateMemory(1)
*Memoire6=AllocateMemory(1)
*Memoire7=AllocateMemory(1)
*Memoire8=AllocateMemory(1)
*Memoire9=AllocateMemory(1)
*Memoire10=AllocateMemory(1)
*Memoire11=AllocateMemory(1)
*Memoire12=AllocateMemory(1)
*Memoire13=AllocateMemory(1)
*Memoire14=AllocateMemory(1)
ReadSerialPortData(#PortSerie,*Memoire1,1)
ReadSerialPortData(#PortSerie,*Memoire2,1)
ReadSerialPortData(#PortSerie,*Memoire3,1)
ReadSerialPortData(#PortSerie,*Memoire4,1)
ReadSerialPortData(#PortSerie,*Memoire5,1)
ReadSerialPortData(#PortSerie,*Memoire6,1)
ReadSerialPortData(#PortSerie,*Memoire7,1)
ReadSerialPortData(#PortSerie,*Memoire8,1)
ReadSerialPortData(#PortSerie,*Memoire9,1)
ReadSerialPortData(#PortSerie,*Memoire10,1)
ReadSerialPortData(#PortSerie,*Memoire11,1)
ReadSerialPortData(#PortSerie,*Memoire12,1)
ReadSerialPortData(#PortSerie,*Memoire13,1)
ReadSerialPortData(#PortSerie,*Memoire14,1)
; DRchaine(1)=PeekS(*Memoire1,1,#PB_Ascii)
; DRchaine(2)=PeekS(*Memoire2,1,#PB_Ascii)
; DRchaine(3)=PeekS(*Memoire3,1,#PB_Ascii)
; DRchaine(4)=PeekS(*Memoire4,1,#PB_Ascii)
; DRchaine(5)=PeekS(*Memoire5,1,#PB_Ascii)
; DRchaine(6)=PeekS(*Memoire6,1,#PB_Ascii)
; DRchaine(7)=PeekS(*Memoire7,1,#PB_Ascii)
; DRchaine(8)=PeekS(*Memoire8,1,#PB_Ascii)
; DRchaine(9)=PeekS(*Memoire9,1,#PB_Ascii)
; DRchaine(10)=PeekS(*Memoire10,1,#PB_Ascii)
; DRchaine(11)=PeekS(*Memoire11,1,#PB_Ascii)
; DRchaine(12)=PeekS(*Memoire12,1,#PB_Ascii)
; DRchaine(13)=PeekS(*Memoire13,1,#PB_Ascii)
; DRchaine(14)=PeekS(*Memoire14,1,#PB_Ascii)
DRchaine(1)=PeekA(*Memoire1)
DRchaine(2)=PeekA(*Memoire2)
DRchaine(3)=PeekA(*Memoire3)
DRchaine(4)=PeekA(*Memoire4)
DRchaine(5)=PeekA(*Memoire5)
DRchaine(6)=PeekA(*Memoire6)
DRchaine(7)=PeekA(*Memoire7)
DRchaine(8)=PeekA(*Memoire8)
DRchaine(9)=PeekA(*Memoire9)
DRchaine(10)=PeekA(*Memoire10)
DRchaine(11)=PeekA(*Memoire11)
DRchaine(12)=PeekA(*Memoire12)
DRchaine(13)=PeekA(*Memoire13)
DRchaine(14)=PeekA(*Memoire14)