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

Code : Tout sélectionner

<GETVER>>


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])
:?: :wink:

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.
:wink:

Re: Port série

Publié : lun. 16/janv./2023 11:16
par MetalOS
Je suis vraiment un boulet :D effectivement le la vitesse n'est pas bonne et la valeur non plus.

Merci les gars :wink:

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

Code : Tout sélectionner

GMC-320 4.06
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 :D

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é)
:wink:

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

Code : Tout sélectionner

AvailableSerialPortInput(0)


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)
:wink:

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
:wink:

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 :D :D :D .

@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 :D :D :D