De plus en utilisant les strings, certains caractères, comme le caractère 0, ne seront pas affichés.
Éviter d'utiliser debug pendant une réception/émission de données, c'est préférable aussi.
Je n'ai pas pu debugger ce code, mais c'est dans l'esprit de ce que je ferais :
Code : Tout sélectionner
;VOIR ICI ---->http://www.purebasic.fr/english/viewtopic.php?f=12&t=46481
Procedure EmissionCom(NumeroBoitier.i)
Protected c.a
If IsSerialPort(#PortSerie) = 0
Debug "le port série n'est pas initialisé"
ProcedureReturn 1
Else
*Envoi=AllocateMemory(4)
*Reponse=AllocateMemory(14) ; prévoir le tampon avant la reception de la réponse
Debug NumeroBoitier
texte$= boitier(NumeroBoitier) ; il faudrait éviter les strings au cas où...
Debug texte$
For i=0 To 3
c=Mid(texte$,i+1,1)
PokeA(*Envoi+i, c)
Next i
Resultat = WriteSerialPortData(#PortSerie,*Envoi,4)
If resultat=0
Debug "erreur envoi"
Else
Debug " envoi ok"
EndIf
EndIf
;####################################
;# RECEVOIR ECHO #
;####################################
Repeat
compteur=compteur+1
Resultat = AvailableSerialPortInput(#SerialPort) ; Check for available data in input buffer
If Resultat <>0
Delay(50) ; "Attendre..." Give modem a chance to respond
While Resultat
;Cette fonction bloquera l'éxécution du programme jusqu'à l'arrivée des données.
ReadSerialPortData(#SerialPort, *Reponse, Resultat) ; Read the data in the input buffer into memory
;Text$ = PeekS(*Reponse, Resultat)
;Msg$ + Text$
Resultat = AvailableSerialPortInput(#SerialPort)
Wend
Break
EndIf
Delay(500) ; Let system do other things
If compteur >2000 ; quitter si trop long
Debug "trop long..."
Break
EndIf
ForEver
Debug "echo"
echo$=""
For i = 0 To 3
echo$=echo$+PeekA(*Reponse+i)
Next i
Debug echo$
Debug "adresse du boitier 1 : Chr(128)+Chr(27)+Chr(4) "
Dim adr1(3)
For i = 4 To 6
c=PeekA(*Reponse+i)
adr1(i-4)=c
Debug c
Next i
Debug "datas du boitier 1 : 6c "
Dim data1(6)
For i = 7 To 12
c=PeekA(*Reponse+i)
data1(i-7)=c
Debug c
Next i
Debug "checksum du boitier 1 : 1c "
checksum=PeekA(*Reponse+13)
Debug data1$
ProcedureReturn 0
EndProcedure