Voici un code un peu plus clair incluant une procédure d'envoi (Evenement Velbus : Transmit Push Button) et le traitement du checksum
Pour info, la trame Velbus commence toujours par 4 octets :
$0F (Start ou SOF)
$F8 ou $FB (priorité Haute ou Basse)
$xx (Adresse du module)
$ss (Longueur des données suivantes)
$z1
$z2
$..
$kk (CheckSum)
$04 (EOF)
Code : Tout sélectionner
Enumeration
#CanalCOM
#Window_0
#Button_0
#String_0
#Button_1
#Editor_0
#Combo_0
EndEnumeration
Global *Buffer = AllocateMemory(2048)
Global *BufOut = AllocateMemory(1024)
Procedure Open_Window_0()
If OpenWindow(#Window_0, 216, 0, 318, 300, "Velbus via VelbusLink", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
ButtonGadget(#Button_0, 20, 20, 70, 20, "ON")
StringGadget(#String_0, 160, 20, 50, 20, "")
ButtonGadget(#Button_1, 230, 20, 70, 20, "OFF")
EditorGadget(#Editor_0, 20, 60, 280, 140)
ComboBoxGadget(#Combo_0, 20, 240, 280, 20)
EndIf
EndProcedure
Procedure.s Hexa2(*B,longueur)
Debug "Longueur Trame (proc Hexa2): "+ Str(longueur) + " ["+PeekS(*B)+"]"
r$ = ""
For t = 0 To longueur
; Read the buffer from 0 to lengh and remove negative value (& 255) to avoid FFFFFFFFFFFFFx value
a$ = Trim(Hex(PeekB(*B+t) & 255))+" "
If Len(a$) = 2
a$ = "0"+ a$
EndIf
r$ = r$ + a$
Next t
r$ = r$ + Chr(13)+Chr(10)
ProcedureReturn r$
EndProcedure
Procedure LecturePort()
Resultat = AvailableSerialPortInput(#CanalCOM)
If Resultat
longueur = ReadSerialPortData(#CanalCOM, *Buffer, Resultat)
Commande$ = Hexa2(*Buffer, longueur)
;CommandParser(Commande$)
Debug Commande$
SetGadgetText(#Editor_0, GetGadgetText(#Editor_0)+Commande$)
EndIf
EndProcedure
Procedure.i CheckSum(*BufOut,longueur.i)
somme=0
For t=0 To longueur
Somme=Somme+PeekB(*BufOut+t)
Next t
Somme = (Somme & $FF) ! $FF
Somme = Somme + 1
ProcedureReturn Somme
EndProcedure
Procedure.i SendButton(*B, Amodule.i, Abutton.i, StatusButton.i)
PokeB(*B+0,$0F) ; Start
PokeB(*B+1,$F8) ; Priorité
PokeB(*B+2,Amodule) ; Address module(peek an existing address !)
PokeB(*B+3,$04) ; Data = 4 bytes (no RTR)
PokeB(*B+4,$00) ; Push Button Function (H00)
Select StatusButton
Case 0 ; Just Release
PokeB(*B+5,$00) ; Just pressed
PokeB(*B+6,Abutton) ; Just Release
PokeB(*B+7,$00) ; Long Press
Case 1 ; Just Pressed
PokeB(*B+5,Abutton) ; Just pressed
PokeB(*B+6,$00) ; Just Release (NO)
PokeB(*B+7,$00) ; Long Press (NO)
Default ; Just Pressed
PokeB(*B+5,$00) ; Just pressed
PokeB(*B+6,$00) ; Just Release (NO)
PokeB(*B+7,Abutton) ; Long Press (NO)
EndSelect
PokeB(*B+8,CheckSum(*B,8) ) ; Checksum from h0F to Checksum (not included of course)
PokeB(*B+9,$04) ; ETX (End of Transmission)
Commande$ = Hexa2(*B, 10)
Debug "Send => "+Commande$
ProcedureReturn WriteSerialPortData(#CanalCOM, *B, 10)
EndProcedure
If OpenSerialPort(#CanalCOM, "COM9", 9600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
Open_Window_0()
If IsWindow(#WIndow_0) = 0
CloseSerialPort(#CanalCOM)
End
EndIf
Repeat
EventID = WaitWindowEvent(20)
LecturePort()
If EventID = #PB_Event_Gadget
Select EventGadget()
Case #Button_0
Debug "Hello_____________________"
SendButton(*BufOut, 1,2,1)
Case #Button_1
Debug "Bye_______________________"
SendButton(*BufOut, 1,2,0)
EndSelect
EndIf
Until EventID = #PB_Event_CloseWindow
CloseSerialPort(#CanalCOM)
Else
MessageRequester("Erreur","Le port série n'a pas été initialisé",0)
EndIf
http://forum.velleman.be/viewtopic.php?f=13&t=3457