j'ai créer une coolection de procedure globale et j'ai placer la procedure suivante dedans
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| PROCEDURE Thread_reception_data_socket()
trame_reception est une chaîne
sansfin est un entier = 1;
BOUCLE //boucle sans fin ne pose pas de probleme car dans un thread
//test si le socket existe
SI SocketExiste("Socket"+Mac_adresse) = Vrai ALORS
trame_reception = AnsiVersUnicode( SocketLit("Socket"+Mac_adresse,Faux,50))
SI trame_reception <> "" ALORS
//traitement de la trame recus depand de ce que l'on veur en faire
//il est impossible de modifier l'IMH d'une fenetre via un thread, il faut
//donc enregister les donnée utile via une variable globale à la fenetre par exemple
//et ensuite appeler une autre procedure globale via la commande ExécuteThreadPrincipal(nom de la procedure globale à appeler pour faire le refresh de l'IMH)
FEN_ma_fenetre_1.string_recue = trame_reception
ExécuteThreadPrincipal(Job_refresh_IMH_ma_fenetre_1)
trame_reception = ""
FIN
FIN
A FAIRE TANTQUE sansfin = 1 |
je lance ce tread comme ceci en initilaisation de ma fenetre de depart
ThreadExécute("thread_reception_data_socket",threadNormal,Thread_reception_data_socket)
et voici un appercu de la procedure de refresh de l'imh qui est donc aussi une procedure globale crée dans une collection de procedure globale
1 2 3
| PROCEDURE Job_refresh_IMH_ma_fenetre_1()
FEN_ma_fenetre_1.SAI_test_reception = FEN_ma_fenetre_1.string_recue |
REMARQUE: il faut bien faire attention que le type de trame envoyée doit être le même que celle recue, si on configure le socket a sa creation comme ceci:
SocketChangeModeTransmission("Socket"+Table_de_machine.Mac_adresse,SocketTailleDébut)
la trame de à envoyer au smathpone (androide) doit avoir le même format c'est à dire :
- nbr de byte à recevoir codé en ascii (attention si 10 byte recus sera codé sur 2 bytes et si 100 byte recus sera codé sur 3 byte)
- 13 (dec)
- 10 (dec)
- byte 0
- byte 1
- byte ...
- byte n
donc si on utilise un port uart d'un pic par exemple pour envoyer les byte 1,2,3 decimale il faut envoyer cette trame complete :
- 51,13,10,1,2,3 (tout en decimale)
ou 51 = 3 en ascii
ou 13,10 = carred return
et ou 1,2,3 sont les 3 byte recus dans la variable trame_reception
et la par contre je bloque encore sur le fait que si un bug par exemple dans le pic ou un parasite (on ne sait jamais) fait qu'il manque un byte de la trame en emmision du pic et bien la procedure socketlit reste plantée indefiniment et independament du time out definit dans les parametre de cette fonction.
j'espere avoir été clair dans mes explications, je ne prétend pas que ceci est la bonne solution mais je n'ai pas trouver autre chose si quelqu'un fait autrement et que cela fonctionne je suis preneur aussi.
Partager