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

GTK+ avec C & C++ Discussion :

GIOchannel sous Windows


Sujet :

GTK+ avec C & C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 16
    Par défaut GIOchannel sous Windows
    Salut à tous !

    J'aimerais faire communiquer mon programme (GTK) avec un port série. Ce que je voudrais qu'il fasse, c'est que lorsque des données sont présentes sur le port série, alors on exécute une série d'actions, et lorsqu'il n'y a rien sur le port série, on attend qu'une donnée arrive.

    Après plusieurs recherches, j'ai pu voir qu'on pouvait traiter ce problème avec les GIOchannel. Le problème, c'est que c'est parfaitement compatible pour Unix, mais pour Windows, c'est pas sûr que ça marche.

    Est ce que quelqu'un l'a déjà utilisé sous Windows ? Et j'aimerais bien obtenir plus d'informations aussi, à savoir comment ça marche et comment l'utiliser, car la doc est en anglais...

    Merci beaucoup pour votre aide

  2. #2
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Bonjour,

    Les GIOChannel fonctionnent sous Windows, le problème c'est que pour communiquer avec le port série sous Linux tu travaille avec un descripteur de fichier donc qu'il est possible de convertir grâce à la fonction g_io_channel_unix_new, par contre sous Windows tu travaille avec un HANDLE.

    Peut être avec la fonction g_io_channel_win32_new_messages sinon tu peux toujours créer ton propre support en implémentant la structure GIOFuncs mais aucune doc n'est disponible

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 16
    Par défaut
    Merci pour ta réponse gege2061. Ca m'a l'air bien compliqué de pouvoir faire fonctionner un port série avec GTK sous windows.

    Est ce qu'il existe des protocoles de communication qui sont plus facilement gérés par GTK (du style USB ou Ethernet) ?

  4. #4
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par quentennis Voir le message
    Est ce qu'il existe des protocoles de communication qui sont plus facilement gérés par GTK (du style USB ou Ethernet) ?
    Non ce n'est pas du tout le but de GTK. Il faut se tourner soit vers les appels système soit vers des bibliothèques prévu pour ça.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 16
    Par défaut
    Citation Envoyé par gege2061 Voir le message
    Non ce n'est pas du tout le but de GTK. Il faut se tourner soit vers les appels système soit vers des bibliothèques prévu pour ça.
    Hum c'est quoi des appels système ? Et quand tu parles de bibliothèques prévues pour l'utilisation d'un port série (ou autre), tu veux dire des interfaces graphiques ?

    Est ce que tu as une suggestion d'interface graphique qui pourrait être compatible avec mon problème ?

    Merci !!!

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 172
    Par défaut
    Citation Envoyé par quentennis Voir le message
    Hum c'est quoi des appels système ?
    Un appel système c'est une instruction qui une fois compilée conduit à un ou plusieurs syscall en langage assembleur.
    un printf effectue un appel système.
    un malloc en effectue une quarantaine si j'me souviens bien.
    Les appels systèmes servent à effectuer toutes les opérations qui ne sont pas directement liées à la modification de la mémoire déjà allouée pour le processus en cours.
    Après, j'ai pas la moindre idée de comment les utiliser pour des protocols de communication
    C'est au-dessus de mon niveau ça ^^

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Citation Envoyé par Kicker Voir le message
    un malloc en effectue une quarantaine si j'me souviens bien.
    Hmmm... Un malloc peut n'effectuer aucun appel système, au pire ça va appeler brk ou mmap, je suis pas sûr que ça fasse d'autres appels systèmes (du moins en monothread, en multithread tu risques d'avoir qques autres appels systèmes puor le locking)

  8. #8
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 315
    Billets dans le blog
    5
    Par défaut
    J'ai trouvé ce code pour accéder au port série. Il va falloir faire des essais...
    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
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    // FICHIERS D'INCLUSION
    //------------------------------------------------------------------------------
    #include <windows.h>
    #include <winbase.h>
    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
     
    // CONSTANTES
    //-------------------------------------------------------------------------------
    // Définition du code d'erreurs
    typedef enum
    {
    	e_ErrCom_None,		// Pas d'erreur
    	e_ErrCom_Creation,	// Erreur lors de la création du flux
    	e_ErrCom_Utilise,		// Le port com est déjà utilisé
    	e_ErrCom_Inexistant,	// Le port com n'existe pas
    	e_ErrCom_Timeout,	// Timeout lors d'une émission-réception
    	e_ErrCom_Emission,		// Erreur lors de l'émission
    	e_ErrCom_Reception,		// Erreur lors de la réception
    	e_ErrCom_Definition_Trame,	// Erreur de définition de la trame
    	e_ErrCom_Nack,	// Demande non prise en coompte
    	e_ErrCom_Checksum		// Erreur de checksum
    } e_ErrCom;
     
    // Nom du port série
    #define PORT1		"COM1"
    #define PORT2		"COM2"
     
    // Définition des vitesses de communication
    #define V1200		1200
    #define V2400		2400
    #define V4800		4800
    #define V9600		9600
     
    // Définition du nombre de bits
    #define BITS_7	7
    #define BITS_8 	8
     
    // Définition du nombre de bits de stop
    #define BIT_DE_STOP_1	1
    #define BIT_DE_STOP_2	2
     
    // Définition de la parité
    #define PAS_DE_PARITE	'N'
    #define PARITE_IMPAIRE	'O'
    #define PARITE_PAIRE	'E'
     
    // Codes de retour génériques
    #define OK 1
    #define KO 0
     
    // Longueur max réservée pour une trame
    #define LG_TRAME	100
     
    // PROTOTYPES
    //----------------------------------------------------------------------------
    e_ErrCom OuvreCom(char *strPort,long BaudRate,int BitsSize,int Parity,int StopBits);
    e_ErrCom EmissionCom(const void *lpBuf, unsigned int nCount);
    e_ErrCom ReceptionCom(void *lpBuf, unsigned int nCountMax, unsigned int *pCountRead);
    void FermeCom();
     
    // VARIABLES GLOBALES
    //-----------------------------------------------------------------------------
    DCB g_DCB;                          // structure dcb du port
    e_ErrCom g_ErrCom= e_ErrCom_None;	// Variable des erreurs de com
    HANDLE g_hCom = 0;			// handle de la com
     
     
    void main (void)
    {
    	//Exemple de configuration du port serie :
    	g_ErrCom=OuvreCom(PORT1,V9600,BITS_8,PARITE_PAIRE,BIT_DE_STOP_1);
    	//Exemple d'emission
    	g_ErrCom=EmissionCom("UneTame",sizeof("UneTame"));
     
    }
     
     
    //------------------------------------------------------------------------------
    // FONCTION	: OuvreCom
    //------------------------------------------------------------------------------
    // DESCRIPTION 	:
    // Initialise et ouvre un port série
    //
    //------------------------------------------------------------------------------
    // PARAMETRES 	: 
    //		- strPort		Nom du port "COM1", "COM2"
    //		- BaudRate		Vitesse
    //		- BitsSize		Taille de l'info
    //		- Parity		Parité
    //		- StopBits		Nombre de bits de stop
    //
    // RETOUR 	:Code d'erreur
    //------------------------------------------------------------------------------
    e_ErrCom OuvreCom(char *strPort,long BaudRate,int BitsSize,int Parity,int StopBits)
    {
    	g_ErrCom = e_ErrCom_None;
     
    	// On ouvre le port série
    	g_hCom = CreateFile(strPort,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING,NULL);
     
    	if(g_hCom == INVALID_HANDLE_VALUE)
    	{
    		// Echec
    		g_ErrCom=e_ErrCom_Creation;
    	}
    	else
    	{
    		// On vide les buffers
    		PurgeComm(g_hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);		
     
    		// On paramètre le port série
    		g_DCB.DCBlength = sizeof(DCB);
    		//Configuration actuelle
    		GetCommState(g_hCom, &g_DCB);
    		//Modification du DCB
    		g_DCB.BaudRate=BaudRate;
    		g_DCB.ByteSize=BitsSize;
    		g_DCB.Parity=Parity;
    		g_DCB.StopBits=StopBits;
    		g_DCB.fDtrControl=DTR_CONTROL_DISABLE;
    		//Configuration de la liaison serie
    		SetCommState(g_hCom,&g_DCB);
    	}
    	return g_ErrCom;
    }
     
     
     
    //----------------------------------------------------------------------------
    // FONCTION	: EmissionCom
    //----------------------------------------------------------------------------
    // DESCRIPTION	:
    // Emission d'octets sur la liaison série
    //
    //----------------------------------------------------------------------------
    // PARAMETRES	: 
    //		-lpBuf Pointeur sur les octets a emettre
    //		-nCount Nombre d'octet a emettre
    //
    //----------------------------------------------------------------------------
    // RETOUR	:Code d'erreur
    //----------------------------------------------------------------------------
    e_ErrCom EmissionCom(const void* lpBuf,unsigned int nCount)
    {	
     
    	DWORD NumBytes=0;
     
    	if(g_hCom!=NULL)
    	{
    		// On pari sur pas d'erreur
    		g_ErrCom=e_ErrCom_None;
     
    		//Emission du buffer
    		if(WriteFile(g_hCom,lpBuf,nCount,&NumBytes,NULL)==0)
    		{
    			g_ErrCom=e_ErrCom_Emission;
    		}
    	}
    	else
    		//Le port n'a pas été ouvert
    		g_ErrCom=e_ErrCom_Creation;
     
    	return g_ErrCom;
     
    }
     
    //---------------------------------------------------------------------------
    // FONCTION	: ReceptionCom
    //---------------------------------------------------------------------------
    // DESCRIPTION	:
    // Reception de caractères sur la liaison série
    //
    //---------------------------------------------------------------------------
    // PARAMETRES	: 
    //		-lpBuf Pointeur sur le buffer de caractère a lire
    //		-nCountMax Nombre maxi de caractère a lire
    //		-pCountRead Pointeur sur le nombre de caractères lus
    //---------------------------------------------------------------------------
    // RETOUR	:Code d'erreur
    //---------------------------------------------------------------------------
    e_ErrCom ReceptionCom(void *lpBuf,unsigned int nCountMax, unsigned int* pCountRead)
    {
    COMSTAT Stat;
    DWORD Errors;
    unsigned int nCarALire;
    unsigned long NCarLus=0;
     
    	if(g_hCom!=NULL)
    	{
    		//on pari sur pas d'erreur
    		g_ErrCom=e_ErrCom_None;
     
    		//Pour éviter de gérer un time out
    		Sleep(500);
     
    		//Pour connaitre le nombre d'octets dans le buffer d'entrée
    		ClearCommError(g_hCom,&Errors,&Stat);
    		nCarALire=Stat.cbInQue;
     
    		//On effectue la lecture si il y a des caractères présents
    		if( (nCarALire>0)&&(nCarALire<=nCountMax) )
    		{
    			if(ReadFile(g_hCom,lpBuf,nCarALire,&NCarLus,NULL)==0)
    			{		
    				g_ErrCom=e_ErrCom_Reception;
    			}
     
    		}
    		*pCountRead=NCarLus;
    	}
    	else
    		//Le port n a pas été ouvert
    		g_ErrCom=e_ErrCom_Creation;
     
    	//Compte rendu de l'exécution
    	return g_ErrCom;
     
    }
     
    //-----------------------------------------------------------------------
    // FONCTION	: FermeCom
    //-----------------------------------------------------------------------
    // DESCRIPTION	:
    // Ferme le port série préalablement ouvert avec OuvreCom
    //
    //-----------------------------------------------------------------------
    // PARAMETRES	: 
    //		Néant
    //-----------------------------------------------------------------------
    // RETOUR	:Néant
    //-----------------------------------------------------------------------
    void FermeCom()
    {
    	if(g_hCom!=NULL)
    	{
    		CloseHandle(g_hCom);
    	}
    }
    J'ajoute ce PDF sur la description d'un port série ainsi que ca programmation.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 16
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    J'ai trouvé ce code pour accéder au port série. Il va falloir faire des essais...
    J'ai testé ce code, il marche parfaitement bien. Il y a juste quelques petites modifications à y apporter pour corriger quelques petites erreurs, sinon, pas de problème particulier.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 16
    Par défaut
    Bon j'ai toujours pas réussi à faire marcher les GIOchannel sous Windows. Je pense que je vais changer d'interface graphique, il faut absolument que je récupère des données de mon port série pour pouvoir en faire un traitement, et les afficher à l'écran par la suite.

    Est ce que quelqu'un connait une interface graphique qui serait capable de faire ça ?

    Merci pour vos réponses.

  11. #11
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Bah GTK peut afficher tout et n'importe quoi, par contre il faut que tu ecrives du code pour lire tes donnees depuis le port serie.... Je doute que tu trouves un toolkit avec un widget ToolkitWidgetDisplayDataFromSerialPort tout fait.

Discussions similaires

  1. quel langage choisir pour faire de script sous windows
    Par pas05 dans le forum Langages de programmation
    Réponses: 7
    Dernier message: 18/11/2002, 22h42
  2. Assembleur sous Windows et sous Linux
    Par Bibouda dans le forum x86 32-bits / 64-bits
    Réponses: 3
    Dernier message: 28/10/2002, 07h55
  3. Tester connexion Internet active sous Windows
    Par Altau dans le forum Développement
    Réponses: 3
    Dernier message: 12/08/2002, 12h43
  4. Pas de fork sous Windows?
    Par chezjm dans le forum POSIX
    Réponses: 8
    Dernier message: 11/06/2002, 12h15
  5. OmniORB : code sous Windows et Linux
    Par debug dans le forum CORBA
    Réponses: 2
    Dernier message: 30/04/2002, 17h45

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