IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Ecriture et lecture port COM


Sujet :

WinDev

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    787
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 787
    Points : 276
    Points
    276
    Par défaut Ecriture et lecture port COM
    Bonjour à tous les Windèviens

    J'ai un problème pourtant traité déjà à de nombreuses reprises mais je ne trouve pas, ou tout du moins, je m'y prend mal à mon avis !

    Je dois envoyer une commande sur une carte électronique via le port COM, qui me retourne directement sa valeur.

    Quand je fais l'essai via HyperTerminal, ça fonctionne très bien. J'envoie ma commande et boum j'ai le retour immédiat de la carte via ce même port COM.

    Bref, le port COM et mon OS fonctionnent bien

    Maintenant, sous mon Windev 20, voici ce que je cherche à faire donc : (en gros, j'envoie ma demande sur mon port COM; et ensuite je lis)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    ///////////////////////////
    //
    // ECRITURE SUR PORT COM
    //
    ///////////////////////////
     
    // Ouverture de COM1
    NumPort est un entier = SAI_NUM_PORT_COM	// Numéro du port
     
    // Fermeture du port COM si déjà ouvert
    sFerme(NumPort)
     
    // Ouverture du port
    SI sOuvre(NumPort, 6000, 6000,400, 1) = Faux ALORS
     
    	// Traitement de l'erreur d'ouverture
    	Erreur("Erreur d'ouverture de COM " + NumPort)
     
    SINON
    	// Paramétrage du port
    	SI sFixeParamètre(NumPort, 9600, 0, 8, 1, 1, 0, 0) = Faux ALORS
    		// Traitement de l'erreur de paramétrage
    		Erreur("Erreur de paramétrage de COM" + NumPort)
    	SINON
     
    		// -- Procédure Ecriture
    		SI (sEcrit(NumPort, SAI_commande) = Faux) ALORS
    			Trace("Erreur d'écriture")
    		SINON
    			// Attendre la fin de l'écriture
    			BOUCLE
    				SI sDansFileSortie(NumPort) = 0 ALORS 
    					Trace("=> Commande "+SAI_commande+" envoyée avec succès !")
    					SORTIR
    				FIN
    			FIN	
    		FIN
     
    		// Une fois les caractères écrits, on peut lire le retour
     
    		// -- Procédure Lecture
     
    		sEvénement(NumPort,sEveCaractèreReçu,"Lecture")
     
    	FIN
    	// Fermeture de COM1
    	sFerme(NumPort)
    FIN
    Ma procédure locale "Lecture" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    PROCEDURE Lecture()
     
    Trace("ok")
     
    NumPort = 1
     
    OctetsLus est un entier
    Str est une chaîne
     
    OctetsLus = sDansFileEntrée (NumPort)
     
    Str = sLit (NumPort ,OctetsLus)
     
    Trace(Str)
    Je pense déjà que ma fonction n'est pas exécutée puisque mon "trace(ok)" ne renvoie rien !

    Auriez-vous une idée de ce qui m'échappe ?

    Merci d'avance !

  2. #2
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 955
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 955
    Points : 9 285
    Points
    9 285
    Par défaut
    hello,

    si c'est toi qui a mis le sujet comme résolu, tu n'as pas mis comment. Dans le doute, il y a plusieurs choses qui ne vont pas dans ton code :

    1 - Le SEvénement est plutôt (pas le chien) mal placé puisque que tu envoies ta commande avant de gérer les événements.

    2 - Tu fermes la liaison tout de suite après avoir envoyé ta commande.

    Une autre chose à se méfier : je ne sais pas ce que tu commandes mais si les commandes ou les réponses ne sont pas en ascii,tu risques d'avoir des difficultés en utilisant des chaines.

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    787
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 787
    Points : 276
    Points
    276
    Par défaut
    Bonjour et merci de votre retour.

    Erreur de ma part pour le résolu !

    En effet, et maintenant ça marche avec ce code (bien mieux placé !):

    Je reçois bien des caractères ASCII uniquement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    // Initialisation des variables
     
    SAI_retour = ""
    NumPort est un entier = SAI_NUM_PORT_COM
     
    // Fermeture du port COM si déjà ouvert
     
    sFerme(NumPort)
     
    SI sOuvre(NumPort, 1, 1,sTimeoutDéfaut,Vrai) ALORS
    	sFixeParamètre(NumPort, 19200, 0, 8, 0)
    	sEcrit(NumPort,SAI_commande)
    	// Attente
    	sEvénement(NumPort,sEveCaractèreReçu,"lecturecom")
     
    SINON
    	Erreur("Erreur d'ouverture du port COM"+NumPort)
    FIN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    NumPort est un entier = SAI_NUM_PORT_COM
     
    ligne est une chaîne=sLit(NumPort,sDansFileEntrée(NumPort))
     
    Trace(ligne)
    SAI_retour = ligne
     
    sFerme(NumPort)
    En fait pas toujours justement ! Si je teste ma carte électronique avec HyperTerminal, la réponse est toujours la même et complète.

    Dans le cas de mon code, la réponse est une fois complète, une fois j'ai la moitié de la trame, ensuite, 2 caractères, ensuite la réponse complète.

    Bref, j'ai été vérifer et la configuration (vitesse, etc) du port COM est OK. Je ne sais pas d'où peut venir le soucis.

    Comment être certain de bien récupérer l'entièreté de la trame de retour du port COM avant de l'afficher ?

    D'avance, Merci !

  4. #4
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 955
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 955
    Points : 9 285
    Points
    9 285
    Par défaut
    hello,
    est-ce que la réponse est composée de beaucoup d'octets ?
    y-a-t-il une séquence de fin de réponse ( genre CR + LF) ?
    as-tu essayé de mettre une temporisation entre l'envoi de la commande et la lecture de la réponse ?


    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Février 2003
    Messages
    787
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 787
    Points : 276
    Points
    276
    Par défaut
    Un grand merci du retour, JP !

    Alors j'ai changé de technique, car c'était trop aléatoire.

    A priori pas de fin de séquence.

    je passe bien par une tempo et un buffer (le buffer ne change rien en fait d'après mes tests mais bon..)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    sFerme(NumPort)
     
    SI sOuvre(NumPort, 1, 1,sTimeoutDéfaut,Vrai) ALORS
    	sFixeParamètre(NumPort, 9600, 0, 8, 0)
    	sEcrit(NumPort,SAI_commande)
    	// Attente
     
    	Multitâche(-40)
    	TailleFileEntree est une entier = sDansFileEntrée (NumPort)
    	bufBuffer est un Buffer = sLit(NumPort,TailleFileEntree)
     
    	Trace(TailleFileEntree)
     
    	POUR i = 1 A TailleFileEntree
    		SAI_retour += bufBuffer[[i]]
    	FIN
     
    SINON
    	Erreur("Erreur d'ouverture du port COM"+NumPort)
    FIN
    La taille est apparemment toujours de 295 octets. Si je fais une pause de 0.4 ou 0.5 secondes, ça a l'air OK. Une pause de 1 seconde, et c'est de nouveau aléatoire.
    Voici l'exemple de ce que je reçois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    *******************************
    Envoie message
    Msg:72:Fin
    *******************************
     
     
    //////////////////////////////////////
    nouveau message:17 num tel : COM
    PSSSSSBC1
    //////////////////////////////////////
     
    ++++++++++++++++++++++++++++
    CARTE DE TEST   
    Msg:17 2015/04/11 16:31:48
    VALIDE
    PsSBsC001p030sp=000s
    Baterie interne=033% en charge
     
    ++++++++++++++++++++++++++++
    C'est une carte LinkItONE prévue par arduino. Bref, rien d'extraordinaire. Le hic c'est que ça me renvoie un tas d'infos en plus (je veux uniquement savoir la valeur d'une variable 1 ou 0). Donc je vais devoir décortiquer la chaine par la suite. Et donc je dois être certain que la chaine est toujours la même !

    Bref c'est très bizarre. Je ne suis pas non plus expert en transmission série. Si vous avez des conseils, je suis preneur !

  6. #6
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 955
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 955
    Points : 9 285
    Points
    9 285
    Par défaut
    hello,
    le fait que tu ne reçoives pas de trame de fin est bien gênant car tu aurais pu utilisé l'événement de caractère reçu sur port série pour remplir un buffer jusqu'à la trame de fin. Si tu reçois toujours le même nombre d'octets , tu peux faire une attente jusqu'à ce que la file d'entrée du port série est ce nombre d'octets comme ceci par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TANTQUE sDansFileEntrée(NumPort) < 295
    Multitâche(-20)
    FIN
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

Discussions similaires

  1. lecture port COM sur event
    Par fantasiopop dans le forum Développement OS X
    Réponses: 0
    Dernier message: 09/10/2014, 09h15
  2. Lecture port COM problème
    Par seb-65 dans le forum WinDev
    Réponses: 13
    Dernier message: 19/09/2012, 02h18
  3. lecture port com
    Par vinowan dans le forum VB.NET
    Réponses: 11
    Dernier message: 30/07/2008, 09h22
  4. [débutant]Lecture port COM avec configue
    Par kyoleroi dans le forum C++
    Réponses: 0
    Dernier message: 22/04/2008, 12h02
  5. Ecriture sur un port com
    Par sylviek dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 10/10/2006, 07h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo