[Probleme] _inp & _outp

_inp & _outp [Probleme] - C++ - Programmation

Marsh Posté le 25-04-2004 à 22:50:03    

Bonjour a tous,
j'essaie de faire un programme pour communiquer via le port COM sous xp mais j'ai quelques problemes.
J'utilise le compilateur DevCpp (je n'ai pas VC++ chez moi), et les fonction _inp et _outp ne sont pas intégrés à la librairie <conio.h> (contrairement a VC++). Je me suis renseigné et j'ai trouvé un peu de doc sur ça, mais je n'ai pas eu de resultat concluant.
 
Programme en VC++:

Code :
  1. #define RBR 0
  2. #define LCR 3
  3. #define COM1 0x3f8
  4. int main()
  5. {
  6. _outp(COM1+LCR,128); // je mets la valeur 128 dans le registre LCR
  7. printf("%x",_inp(COM1+LCR)); // je lis ce qu'il y a dans ce le registre LCR
  8. }


Jusqu'ici tout marche impec, avec VC++ bien sur ;)
 
Avec DevCpp, pour communiquer avec le port COM c'est un peu plus compliqué. J'ai telechargé un fichier DLL (inpout32.dll) et j'ai rajouté un bou de code dans mon fichier, ce qui donne:

Code :
  1. #define LCR 3
  2. #define COM1 0x3f8
  3. typedef short _stdcall (*inpfuncPtr)(short portaddr);
  4. typedef void _stdcall (*oupfuncPtr)(short portaddr, short datum);
  5. int main()
  6. {
  7. HINSTANCE hLib;
  8. inpfuncPtr inp32;
  9. oupfuncPtr oup32;
  10. /* Chargement du dll */
  11. hLib = LoadLibrary("inpout32.dll" );
  12. if (hLib == NULL) {
  13.   printf("Le chargement du DLL a echoué.\n" );
  14.   return -1;
  15. }
  16.      inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32" );
  17.      oup32 = (oupfuncPtr) GetProcAddress(hLib, "Out32" );
  18. int tmp=0;
  19. oup32(COM+LCR,tmp); // je mets la valeur 0 dans le registre LCR
  20. printf("reg LCR : %x",inp32(COM1+LCR)); // je lis la valeur du registre LCR


Le probleme est le suivant, quelque soit la valeur de

Code :
  1. tmp

que j'envoie, le registre ne change pas, comme si rien ne se passé, j'ai toujours la valeur FF.
 
Je m'y prends peut etre mal, mais je n'ai trouvé que cette solution.. j'espere que quelqu'un pourra m'aider :)
 
Merci d'avance!


Message édité par mesta le 25-04-2004 à 22:53:37
Reply

Marsh Posté le 25-04-2004 à 22:50:03   

Reply

Marsh Posté le 25-04-2004 à 23:28:23    

j'ai bossé sur le port com recemment, et j'ai compris d'apres mes recherches que inp et outp ne fonctionnent pas sous xp (et tout systeme NT d'ailleurs)
 
il faut utiliser CreateFile, WriteFile et ReadFile...


---------------
Fleur de métal, entité invulnérable, vêtue tant bien que mal, d'une muraille inébranlable...
Reply

Marsh Posté le 25-04-2004 à 23:38:53    

Si c'est possible, et moi ce que j'ai comprit, c'est qu'il faut reecrire un driver .. mais il y en a deja sur internet, mais je n'ai pas reussi a les faire marcher
ex: http://www.zealsoftstudio.com/ntport/

Reply

Marsh Posté le 26-04-2004 à 09:21:24    

ben, je pense que c'est pas la peine de te compliquer la vie, ca marche tres simplement avec ces fonctions...
et je maintiens que inp et outp ne marchent pas sous NT, ou alors on m'a menti :/
 
mais tu veux faire quoi exactement ? tu veux communiquer avec quoi ?


---------------
Fleur de métal, entité invulnérable, vêtue tant bien que mal, d'une muraille inébranlable...
Reply

Marsh Posté le 26-04-2004 à 12:43:47    

C'est un petit programme permettant de communication via le port COM entre 2 PCs (envoyer des messages & fichiers).
Ce programme marche parfaitement avec VC++ (quand je compile), mais pas avec le compilateur que j'ai chez moi (DevCpp).
 
Il doit bien exister une solution tout de même .. même en bidouillant. Personne n'aurait une ptite idée?


Message édité par mesta le 26-04-2004 à 12:48:34
Reply

Marsh Posté le 27-04-2004 à 08:45:09    

Sous XP, inp et outp ne fonctionnent pas. Il faut développer un nouveau driver ou utiliser celui existant au travers des fonctions précités.
 
Sous linux par contre, ca marche tres simplement, car les ports sont accessibles directement.
 


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 27-04-2004 à 10:28:14    

Ben voyons. Les IO directs sous Linux je demande à voir.
NT et Linux l'interdisent, et c'est tout à fait normal.
Utiliser un driver pour ça c'est _mal_ car c'est outrepasser les recommandations de l'OS (et ça marche pas en user, seul les users privilégiés/admin peut installer un driver).
=> CreateFile( "COM1", ...
=> fopen( "COM1", ...
Pblm traité X fois ici.

Reply

Marsh Posté le 27-04-2004 à 11:41:01    

perso devant faire un truc portable j'utilise ctb :
http://www.iftools.com/docs.html


---------------
blog dessins + srtCleaner | Ricoh R6 | K20d | MK-wii 5112-3549-9484 | en phase de déblablatisation depuis le 26 avril 2002 | Belgian Connection
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed