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 !
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.
bellaoud a dit :
Par contre j'ai un problème à la compilation avec GCC (dans CodeBlocks) :
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 !
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 !
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
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 :
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...).
-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%
Tu veux parler de la variable d'environnement windir ?
OK. J'ai modifié tu.c pour montrer windir :
/* TU for pio */
#include "pio/inc/pio.h"
#include <stdio.h>
#include <stdlib.h>
#define TERR(err)\
do\
{\
if (err)\
{\
fprintf (stderr, "err = %d at %s:%d\n", (int) err, __FILE__, __LINE__);\
}\
}\
while (0)
int main (void)
{
unsigned port = 0x378;
{
char const *windir = getenv("windir");
if (windir != NULL)
{
printf ("windir = %s\n", windir);
}
else
{
printf ("windir is not defined\n");
}
}
{
unsigned data = 'A';
pio_err_e err = pio_outb (port, data);
TERR(err);
printf ("[%04X] < %02X\n", port, data);
}
{
unsigned char data;
pio_err_e err = pio_inb (port, &data);
TERR(err);
printf ("[%04X] = %02X\n", port, data);
}
return 0;
}
J'obtiens ceci :
windir = C:\WINDOWS
[0378] < 41
[0378] = 41
Press ENTER to continue.
Avec le nouveau tu.c j'obtiens :
mais rien ne se passe
EDIT :
J'ai essayé avec un autre PC (également sus XP) et là ça marche, avec exactement la même source !
J'obtiens bien :
et je peux commander l'allumage des LED. Reste à savoir pourquoi ça ne marche que sur un PC
Enfin je suis rassuré d'avoir trouvé quelque chose qui marche, merci beaucoup !
windir = C:\WINDOWS
Press ENTER to continue.
Press ENTER to continue.
mais rien ne se passe
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.
[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
Enfin je suis rassuré d'avoir trouvé quelque chose qui marche, merci beaucoup !
Lassé par la pub ? Créez un compte
réparé !