Page 1 sur 3
Port série
Publié : dim. 15/janv./2023 21:12
par MetalOS
Salut tous le monde et bonne année à tous,
Ca fait un moment que je ne suis pas venue ici par manque de temps. Comme je me remet doucement à notre chère PB j'ai besoin de votre aide.
Je commence à utiliser le port série car j'ai besoin de me connecter à un boitier pour y faire des requêtes et avoir une réponse en retour.
Pour me connecter au boitier pas de soucis seulement je ne sais pas comment lui envoyé une requête pour avoir une réponse en retour.
la commande à envoyer et
Qui permet de retourner la version du boitier avec la version de son micrologiciel installé. Merci d'avance pour votre aide.
Re: Port série
Publié : dim. 15/janv./2023 22:03
par Marc56
Code : Tout sélectionner
Resultat = WriteSerialPortString(#PortSerie, Texte$ [, Format])

Re: Port série
Publié : dim. 15/janv./2023 23:31
par MetalOS
Salut Marc,
J'ai bien essayé mais ça me met une erreur de syntaxe.
Re: Port série
Publié : dim. 15/janv./2023 23:37
par MetalOS
Code : Tout sélectionner
;
; ------------------------------------------------------------
;
; PureBasic - SerialPort example file
;
; (c) Fantaisie Software
;
; ------------------------------------------------------------
;
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
Port$ = "COM4"
CompilerEndIf
If OpenSerialPort(0, Port$, 300, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
MessageRequester("Information", "Port série " + Port$ + " ouvert avec succès")
Resultat = WriteSerialPortString(Port$, "<GETVER>>")
Debug Resultat
Else
MessageRequester("Error", "Impossible d'ouvrire le port serie: "+Port$)
EndIf
Re: Port série
Publié : lun. 16/janv./2023 7:45
par manababel
bonjour
verifie la vitesse du port
essaie 9600 à la place de 300
Re: Port série
Publié : lun. 16/janv./2023 8:22
par Marc56
Une fois le port ouvert (OpenSerial) le dialogue se fait avec le
numéro attribué
Dixit l'aide: Resultat =
WriteSerialPortString(
#PortSerie, Texte$ [, Format])
(Message d'erreur était:
Mauvais type de parametre: nombre attendu a la place d'une chaine de caracteres.)
Code : Tout sélectionner
; Non
Resultat = WriteSerialPortString(Port$, "<GETVER>>")
; Oui
Resultat = WriteSerialPortString(0, "<GETVER>>")
Après il faudra aussi que tu mettes la chaine de connexion (vitesse, parité etc) qui correspond à l'état du périphérique en attente.
Et enfin, pour traiter la réponse du périphérique, il faudra gérer le tampon d'entrée.

Re: Port série
Publié : lun. 16/janv./2023 11:16
par MetalOS
Je suis vraiment un boulet

effectivement le la vitesse n'est pas bonne et la valeur non plus.
Merci les gars

Re: Port série
Publié : mar. 17/janv./2023 1:11
par MetalOS
Me revoilà après quelques test et les résultats que le boitier me retourne sont bizarre. Pour info je cherche à récupérer les données de mon compteur geiger afin de me faire mon propre soft de monitoring;
Voici le code de test que j'utilise:
Code : Tout sélectionner
;
; ------------------------------------------------------------
;
; PureBasic - SerialPort example file
;
; (c) Fantaisie Software
;
; ------------------------------------------------------------
;
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
Port$ = "COM4"
CompilerEndIf
If OpenSerialPort(0, Port$, 9600, #PB_SerialPort_NoParity, 7, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
MessageRequester("Information", "Port série " + Port$ + " ouvert avec succès")
Resultat1 = WriteSerialPortString(0, "<GETVER>>", #PB_Ascii)
Debug Resultat1
Resultat2 = WriteSerialPortString(0, "<GETCPM>>", #PB_Ascii)
Debug Resultat2
Resultat3 = WriteSerialPortString(0, "<GETSERIAL>>", #PB_Ascii)
Debug Resultat3
Resultat4 = WriteSerialPortString(0, "<GETTEMP>>", #PB_Ascii)
Debug Resultat4
Else
MessageRequester("Error", "Impossible d'ouvrire le port serie: "+Port$)
EndIf
Quand je l'exécute voici le résultats des différentes variables
- Resultat1 : 9
- Resultat2 : 9
- Resultat3 : 12
- Resultat4 : 10
Le problème c'est que pour le Resultat1, il ne devrait pas me retourner 9 mais plutôt ce genre de résultat
Qui correspond au modèle de boitier et à la version de son firmware. Et c'est pareil pour les autres variables Resultat, les valeurs retournées ne sont pas les bonnes.
J'ai trouvé un code sur Github qui est dans un autre langage et il semblerais que l'auteur converti ses données mais je n'en suis pas sur. Je ne suis pas assé bon pour ça
Voici le code:
https://gist.github.com/nbernard/d136a6cd18b9736665a7
Re: Port série
Publié : mar. 17/janv./2023 7:40
par manababel
voici une adresse qui en dit un peut plus sur le protocole
https://github.com/stilldavid/gmc-300-p ... FC1201.txt
Re: Port série
Publié : mar. 17/janv./2023 8:31
par Marc56
C'est normal
WriteSerialPortString
Valeur de retour
Renvoie le nombre d'octets écrits sur le port série, ou zéro si l'opération a échoué.
Resultat1 = WriteSerialPortString(0, "
<GETVER>>", #PB_Ascii)
<GETVER>> : 9 caractères: le compte est bon
Maintenant, pour avoir la réponse retournée par le périphérique, ex:
GMC-320 4.06 il faut faire une boucle avec
ReadSerialPortData(#PortSerie, *Memoire, Taille) et attendre la fin de transmission.
style:
Code : Tout sélectionner
Resultat = WriteSerialPortString(0, "<GETVER>>")
If Resultat
While AvailableSerialPortInput(0)
If ReadSerialPortData(0, @Buffer, 1)
; Debug Buffer
Text$ + Chr(Buffer)
EndIf
Wend
Debug Text$
EndIf
(Pas testé)

Re: Port série
Publié : mar. 17/janv./2023 16:04
par MetalOS
@manabbel: Ouais je me suis basé sur ce fichier pour obtenir les commande à envoyé au boitier.
@Marc: J'ai essayé ton bout de code mais le débogueur reste vide. J'ai essayé avec la commande
Pour voir le nombre d'octets restants dans le tampon d'entrée mais pareil le débogueur reste vide. J'ai essayé avec plusieurs vitesse du port série au cas ou mais ca ne change rien.
Re: Port série
Publié : mar. 17/janv./2023 17:13
par Marc56
Hello,
Déjà, as-tu testé la communication en direct avec un terminal série, par exemple avec
PuTTY ?
Ensuite, à moins d'avoir reconfiguré le périphérique, ses
paramètres série sont
The serial port communication is based on a fixed baud rate.
Baud: 57600
Data bit: 8
Parity: None
Stop bit: 1
Control: None
Donc
Code : Tout sélectionner
If OpenSerialPort(0, Port$, 57600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
Dans le gestionnaire de périphérique Windows ou dans la TrayIcon (icone USB), tu dois voir quel port série est utilisé, pas forcément Com4
(Si j'ai le temps, je vais configurer une Arduino comme périphérique client/serveur texte pour tester le dialogue sur série)

Re: Port série
Publié : mar. 17/janv./2023 21:25
par Marc56
Voici un exemple pour afficher sous PB une chaine reçue par le port série.
Pour simuler un périphérique série, j'ai utilisé une carte Arduino (nano)
et lui ai uploadé un programme qui écrit "Hello World!" une fois par seconde
Le code Arduino
Code : Tout sélectionner
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println("Hello World!");
delay(1000);
}
Le code PB qui écoute
Code : Tout sélectionner
; Read Arduino speaking: "Hello World!" eternally
; Based on the infratec proposed solution on topic: RS-232 receive data
; http://www.purebasic.fr/english/viewtopic.php?f=13&t=64875&hilit=ReadSerialPortData
Enumeration
#Win
#List
#hPort
#Sec
EndEnumeration
Port$ = "COM3"
OpenWindow(#Win, 0, 0, 500, 300, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListViewGadget(#List, 10, 10, 480, 280)
AddWindowTimer(#Win, #Sec, 1000)
If OpenSerialPort(#hPort, Port$, 9600,
#PB_SerialPort_NoParity, 8, 1,
#PB_SerialPort_NoHandshake, 1024, 1024)
AddGadgetItem(#List, -1, "OK, open")
; Delay(2000)
Else
AddGadgetItem(#List, -1, "Can't open " + Port$)
End
EndIf
Procedure Read_Arduino()
While AvailableSerialPortInput(#hPort)
If ReadSerialPortData(#hPort, @Byte, 1)
Text$ + Chr(Byte)
EndIf
Wend
AddGadgetItem(#List, -1, Text$)
EndProcedure
Repeat
Select WaitWindowEvent()
Case #PB_Event_Timer
Read_Arduino()
Case #PB_Event_CloseWindow
CloseSerialPort(#hPort)
End
EndSelect
ForEver
End
À toi d'adapter Port, Vitesse etc puis d'ajouter les commandes d'envoi (WriteSerialPortString( ) et le traitement des réponses.
GQ-RFC1201.txt

Re: Port série
Publié : mar. 17/janv./2023 22:08
par Ollivier
Et la prochaine étape, dans notre série consacrée à David Hahn : Comment asservir le rapprochement de crayons d'Uranium enrichi avec son port parallèle ?
Re: Port série
Publié : mar. 17/janv./2023 22:53
par MetalOS
@Marc
Le code PB que tu utilise avec Arduino marche pas trop mal car avec la commande <GETVER>> j'ai bien le retour de la version du firmware et du type de boitier. Mais pour d'autre commande j'ai des symboles assez bizzare

.
@Olivier
J'ai tenter le crayon directement dans le port USB mais le PC ne s'allume plus et mon médecin me dit que j'ai un teint fluo
