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++Builder Discussion :

Acc�s au ports


Sujet :

C++Builder

  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    162
    D�tails du profil
    Informations personnelles :
    �ge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2002
    Messages : 162
    Par d�faut Acc�s au ports
    Builder me dit que les fonctions outp, inp et autres permettants l'�criture et la lecture directe sur les ports ne sont plus valables et qu'il faut utiliser la fonction CreateFile de l'API windows pour y acc�der ou de passer par l'assembleur, bien que NT ne l'acc�ptera pas.

    Bon, pourquoi pas, me dis-je. Un petite recherche pour en apprendre plus sur cette fonction, et l� : rien.

    Tout ce que je trouve me permet juste de communiquer avec les ports COM, LPT et autres ports nomm�s. Pas moyen de sp�cifier une adresse, genre �crire au port 0x226.

    Ce que je voudrais donc savoir, c'est :

    - Comment faire avec la fonction CreateFile

    ou bien / et

    - Comment passer un registre � une variable en assembleur, car lorsque j'�cris (par exemple) :

    int ret;
    asm mov ret, eax;

    j'ai le droit � une erreur comme quoi on ne sait pas ce que c'est que "ret".

    Ou alors n'importe quelle autre solution qui r�soudra mon probl�me.

    Merci bien.

  2. #2
    Membre averti
    Inscrit en
    Juillet 2002
    Messages
    16
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 16
    Par d�faut
    Windows est un syst�me prot�g�. Ce qui veut dire qu'il est impossible � une application d'acc�der directement au hard, c'est � dire ni aux interruptions, ni aux ports, ni directement au disque dur. Et le fait d'�crire en assembleur n'y changera rien. Pour ouvrir un port s�rie, il faut effectivement utiliser CreateFile, par exemple, en C:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
      hPort = CreateFile("COM1:", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
      ReadFile(hPort, szBuf, nbOctets, &nbOctetsLus, NULL);
      CloseHandle(hPort);

  3. #3
    Membre �prouv�
    Homme Profil pro
    VP of Research and Innovation
    Inscrit en
    Mai 2002
    Messages
    84
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 54
    Localisation : Canada

    Informations professionnelles :
    Activit� : VP of Research and Innovation

    Informations forums :
    Inscription : Mai 2002
    Messages : 84
    Par d�faut
    Bonjour,

    Le CreateFile permet d'acceder un driver non � un port (en conjonction avec les ReadFile, WriteFile et DeviceIoControl).

    Pour passer outre �a, sous Windows 95 (9X, Me, etc...) tu n'auras pas de probleme en r�-ecrivant les fonction Outp (que j'ai si tu veux) en assembleur.
    Sur une base Nt (2000, Xp ou Nt4), l'acc�es au Ring0 n'est autoris� qu'au drivers. Donc soit tu developpes un driver pour faire plaisir � Big brother, soit tu utilises un driver g�n�rique (GiveIo.sys par exemple) te permettant de percer la couche Ring0 (ton appli tourne au Ring3).
    L'inconv�nient r�side dans le fait que c'est l&pplicatif qui fait tout le boulot au lieu du Driver. Si tu n'as que quelques valeurs � �crire pas de probleme en revanche pour piloter une carte.

  4. #4
    Membre confirm�
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    162
    D�tails du profil
    Informations personnelles :
    �ge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2002
    Messages : 162
    Par d�faut Ok
    OK, donc c'est plutot chiant. Je veux bien les fonctions outp et inp en assembleur. Je crois d�j� avoir fait outp, je ne l'ai pas test�e :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void OutPort(int address, int value)
    {
    	asm
        {
        	MOV edx, address
            MOV eax, value
            OUT dx, ax
        }
    }
    mais j'ai des soucis avec inp.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int InPort(int address)
    {
    	int ret;
    	/*__asm
        {
        	MOV edx, address
            XOR eax, eax
            IN  ax, dx
            MOV ret, ax
        }   */
     
        return ret;
    }
    Cela dit j'ai des soucis avec l'assembleur en fait....

    Merci de m'aider.

  5. #5
    Membre �prouv�
    Homme Profil pro
    VP of Research and Innovation
    Inscrit en
    Mai 2002
    Messages
    84
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 54
    Localisation : Canada

    Informations professionnelles :
    Activit� : VP of Research and Innovation

    Informations forums :
    Inscription : Mai 2002
    Messages : 84
    Par d�faut
    Bonjour,

    Voila ...

    Ports.c

    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
     
    #include "ports.h"
     
    //-----------------------------------------------------------------------
    //  functions
    //      inport  - inputs a word from a hardware port
    //      inportb - inputs a byte from a hardware port
    //      inp     - inputs a byte from a hardware port
    //      inpw    - inputs a word from a hardware port
    //
    //      outport  - outputs a word to a hardware port
    //      outportb - outputs a byte to a hardware port
    //      outp     - outputs a byte to a hardware port
    //      outpw    - outputs a word to a hardware port
    //-----------------------------------------------------------------------
     
    unsigned short inport(unsigned short port)
    {
        asm     mov     dx,port
        asm     in      ax,dx
            return _AX;
    }
     
    unsigned char inportb(unsigned short port)
    {
        asm     mov     dx,port
        asm     in      al,dx
        asm     xor     ah,ah
            return _AX;
    }
     
    unsigned short inpw(unsigned short port)
    {
        asm     mov     dx,port
        asm     in      ax,dx
            return _AX;
    }
     
    short int inp(unsigned short port)
    {
        asm     mov     dx,port
        asm     in      al,dx
        asm     xor     ah,ah
            return _AX;
    }
     
    void outport(unsigned short port, unsigned short val)
    {
        asm     mov     dx, port
        asm     mov     ax, val
        asm     out     dx, ax
    }
     
    void outportb(unsigned short port, unsigned char val)
    {
        asm     mov     dx, port
        asm     mov     al, val
        asm     out     dx, al
    }
     
    unsigned short outpw(unsigned short port, unsigned short val)
    {
        asm     mov     dx, port
        asm     mov     ax, val
        asm     out     dx, ax
            return (_AX);
    }
     
    short int outp(unsigned short port, unsigned char val)
    {
        asm     mov     dx, port
        asm     mov     al, val
        asm     out     dx, al
        asm     xor     ah, ah
            return (_AX);
    }
    Ports.h
    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
     
    #ifndef _PORTS_
    #define _PORTS_
     
    #pragma message Warning: port I/O not allowed in Windows NT
    #pragma link "ports.obj"
    //#pragma link "outport.obj"
     
    #ifdef __cplusplus
    extern "C" {
    #endif
     
    unsigned char  inportb( unsigned short __portid );
    unsigned short inport ( unsigned short __portid );
    short int      inp( unsigned short __portid );
    unsigned short inpw( unsigned short __portid );
    void           outportb( unsigned short __portid, unsigned char __value );
    void           outport ( unsigned short __portid, unsigned short __value );
    short int      outp( unsigned short __portid, unsigned char __value );
    unsigned short outpw( unsigned short __portid, unsigned short __value );
     
    #ifdef __cplusplus
    }
    #endif
     
    #endif
    N'oubliez pas que ce code ne fonctionne pas seul sous Windows � base d'Nt (il faut le GiveIO.sys)

  6. #6
    HRS
    HRS est d�connect�
    Membre chevronn�
    Avatar de HRS
    Inscrit en
    Mars 2002
    Messages
    678
    D�tails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 678
    Par d�faut
    Depuis Win9X et +, l'acc�s aux ports COM soul�ve de nombreuses questions

    drobert dit

    qu'il faut passer par des API Windows pour y acc�der (CreateFile,
    ReadFile, WriteFile, CloseHandle de Winbase.h)

    ChMerlier dit

    que ces API ne sont pas adapt�s et qu'on peut directement acc�der aux ports par des routines assembleur
    -------------------
    R�ponses contradictoires. Qu'en est-il ? idem pour USB (Universal Serial
    BUS) ?
    ------------
    D'autres parlent de librairies d�di�es : TComPort, CPortLib, Port95nt.
    Qu'en dire ? Sont elles des composants libres ?

  7. #7
    Membre �prouv�
    Homme Profil pro
    VP of Research and Innovation
    Inscrit en
    Mai 2002
    Messages
    84
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 54
    Localisation : Canada

    Informations professionnelles :
    Activit� : VP of Research and Innovation

    Informations forums :
    Inscription : Mai 2002
    Messages : 84
    Par d�faut
    Bonjour,

    Pour HRS : Je n'ai jamais dit que les CreateFile etc n'�taient pas adapt�es aux ports COM mais aux ports tout court (Inp(port adresse)). Ce qui est radicalement diff�rent.
    Si tu lis correctement le debut du post tu vois la nuance.

    Pour utiliser un Port Com, j'utilise moi m�me TCommPort pour des applications simples et les APIs Win pour des applications plus compl�xes.

    Faut pas me faire dire ce que je n'ai pas dit ... non mais

    Pour ma part et pour r�pondre � ta question, je conseille le TCommPort (ou autre composant). C'est simple et facile � utiliser. J'utilise les Api quand je dois faire des choses un peu plus pouss�es. A vous de voir pour la suite � l'utilisation.

    PS : �a macherais aussi en assembleur le sujet du Post n'etait pas la ...

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [S�rie] Acc�s au port s�rie sous linux
    Par ghost dans le forum Entr�e/Sortie
    R�ponses: 10
    Dernier message: 10/10/2007, 10h43
  2. Acc�s au port parall�le
    Par fab56 dans le forum Delphi
    R�ponses: 6
    Dernier message: 01/04/2007, 11h48
  3. [C#] Probl�me d'acc�s au port s�rie
    Par crashXpert dans le forum C#
    R�ponses: 8
    Dernier message: 06/11/2006, 21h46
  4. [Kylix] acc�s aux port pc
    Par ksirob dans le forum EDI
    R�ponses: 1
    Dernier message: 09/04/2004, 16h39
  5. Accès au port 700h pour une carte d'interface
    Par haypo dans le forum Mat�riel
    R�ponses: 3
    Dernier message: 07/11/2002, 11h30

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