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 :

Intégrer code du port parallèle dans un projet sans fonction main


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 87
    Points : 64
    Points
    64
    Par défaut Intégrer code du port parallèle dans un projet sans fonction main
    Bonjour a tous,

    Je dois connecter deux ordinateurs via le port parallèle. J' ai trouvé sur ce site: http://logix4u.net/Legacy_Ports/Para...000/NT/XP.html, la dll inpout32 avec un code c à tester et ça fonctionne. J'appelerai ce projet: projetPP

    Seulement je dois intégrer cette partie du port parallèle dans un projet existant beaucoup plus complexe (que j'appellerai projetGlobal) que je n'ai pas développer et que j'ai trouvé dans mon labo. Grosso modo, ce projet contrôle des appareils électroniques et fonctionne très bien mais hélas il est dépourvu de commentaires du programmeur.

    Le projetPP contient trois fichiers:
    inpout32.h et inpout32.c que j'ai pu copier facilement dans le projetGlobal
    un fichier test.c qui contient la fonction int main(void) qui permet justement d'écrire sur le port parallèle et dont le code est le suivant:

    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
    int main(void)
    {
         HINSTANCE hLib;
     
         // Attempt to initialize the interface
         if (inpout32_init() != 0) {
     
              fprintf(stderr,
                   "ERROR: Failed to initialize Inpout32 interface!\n");
     
              exit (-1);
         }
     
    /* *************************************************** */
    /*  IF WE REACHED HERE, INITIALIZED SUCCESSFUL    **** */
    /* *************************************************** */
     
         /* test the function */
     
         test_write_datum(0xAA);
     
         /* finished - unload library and exit */
         inpout32_unload();
     
         return 0;
    }
    Mon gros problème, c'est que je ne trouve pas de fonction main dans le projetGlobal et donc je ne sais pas dans quel partie du projet je dois copier ce code ci-dessus. Merci pour votre indulgence et votre aide.

    Pour info, j'utilise Visual C++ 2008 express edition

  2. #2
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Sous Windows le point d'entrée d'un programme peut être WinMain et non main.

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 87
    Points : 64
    Points
    64
    Par défaut
    Merci Melem mais je ne trouve pas WinMain non plus

  4. #4
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 87
    Points : 64
    Points
    64
    Par défaut
    Je viens de réaliser que mon projetGlobal est une application MFC. Je ne sais pas du tout ce que c'est, mais est-ce la raison de l'absence de la fonction main?

  5. #5
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Dans ce cas ce sera un peu plus compliqué. Une application MFC possède toujours une classe qui dérive de CWinApp et qui représente l'application. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CMyApp : public CWinApp {
        ...
    };
    Supposons que le nom de la classe soit effectivement CMyApp, alors cherche l'implémentation de la fonction CMyApp::InitInstance. Dans une application MFC, c'est la fonction qui ressemble le plus à un main. N'hésite pas à consulter les tutoriels MFC du site en cas de problème.

  6. #6
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 87
    Points : 64
    Points
    64
    Par défaut
    C'est bon, j'ai trouvé BOOL CMyApp::InitInstance() qui appelle CMyApp dlg mais je ne m'y connais pas du tout en application MFC et je vois que ce n'est pas très simple surtout que je débute sous C++.

    Je pense que je n'ai pas le droit de copier directement ma fonction main ci-dessus sous CMyApp::InitInstance, comment faire pour copier mon code sous InitInstance?

    Merci encore pour votre aide.

  7. #7
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 87
    Points : 64
    Points
    64
    Par défaut
    Ah oui, autre chose. J'avais trouvé un code pour port parallèle avec application MFC. Ici http://electrosofts.com/parallel/parallelwin.html, je pense que ça aurait faciliter le problème sauf que je travail avec express édition de visual c++ et le MFC appWizard n'est pas disponible dans cette version gratuite. Hélas, je n'ai que cette version sous la main.

  8. #8
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Je pense que je n'ai pas le droit de copier directement ma fonction main ci-dessus sous CMyApp::InitInstance, comment faire pour copier mon code sous InitInstance?
    Si, tu peux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    BOOL CMyApp::InitInstance()
    {
        // 1. contenu de ta fonction main ici
        // 2. ce qu'il y avait déjà dans cette fonction à partir d'ici
    }

  9. #9
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 87
    Points : 64
    Points
    64
    Par défaut
    Voila le code de CMyApp au complet:

    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
     
    #include "stdafx.h"
     
    #include "MyApp.h"
    #include "MyAppDlg.h"
     
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
     
    #include <stdio.h>
    #include <conio.h>
    #include <windows.h>
     
    #include "inpout32.h"    // our non-system header in quotes
     
    #define PPORT_BASE ((short) 0x378) //! < CHANGE THIS IF NEEDED !
     
    // Prototypes for Test functions
    static void test_write_datum(short datum);
     
     
    // Single Instance :
    #pragma data_seg("Shared")
    LONG g_Counter = -1;
    #pragma data_seg()
    #pragma comment (linker, "/section:Shared,rws")
     
     
    /////////////////////////////////////////////////////////////////////////////
    // CMyMFCApp
     
    BEGIN_MESSAGE_MAP(CMyMFCApp, CWinApp)
    	//{{AFX_MSG_MAP(CMyMFCApp)
    		// NOTE - the ClassWizard will add and remove mapping macros here.
    		//    DO NOT EDIT what you see in these blocks of generated code!
    	//}}AFX_MSG
    	ON_COMMAND(ID_HELP, CWinApp::OnHelp)
    END_MESSAGE_MAP()
     
    /////////////////////////////////////////////////////////////////////////////
    // CMyMFCApp construction
     
    CMyMFCApp::CMyMFCApp()
    {
    	// Test si l'appli a déja été lancée : 
    	BOOL fFirstInstance = (InterlockedIncrement(&g_Counter) == 0);
    	if (! fFirstInstance)
    	{
    		MessageBeep(MB_ICONERROR);
    		exit(0);
    	}
    }
     
    /////////////////////////////////////////////////////////////////////////////
    // The one and only CMyMFCApp object
     
    CMyMFCApp theApp;
     
    /////////////////////////////////////////////////////////////////////////////
    // CMyMFCApp initialization
     
    BOOL CMyMFCApp::InitInstance()
    {
    	// Standard initialization
    	// If you are not using these features and wish to reduce the size
    	//  of your final executable, you should remove from the following
    	//  the specific initialization routines you do not need.
     
    #ifdef _AFXDLL
    	Enable3dControls();			// Call this when using MFC in a shared DLL
    #else
    	Enable3dControlsStatic();	// Call this when linking to MFC statically
    #endif
     
     
    	CMyMFCDlg dlg;
    	m_pMainWnd = &dlg;
    	int nResponse = dlg.DoModal();
    	if (nResponse == IDOK)
    	{
    		// TODO: Place code here to handle when the dialog is
    		//  dismissed with OK
    	}
    	else if (nResponse == IDCANCEL)
    	{
    		// TODO: Place code here to handle when the dialog is
    		//  dismissed with Cancel
    	}
     
    	// Since the dialog has been closed, return FALSE so that we exit the
    	//  application, rather than start the application's message pump.
    	return FALSE;
     
     
    	//**************Lancer la fonction du port parallele*******
    	 HINSTANCE hLib;
         // Attempt to initialize the interface
         if (inpout32_init() != 0) {
              fprintf(stderr,
                   "ERROR: Failed to initialize Inpout32 interface!\n");
              exit (-1);
         }
         /* test the functions */
         test_write_datum(0xAA);
         inpout32_unload();
         return 0;
     
    	void test_write_datum(short datum) {
         short x;
         short i;
     
         i=PPORT_BASE;
         x = datum;
     
         /*****  Write the data register */
         Out32(i,x);
     
         printf("Port write to 0x%X, datum=0x%2X\n" ,i ,x);
     
         /***** And read back to verify  */
         x = Inp32(i);
         printf("Port read (%04X)= %04X\n",i,x);
     
         return;
    }
     
    }
    l'application se lance mais aucune trace de la partie qui concerne le port parallèle. Quand le projetPP est exécuté séparément, une fenêtre MSDos s'ouvre et je vois les étapes du programme mais la rien même pas un message d'erreur.

  10. #10
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Tout dépend du scénario d'utilisation de ton échange entre les 2 PC.
    S'il y a une phase d'initialisation (et non d'ouverture du canal de communication) et de terminaison (et non de fermeture du canal) de ta bibliothèque, leur place est probablement dans CMyApp::InitInstance pour l'initialisation et CMyApp::ExitInstance pour la fermeture.
    Ensuite tu dois identifier le moment où l'échange doit avoir lieu : tout le temps, sur l'ouverture, sur click bouton, etc... En fonction de ça, les fonctions d'ouverture du canal, d'envoi et de réception trouverons leur juste place. Donc avant de donner une réponse toute faite, il faut aussi que tu ais spécifier ton appli.

  11. #11
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    zimoun : Waw . Et mes 1. et 2. alors, t'en as fait du pâté ?
    Citation Envoyé par Melem
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    BOOL CMyApp::InitInstance()
    {
        // 1. contenu de ta fonction main ici
        // 2. ce qu'il y avait déjà dans cette fonction à partir d'ici
    }
    Ce qui devrait donner :
    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
    BOOL CMyMFCApp::InitInstance()
    {
         // 1. contenu de ta fonction main ici
     
         //**************Lancer la fonction du port parallele*******
    	 HINSTANCE hLib;
         // Attempt to initialize the interface
         if (inpout32_init() != 0) {
              fprintf(stderr,
                   "ERROR: Failed to initialize Inpout32 interface!\n");
              exit (-1);
         }
         /* test the functions */
         test_write_datum(0xAA);
         inpout32_unload();
         return 0;
     
    	void test_write_datum(short datum) {
         short x;
         short i;
     
         i=PPORT_BASE;
         x = datum;
     
         /*****  Write the data register */
         Out32(i,x);
     
         printf("Port write to 0x%X, datum=0x%2X\n" ,i ,x);
     
         /***** And read back to verify  */
         x = Inp32(i);
         printf("Port read (%04X)= %04X\n",i,x);
     
         // 2. ce qu'il y avait déjà dans cette fonction à partir d'ici
     
     
    	// Standard initialization
    	// If you are not using these features and wish to reduce the size
    	//  of your final executable, you should remove from the following
    	//  the specific initialization routines you do not need.
     
    #ifdef _AFXDLL
    	Enable3dControls();			// Call this when using MFC in a shared DLL
    #else
    	Enable3dControlsStatic();	// Call this when linking to MFC statically
    #endif
     
     
    	CMyMFCDlg dlg;
    	m_pMainWnd = &dlg;
    	int nResponse = dlg.DoModal();
    	if (nResponse == IDOK)
    	{
    		// TODO: Place code here to handle when the dialog is
    		//  dismissed with OK
    	}
    	else if (nResponse == IDCANCEL)
    	{
    		// TODO: Place code here to handle when the dialog is
    		//  dismissed with Cancel
    	}
     
    	// Since the dialog has been closed, return FALSE so that we exit the
    	//  application, rather than start the application's message pump.
    	return FALSE;
    }
     
    }
    Et tu devrais remplacer tes printf et fprintf par des MessageBox. Impossible que tu ne saches encore pas ce que c'est qu'un MessageBox si t'as déjà commencé à lire des cours de MFC comme je te l'avais prescrit.

  12. #12
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 87
    Points : 64
    Points
    64
    Par défaut
    Merci Melem et 3Darchi pour vos réponses respectives.

    En fait, je dois connecter mon ordinateur qui contrôle un capteur de position à un autre ordinateur qui lui contrôle un EEG. Je fais de la psychologie et il n'y a personne pour m'aider, donc je bidouille comme je peux. J'ai commencé par lire les cours de C, ensuite C++ et ceux du MFC, mais comme j'utilise V C++ express édition qui ne contient pas le MFC appWizard, je ne peux pas utiliser toute les fonctionnalités du guide.

    Le sujet doit tourner le capteur de position, qui dans le code du projetGlobal a la variable PosCapteur. À chaque fois que cette position atteint la valeur 10, ça devrait être envoyer via le port parallèle à l'ordinateur EEG. Ensuite, le sujet appuie sur une des touches de directions gauche ou droite, et ça devrait aussi être envoyé sur le port. Je n'en suis pas là pour l'instant, je suis en train de tester si le code fourni avec inpout32 dll fonctionne lorsque je l'intègre au projetGlobal. Peut être que ce n'est pas la bonne stratégie finalement.

    Meltem, merci pour le code, je vais le tester tout à l'heure une fois au labo.

  13. #13
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 87
    Points : 64
    Points
    64
    Par défaut
    Bonjour a tous,

    J'ai mis du temps pour trouver mais au moins j'ai quelque chose.

    Voici ce que j'ai fait

    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
     
     
    /* ----Prototypes of Inp and Outp--- */
     
    short _stdcall Inp32(short PortAddress);
    void _stdcall Out32(short PortAddress, short data);
     
     
    void CStimMFCDlg::OnTimer(UINT nIDEvent) 
    {
    	CDialog::OnTimer(nIDEvent);
     
    	switch( nIDEvent )
    	{
    		case kTIMERPAUSE :
    			KillTimer(kTIMERPAUSE);
    			{.....}	
    			break;
     
    		case kTIMEREVENT :				
    			KillTimer(kTIMEREVENT);
    			{
    				if(theValue == Config.OutVal)
    					Out32(Config.OutPort,Config.OutSendOnVal);
    			}		
    			break;
    	}
    }
     
    BOOL CStimMFCDlg::PreTranslateMessage(MSG* pMsg) 
    {
    	{
    		switch(pMsg->wParam)
    		{
    		case VK_LEFT :
    			Out32(Config.OutPort, Config.OutSendOnLft);	
    			break;
     
    		case VK_RIGHT :
    			Out32(Config.OutPort, Config.OutSendOnRgh);
    			break;
           }
    }
    Grosso modo, j'envoie quelque chose sur le port parallèle a chaque fois que (1) The value atteint une valeur spécifique, (2) la personne appuie sur les touches gauche ou droite.

    Je connecte mon ordinateur a l'ordinateur EEG, j'ouvre le logiciel EEG et je teste le port, ça marche, c-a-d que je reçois quelque chose. Seulement ce quelque chose ne correspond pas vraiment a ce que l'ordinateur EEG attend de recevoir.
    D'après la documentation EEG, il faut envoyer des valeurs positives a certains pins du port parallèle et connecter les autres a la terre. Pour l'instant c'est du gros charabia pour moi et je ne sais pas par ou commencer, merci de m'aider ou de m'orienter, j'en ai vraiment besoin.

  14. #14
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 87
    Points : 64
    Points
    64
    Par défaut
    J'ai résolu mon problème en faisant une mise à zéro au début et après chaque envois sur le port parallèle et ça marche.

    Quelque chose du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    main()
    {
    Out32(0x378,0x00);
    sleep(1000);
     
    while(1)
    {
    Out32(0x378,0xF0);
    sleep(1);
    Out32(0x378,0x00);
    sleep(1000);
    }
    }

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

Discussions similaires

  1. Intégrer Doctrine 2.3.1 dans un projet
    Par xess91 dans le forum Doctrine2
    Réponses: 2
    Dernier message: 25/01/2013, 22h34
  2. Réponses: 11
    Dernier message: 24/01/2012, 15h09
  3. Réponses: 6
    Dernier message: 14/02/2011, 10h40
  4. Créer un Timer (ou équivalent) dans un projet sans Form
    Par avigeilpro dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 13/05/2007, 17h52
  5. ActiveX dans un projet sans interface graphique
    Par Nalfouille dans le forum MFC
    Réponses: 6
    Dernier message: 04/01/2006, 17h30

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