Se connecter avec
S'enregistrer | Connectez-vous

Envoi de signaux par le port parallèle sous XP...

Dernière réponse : dans Programmation

Bonjour,

J'essaie de concevoir un programme en C permettant de controler séparément chaque broche du port parallèle (de D0 à D7). Seulement XP bloque l'accès direct aux broches, et il faut avoir recours à certaines astuces pour parvenir à les controler... Parmis ces astuces se trouve, parait-il, une DLL : inpout32.dll.

Mais comment utiliser cette dll dans mon programme ?

J'ai quelques bases en C mais suis assez nul dans l'inclusion de fichier, le choix des headers, etc. Merci de m'aider ! :) 

Autres pages sur : envoi signaux port parallele

Lassé par la pub ? Créez un compte

bellaoud a dit :

J'essaie de concevoir un programme en C permettant de controler séparément chaque broche du port parallèle (de D0 à D7). Seulement XP bloque l'accès direct aux broches, et il faut avoir recours à certaines astuces pour parvenir à les controler... Parmis ces astuces se trouve, parait-il, une DLL : inpout32.dll.

Mais comment utiliser cette dll dans mon programme ?

J'ai quelques bases en C mais suis assez nul dans l'inclusion de fichier, le choix des headers, etc. Merci de m'aider ! :) 

http://mapage.noos.fr/emdel/clib/pio/inc/pio.h EDIT
http://mapage.noos.fr/emdel/clib/pio/src/pio.c

Pose des questions si tu ne comprends pas.
Expert Programmation

c'est le fait que tu veuille compiler une appli avec un point d'entrée ''WinMain'' (qui correspond au applis windows graphiques sans consoles) avec une appli qui visiblement n'est pas une appli graphique ...

