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 :

WriteFile et liaison série


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 117
    Points : 29
    Points
    29
    Par défaut WriteFile et liaison série
    Bonjour,

    je souhaiterai avoir un exemple de programme en C++ pour envoyer un caractère dans un premier temps, plusieurs dans un second.
    J'ai entendu parlé de la fonction "WriteFile"

    Mon but est d'envoyer via liaison série RS232 des caractères venant d'un premier PC, reçu et lu par Hyperterminal sur un second PC.

    Voici un premier programme réalisé, mais qui ne fonctionne pas. Avec un exemple ou une correction à apporter ?

    Code Programme : 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
     
    /**************************************************************************\
    *                                                                                                                                                  *
    *          Exemple d'utilisation des lignes d'entrée/sortie du port série        *
    *                                                                                                                                                  *
    *                                                                                                                                                  *
    *                                                                                                                                                  *
    *                                   by gg                                                          *
    *                                                                                                                                                  *
    \**************************************************************************/
     
     
    #include <windows.h>
    #include <iostream>
     
    using namespace std;
    int main(void)
    {
     
    // On crée un handle que l'on initialise à NULL.
    HANDLE SPort=NULL;
    DWORD Event;
    COMMCONFIG tR;
     
     
     
        // Sport est un handle ( identifiant )
    	// Pour mieux comprendre les paramètre passés
    	// consultez la fonction CreateFile();
    	SPort = CreateFile("COM4",
    					   GENERIC_READ | GENERIC_WRITE,
    					   0,
    					   NULL,
    					   OPEN_EXISTING,
    					   0,
    					   NULL);
    	// Le handle sera le lien entre notre apllication
    	// et le port série.
    	// Ici ce sera le port indiquédans le tableau COM déclaré au début qui sera ouvert.
     
    	if ( SPort == INVALID_HANDLE_VALUE )
    	{
    		cout << "Le port selectionne ne peut etre ouvert ou l'est deja" ;
    		return 0;
    	}
     
     
    	// Vérification de parité désactivée
    	tR.dcb.fParity=NOPARITY;
    	// La taille du mot donnée est de
    	tR.dcb.ByteSize=8;
    	// Un bit de stop
    	tR.dcb.StopBits=ONESTOPBIT;
    	// désactive les Xon-Xoff
    	tR.dcb.fInX=FALSE;
    	tR.dcb.fOutX=FALSE;
    	// Configuration du BaudRate
    	tR.dcb.BaudRate= CBR_9600;
     
    	// Enregistrer les modifications apportées
    	// au paramètres Xon-Xoff
    	SetCommConfig(SPort, &tR, sizeof(tR));
    	// On remplit la strucuture COMMTIMEOUTS
    	COMMTIMEOUTS tMyTimeOuts =  {
    	100,
        0,
        0,
        1000,
        1000
        };
     	 //Enregistre les modifications concernant le CommTimeouts
    	if (!SetCommTimeouts(SPort, &tMyTimeOuts) )
    	{
    		MessageBox(0,"Erreur de configuration","Erreur",MB_OK);
    		return 0;
    	}
     
    	unsigned char buffer;
    	DWORD nb;
    	int data[50],nombre;
    	int j,i;
        i='f';
        buffer=i;
    		//ReadFile(SPort,&buffer,1,&nb,0);
    		//writefile pour envoyer une donnee
        WriteFile( SPort,&buffer,1,&nb,0);
        cout<<"ok"<<endl;
    }
    	return 0;
    }

  2. #2
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    Points : 113
    Points
    113
    Par défaut
    Bonjour,

    J'ai fait ma propre classe de gestion du port série à partir des informations de cette page : http://msdn.microsoft.com/en-us/library/ms810467.aspx.
    Il y a tout ce qu'il te faut pour l'ouverture, la lecture et l'écriture, mais il manque la configuration.

    Pour celle-ci, je n'ai pas utilisé la structure COMMCONFIG comme toi mais DCB (http://msdn.microsoft.com/en-us/library/aa363214.aspx) que tu peux lire avec GetCommState, modifier et réécrire avec SetCommState.
    Peut-être que ton problème vient de là.

  3. #3
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Hum... La gestion du port série est gérée par Boost.Asio ICI. Le code est portable, qui plus est!

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    Points : 113
    Points
    113
    Par défaut
    Ha, ça fait pas de mal de mettre le nez dans l'API windows , ça forme la jeunesse.

    Blague à part, je ne connaissais pas cette possibilité de Boost, j'y jetterai un oeil. Merci.

  5. #5
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par emiaille Voir le message
    Ha, ça fait pas de mal de mettre le nez dans l'API windows , ça forme la jeunesse.
    Si on est sûr de faire que du Windows, pourquoi pas... Mais Boost.Asio propose un style C++ élégant, avec un degré d'abstraction bien supérieur. Ce qui marche avec des sockets marchera également avec un port série. Ce n'est qu'une interface d'entrée/sortie !

Discussions similaires

  1. liaison Série avec kernell32
    Par Emcy dans le forum Windows
    Réponses: 8
    Dernier message: 31/08/2005, 09h58
  2. Réponses: 7
    Dernier message: 21/06/2005, 17h56
  3. [Debutant(e)] Liaison série RS232 et servlet
    Par bourack dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 07/01/2005, 15h50
  4. Réponses: 29
    Dernier message: 11/05/2004, 14h18
  5. liaison série
    Par elodie escande dans le forum MFC
    Réponses: 13
    Dernier message: 14/01/2004, 18h57

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