Moi j'ai utiliser une dll (inpout.dll) pour rendre les accès au port plus simple
http://www.logix4u.net/InpOutBinaries.zip version i386 et x64
http://www.logix4u.net/inpout32_source_and_bins.zip version que i386
Ensuite dans ton code fais qqch dans le genre:
#include <stdio.h>
#include <conio.h>
#include <windows.h>
/* Definitions in the build of inpout32.dll are: */
/* short _stdcall Inp32(short PortAddress); */
/* void _stdcall Out32(short PortAddress, short data); */
/* prototype (function typedef) for DLL function Inp32: */
typedef short _stdcall (*inpfuncPtr)(short portaddr);
typedef void _stdcall (*oupfuncPtr)(short portaddr, short datum);
int main(void)
{
HINSTANCE hLib;
inpfuncPtr inp32;
oupfuncPtr oup32;
/* Load the library */
hLib = LoadLibrary("inpout32.dll");
if (hLib == NULL) {
printf("LoadLibrary Failed.\n");
return -1;
}
/* get the address of the function */
inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32");
if (inp32 == NULL) {
printf("GetProcAddress for Inp32 Failed.\n");
return -1;
}
oup32 = (oupfuncPtr) GetProcAddress(hLib, "Out32");
if (oup32 == NULL) {
printf("GetProcAddress for Oup32 Failed.\n");
return -1;
}
short x;
int i;
/***** Write the data register */
i=0x3BC; // Address du port
x=0x00;
oup32(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);
system("pause");
// On libère la DLL
FreeLibrary(hLib);
return 0;
}
Je suis pas sûr que ça fonctionne parcque ce code était pour une version plus ancienne de la DLL, mais ça dois resembler.
Tout ceci c'est pour travailler sous windows, mais si tu tavail sous linux, c'est plus simple. Sous linux tous les ports sont représenté par des fichiers, donc il suffit de lire ou d'écrire sur le fichier /dev/lpt (ou /dev/lpt0).