bellaoud a dit :
Par contre j'ai un problème à la compilation avec GCC (dans CodeBlocks) :
  1. C:\Program Files\CodeBlocks\lib/libmingw32.a(main.o):main.c:(.text+0x106): undefined reference to `WinMain@16'

Je ne vois pas d'où ça vient...

Le projet est de type console ?
Il y a bien un main() dans ton code ?

la trotte a dit :
Il y a bien un main() dans ton code ?


Oups ! :whistle:  J'avais juste essayé de compiler les deux fichiers, sans regarder vraiment le code...

Donc, si j'ai bien compris, le fichier pio.c associé à pio.h, définit (entre autres) la fonction g_pf_outp32 (port, data); que je peux ensuite utiliser pour contrôler mon port parallèle ???

bellaoud a dit :
Oups ! :whistle:  J'avais juste essayé de compiler les deux fichiers, sans regarder vraiment le code...

Donc, si j'ai bien compris, le fichier pio.c associé à pio.h, définit (entre autres) la fonction g_pf_outp32 (port, data); que je peux ensuite utiliser pour contrôler mon port parallèle ???

Peut importe ce qu'elle fait, ces détails obscures et sans intérêt sont justement cachés dans pio.c. Ce qui t'interesse, ce sont les 2 fonctions publiques déclarées dans pio.h. Elles s'utilisent comme ça :

http://mapage.noos.fr/emdel/clib/pio/tu/tu.c

Oui, j'ai bien inpout32.dll dans mon dossier system32, c'et bien ce qu'il falait faire, non ?

Pourtant si je compile tu.c et pio.h, je n'ai pas d'erreur mais rien ne se passe, et aucune modification sur mon port parallèle, que je mette data à 0 ou à 255...

bellaoud a dit :
Oui, j'ai bien inpout32.dll dans mon dossier system32, c'et bien ce qu'il falait faire, non ?

OK.
Citation :
Pourtant si je compile tu.c et pio.h,

Pas clair. Tu as bien fait un projet avec ces deux sources :
  • tu.c (Test Unitaire)
  • pio.c (Portable I/O)
    Citation :
    je n'ai pas d'erreur mais rien ne se passe, et aucune modification sur mon port parallèle, que je mette data à 0 ou à 255...

    Pas de messages d'erreur à l'exécution ?

    Dans mon projet se trouvent les fichiers :
    -pio.c
    -pio.h
    -tu.c

    Je build le projet, et le lance : aucun message d'erreur à l'execution, une fenêtre console s'ouvre, mais n'affiche rien (mis à part "Press ENTER to continue").

    Pour tester les sorties du port parallèle j'ai monté un petit circuit à base de 8 LED et 8 résistances. Comme ça elles sont censées s'allumer en fonction de la variable "data" (ex: à 0 tout est éteint, à 1 la première LED s'allume, etc. jusqu'à 255 où tout est allumé. Mais là rien ne se passe...).

    bellaoud a dit :
    Dans mon projet se trouvent les fichiers :
    -pio.c
    -pio.h
    -tu.c

    Je build le projet, et le lance : aucun message d'erreur à l'execution, une fenêtre console s'ouvre, mais n'affiche rien (mis à part "Press ENTER to continue").

    Pour tester les sorties du port parallèle j'ai monté un petit circuit à base de 8 LED et 8 résistances. Comme ça elles sont censées s'allumer en fonction de la variable "data" (ex: à 0 tout est éteint, à 1 la première LED s'allume, etc. jusqu'à 255 où tout est allumé. Mais là rien ne se passe...).

    Essai sans la DLL (l'erreur 2, c'est PIO_ERR_WIN32_DLL_LOAD : "erreur de chargement de la DLL") :

    err = 2 at ..\..\clib\pio\tu\tu.c:23
    [0378] < 41
    err = 2 at ..\..\clib\pio\tu\tu.c:30
    [0378] = 00

    Press ENTER to continue.

    Essai avec la DLL :

    [0378] < 41
    [0378] = 41

    Press ENTER to continue.

    Si tu n'as pas d'affichage du tout, c'est que tu n'exécutes pas le bon code. Vérifie ton projet, les noms, les répertoires etc.

    bellaoud a dit :
    (je viens d'essayer sans la DLL, et j'ai pareil :

    err = 2 at ..\..\clib\pio\tu\tu.c:23
    [0378] < 41
    err = 2 at ..\..\clib\pio\tu\tu.c:30
    [0378] = 00

    Press ENTER to continue.)

    Wow! Tu as les mêmes chemins que moi ? C'est OK.

    Et avec la DLL ?
    (moi, je la met dans /WINDOWS, je n'ai pas essayé dans /WINDOWS/SYSTEM32)

    Citation :
    pour etre précis, dans %windir% :jap: 

    Tu veux parler de la variable d'environnement windir ?

    OK. J'ai modifié tu.c pour montrer windir :
    1. /* TU for pio */
    2.  
    3. #include "pio/inc/pio.h"
    4. #include <stdio.h>
    5. #include <stdlib.h>
    6.  
    7. #define TERR(err)\
    8. do\
    9. {\
    10. if (err)\
    11. {\
    12. fprintf (stderr, "err = %d at %s:%d\n", (int) err, __FILE__, __LINE__);\
    13. }\
    14. }\
    15. while (0)
    16.  
    17. int main (void)
    18. {
    19. unsigned port = 0x378;
    20.  
    21. {
    22. char const *windir = getenv("windir");
    23. if (windir != NULL)
    24. {
    25. printf ("windir = %s\n", windir);
    26. }
    27. else
    28. {
    29. printf ("windir is not defined\n");
    30. }
    31. }
    32.  
    33. {
    34. unsigned data = 'A';
    35. pio_err_e err = pio_outb (port, data);
    36. TERR(err);
    37. printf ("[%04X] < %02X\n", port, data);
    38. }
    39.  
    40. {
    41. unsigned char data;
    42. pio_err_e err = pio_inb (port, &data);
    43. TERR(err);
    44.  
    45. printf ("[%04X] = %02X\n", port, data);
    46. }
    47.  
    48. return 0;
    49.  
    50. }

    J'obtiens ceci :

    windir = C:\WINDOWS
    [0378] < 41
    [0378] = 41

    Press ENTER to continue.

    la trotte a dit :
    Tu veux parler de la variable d'environnement windir ?
    oui puisque windows peut etre installé dans n'importe quel répertoire... c:\windows est juste le répertoire par défaut
    il se peut meme qu'il n'y ai pas de disque c:

    Avec le nouveau tu.c j'obtiens :

    windir = C:\WINDOWS

    Press ENTER to continue.


    mais rien ne se passe :heink: 

    EDIT :

    J'ai essayé avec un autre PC (également sus XP) et là ça marche, avec exactement la même source !

    J'obtiens bien :
    windir = C:\WINDOWS
    [0378] < X
    [0378] = X

    Press ENTER to continue.


    et je peux commander l'allumage des LED. Reste à savoir pourquoi ça ne marche que sur un PC :heink: 

    Enfin je suis rassuré d'avoir trouvé quelque chose qui marche, merci beaucoup ! :jap: 
    Lassé par la pub ? Créez un compte