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

C++ Discussion :

Comment attendre une trame sur le port série ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Par défaut Comment attendre une trame sur le port série ?
    Bonjour à tous,

    je suis en train de créer un programme qui lit sur la com série.
    Sur cette com est branché un module qui reçoit des trammes, que je dois pouvoir lire avec l'application que je réalise pour ensuite enregistrer ces informations dans un fichier.

    Pour le moment, j'ai réussi à ouvrir et à configurer la com.
    Mon problème est que maintenant je voudrai voir les infos qui arrive avec la fonction ReadFile, mais lorsque je lance le programme, il s'ouvre puis se referme.
    J'aimerai que ce programme tourne à l'infini car les infos arrivent à peu près toutes les minutes.

    Merci pour vos réponses, à bientôt !

  2. #2
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Il faut que tu lances un thread en parallèle de ton programme principal et qui génère un évènement (par exemple) lorsque il lit quelque chose sur la liaison série.
    Il existe sûrement d'autres possibilités, mais je trouve ça assez simple à mettre en oeuvre.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Par défaut
    OK d'accord, car mon programme donne cela pour l'instant :

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
    #include <vcl.h>
     
    #include <stdio.h>
    #include <windows.h>
    #include <windef.h>
    #include <stdlib.h>
    #include <iostream.h>
    #include <limits.h>
     
    #pragma hdrstop
     
    //---------------------------------------------------------------------------
     
    #pragma argsused
    int main(int argc, char* argv[])
    {
     
    	HANDLE handle;
    	DCB dcb;
     
    	BOOL PortReady;
    	BOOL fSuccess;
     
    	DWORD nblu=0,nbecrit; 
     
    /*--------------------------------------------------------------------*/
    /* Ouverture du port de communication pour la base de collecte */
    /*--------------------------------------------------------------------*/
     
     
    	handle = CreateFile(
    			"COM5",
    			GENERIC_READ | GENERIC_WRITE , // acces pour lire et ecrire sur le port
    			0,
    			NULL,
    			OPEN_EXISTING,
    			0,
    			NULL
    			) ;
     
    	if(handle == INVALID_HANDLE_VALUE)
    	{
    		printf("Impossible d'ouvrir le port (erreur %d)\n", GetLastError());
    	return 0;
     
    	}
    		printf("Ouverture du port reussie");
     
     
    	return 0;
     
    	PortReady=SetupComm(handle,5000,5000);
     
    	fSuccess = GetCommState(handle, &dcb);
     
    	if (!fSuccess)
    	{
    		printf("probleme 1");
     
    	getchar();
    	}
     
    	dcb.BaudRate = 38400 ; /* vitesse */
    	dcb.ByteSize =8 ; /* nombre de bits */
    	dcb.Parity=NOPARITY;
    	dcb.StopBits = ONESTOPBIT;
    	dcb.fNull=FALSE;
    	dcb.fRtsControl=RTS_CONTROL_ENABLE;
    	dcb.fInX=FALSE;
    	dcb.fOutX=FALSE;
    	dcb.fDtrControl=DTR_CONTROL_ENABLE;
     
    /*-----------------------------------------------------------*/
    /* on applique les changements au port COM1 */
    /*-----------------------------------------------------------*/
     
    	PortReady=SetCommState(handle,&dcb);
     
    	if(!SetCommState(handle,&dcb))
    	{
    		printf("probleme 1");
     
    		getchar();
     
    	}
     
     
     
        char buf;
     
    	ReadFile(handle,&buf,sizeof(buf),&nblu,NULL);
     
    	printf ("octets lus : %h ", buf );
     
     
    	CloseHandle(handle);
    Est-ce utile de lancer un thread ?

    Punaise je ne comprend pas le fonctionnement des threads !!!

    Comment on les utilise ???

    Comment dois-je faire dans mon application ?

  4. #4
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Pour moi, il est utile de lancer un thread sinon ton application bloquera sur chaque lecture/écriture que tu lui demanderas.
    Un thread est un bout de code qui va s'exécuter en parallèle* du code principal. Tu le lances avec la fonction CreateThread (voir MSDN).
    En bref, en faisant une recherche "thread" ou "createthread" dans la partie C++ du forum, tu trouveras sûrement ton bonheur dans des exemples d'autres participants du forum!

    *pas vraiment exact, mais ce n'est pas le sujet ici

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Je partage l'avis de SpoutSpout. Lorsqu'une application doit se mettre à l'écoute d'un flux de données, il est toujours bon de le découper en au moins 2 threads: un premier pour gérer la réception des données, un second pour gérer leur traitement et l'IHM (le 'et' tendrait à dire 3 thread si le traitement des données est gourmand).
    Enfin, dans ton bout de code, tu ne fais pas de boucle sur la réception. Dès le premier octet reçu, tu sort de ReadFile et quitte la fonction.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Par défaut
    J'ai compris, mais l'application que je fais ne dois pas avoir d'IHM.
    C'est une application de type console qui doit tourner en permanence !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/06/2008, 16h12
  2. Comment envoyer une adresse par le port série
    Par christophe_s46 dans le forum WinDev
    Réponses: 3
    Dernier message: 10/09/2007, 01h52
  3. Comment lire une pin sur le port série du pc
    Par KENPACHI dans le forum LabVIEW
    Réponses: 1
    Dernier message: 25/05/2007, 12h56
  4. Réponses: 3
    Dernier message: 18/07/2006, 13h37
  5. [USB]envoyer une trame sur le port USB
    Par ced38100 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 03/11/2005, 12h54

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