# Probleme commande LPT code block \[Resolu\]

**URL:** <https://www.debian-fr.org/t/probleme-commande-lpt-code-block-resolu/15174>\
**Category:** Programmation\
**Created:** [Février 20, 2016, 6:03 UTC](https://www.debian-fr.org/t/probleme-commande-lpt-code-block-resolu/15174 "2016-02-20T18:03:32Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![olivier.34](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/o/a88e4f/32.png) [@olivier.34](https://www.debian-fr.org/u/olivier.34)\
**Post date:** [Février 20, 2016, 6:03 UTC](https://www.debian-fr.org/t/probleme-commande-lpt-code-block-resolu/15174/1 "2016-02-20T18:03:32Z")

</div>

Bonjour,

J’ai un problème avec mon programme cela va faire 2 jours que je cherche sur internet, divers forum expliquant le fonctionnement du port lpt.

Avant sous Qbasic j’utilise OUT(888,8)

Mais sou C++ ?  
J’ai essayer out,outp,outport,outportb en vains.

Voila le dernier code que j’ai essaye:

```auto
#include <iostream>

int main()
{
    __asm
    {
        mov al,10;
        mov dx,0X0378;
        out dx,al;
    }
}
```

Et les erreurs de compilation

```auto
Compiling: main.cpp
/home/olivier/Controle LPT/main.cpp: In function ‘int main()’:
/home/olivier/Controle LPT/main.cpp:6: error: expected `(' before ‘{’ token
/home/olivier/Controle LPT/main.cpp:7: error: ‘mov’ was not declared in this scope
/home/olivier/Controle LPT/main.cpp:7: error: expected `;' before ‘al’
```

Je ne sais plus quoi faire

---

<div class="post-metadata">

**Author:** ![Desintegr](https://www.debian-fr.org/user_avatar/www.debian-fr.org/desintegr/32/3771_2.png) [@Desintegr](https://www.debian-fr.org/u/Desintegr)\
**Post date:** [Février 20, 2016, 6:03 UTC](https://www.debian-fr.org/t/probleme-commande-lpt-code-block-resolu/15174/2 "2016-02-20T18:03:32Z")

</div>

À lire : [ibiblio.org/gferg/ldp/GCC-Inline … HOWTO.html](http://ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html)

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 20, 2016, 6:03 UTC](https://www.debian-fr.org/t/probleme-commande-lpt-code-block-resolu/15174/3 "2016-02-20T18:03:35Z")

</div>

@olivier \> Si ce OUT(x, y) est une instruction assembleur ça ne change pas que ce soit du C, du C++, du python, du basic ou je ne sais quel autre langage (ça varie d’un processeur à l’autre (ou plus précisément d’un jeu d’instructions à l’autre)). Là en l’occurrence tu ne respecte pas la manière d’inclure du code assembleur dans du C++. Je ne sais pas comment on en inclus, mais de ce que j’ai pu voir du lien de Desintegr peut t’aider.

---

<div class="post-metadata">

**Author:** ![olivier.34](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/o/a88e4f/32.png) [@olivier.34](https://www.debian-fr.org/u/olivier.34)\
**Post date:** [Février 20, 2016, 6:03 UTC](https://www.debian-fr.org/t/probleme-commande-lpt-code-block-resolu/15174/4 "2016-02-20T18:03:35Z")

</div>

Bonjour,

Merci pour le lien qui est très bien explique.

apres avoir regarder j’en ai deduit:

```auto
#include <iostream>

int main()
{
    asm("movl $1, 0x37A");
    return 0;
}

```

Je n’ai pas d’erreur l’ors de la compilation mais je n’ai pas de resultat sur les sorties lpt

---

<div class="post-metadata">

**Author:** ![olivier.34](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/o/a88e4f/32.png) [@olivier.34](https://www.debian-fr.org/u/olivier.34)\
**Post date:** [Février 20, 2016, 6:03 UTC](https://www.debian-fr.org/t/probleme-commande-lpt-code-block-resolu/15174/5 "2016-02-20T18:03:58Z")

</div>

Bonjour,

Bon alors voila apres avoir repris mon facicule ‘TITAN’ 😛 j’ai trouver quelque explication et j’en ai deduit:

```auto
#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/io.h>
#include <unistd.h>

#define LPT1 0x378

int main(void) {

    long a;
    int b;

    b = 1;

    /* ouverture du port parallèle */
    ioperm(LPT1,3,1);
    while (b < 255)
    {
        outb(b,LPT1);
        a=inb(LPT1+1); // Lecture
        printf("Valeur lu: %ld valeur ecris: %d \n",a,b);
        b++;
        sleep(1);
    }

  return 0;
}
```

Utilise en mode Root car il faut les droits pour l’acces.  
les valeurs lu sont 56 et 120 suivent la valeur qui est écris qui normalement devrais être différente mais cela dois venir de ioperm que je n’ai pas bien configuré.

D’apres se que j’ai lu ioperm(LPT1,3,1); ouvre le port 0x378 jusque 0x380 avec valeur 1 pour acces autorise ou 0 si interdit.

Donc si je veut ouvrir tout le port LPT

```auto

```

si je me trompe pas j’aurrais droit d’utilise tous les sorties du port LPT?

---

<div class="post-metadata">

**Author:** ![olivier.34](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/o/a88e4f/32.png) [@olivier.34](https://www.debian-fr.org/u/olivier.34)\
**Post date:** [Février 20, 2016, 6:04 UTC](https://www.debian-fr.org/t/probleme-commande-lpt-code-block-resolu/15174/6 "2016-02-20T18:04:06Z")

</div>

Bonjour,

Voila j’ai réussi !!

Voici a titre d’exemple ( programme de test 🙂 ) il y a plus optimise mais bon sa marche et je sais se que je peut utilise maintenant.

```auto
#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/io.h>
#include <unistd.h>

/*
    * 060h - clavier
    * 170h/376h - contrôleur IDE secondaire
    * 1F0h/3F6h - contrôleur IDE primaire
    * 220h - carte son
    * 300h - carte réseau
    * 330h - carte adaptatrice SCSI
    * 3F2h - contrôleur de lecteur de disquettes
    * 3F8h - COM1
    * 2F8h - COM2
    * 3E8h - COM3
    * 2E8h - COM4
    * 378h - LPT1
    * 278h - LPT2

Commade simple
Bits 193 Moteur 1 Horaire
Bits 64 Moteur 1 Anti Horaire

Bits 20 Moteur 2 Horaire
Bits 50 Moteur 2 Anti Horaire

Commande double

Bits 208 Moteur 1/2 Horaire / Horaire
Bits 240 Moteur 1/2 Horaire / Anti Horaire
Bits 80 Moteur 1/2 Anti Horaire / Horaire
Bits 112 Moteur 1/2 Anti Horaire / Anti Horaire

*/

#define LPT1 0x378

const int PAUSE = 1000000; //Definit la vitesse des pas

void pause(double boucle)
{
    double c;
    c = 0;
    while(c < boucle)
    {
     c++;
    }
}

void ecrire(int valeur)
{
    outb(0,LPT1);
    pause(PAUSE);
    outb(valeur,LPT1);
    pause(PAUSE);
    printf("Bits Envoye: %d \n",valeur);
}

void lire()
{
    int a;
    a = inb(LPT1+1); // Lecture
    printf("Bits Recu: %d \n",a);
}

int main(void) {

    int b,valeur,pas,pass;

    pas = 200;
    valeur = 0;
    pass = 0;

    /* ouverture du port parallèle */
    ioperm(LPT1,3,1);

    while (pass <= 8)
    {
        b = 0;
        switch (pass)
        {
            case 0:
                valeur=193;
            break;
            case 1:
                valeur=64;
            break;
            case 2:
                valeur=20;
            break;
            case 3:
                valeur=50;
            break;
            case 4:
                valeur=208;
            break;
            case 5:
                valeur=240;
            break;
            case 6:
                valeur=80;
            break;
            case 7:
                valeur=112;
            break;
            default:
                valeur=0;
            break;
        }

        while (b < pas)
        {
            ecrire(valeur);
            b++;
        }
        pass++;
    }

  return 0;
}
```

Par contre la fonction ioperm() n’est pas portable donc utilise uniquement sur Linux.

Au moins ma carte marche en direct sur ma Debian c’est super 😃

Olivier
