Port série

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
MetalOS
Messages : 1509
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Port série

Message 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.
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: Port série

Message par Marc56 »

Code : Tout sélectionner

Resultat = WriteSerialPortString(#PortSerie, Texte$ [, Format])
:?: :wink:
Avatar de l’utilisateur
MetalOS
Messages : 1509
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: Port série

Message par MetalOS »

Salut Marc,

J'ai bien essayé mais ça me met une erreur de syntaxe.
Avatar de l’utilisateur
MetalOS
Messages : 1509
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: Port série

Message 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
manababel
Messages : 144
Inscription : jeu. 14/mai/2020 7:40

Re: Port série

Message par manababel »

bonjour
verifie la vitesse du port
essaie 9600 à la place de 300
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: Port série

Message 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:
Avatar de l’utilisateur
MetalOS
Messages : 1509
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: Port série

Message 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:
Avatar de l’utilisateur
MetalOS
Messages : 1509
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: Port série

Message 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
manababel
Messages : 144
Inscription : jeu. 14/mai/2020 7:40

Re: Port série

Message par manababel »

voici une adresse qui en dit un peut plus sur le protocole

https://github.com/stilldavid/gmc-300-p ... FC1201.txt
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: Port série

Message 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:
Avatar de l’utilisateur
MetalOS
Messages : 1509
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: Port série

Message 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.
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: Port série

Message 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:
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: Port série

Message 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:
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Port série

Message 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 ?
Avatar de l’utilisateur
MetalOS
Messages : 1509
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: Port série

Message 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
Répondre