Re: Adaptation GWBasic en PureBasic
Publié : sam. 13/déc./2014 11:50
Comme les ports série n'utilisent en générale que des octets non signés (.a), il est préférables autant que possible de n'utiliser que des .a et éviter les strings, et autres. C'est une précaution.
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 :
M.
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