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

Linux Discussion :

Lire le status d'une imprimante sur le port parallèle


Sujet :

Linux

  1. #1
    Membre expérimenté
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Points : 1 680
    Points
    1 680
    Par défaut Lire le status d'une imprimante sur le port parallèle
    Bonjour,
    Je suis totalement débutant en C et je dois lire la valeur de retour d'une imprimante sous linux. Je doit créer une librairie .so qui sera utilisé par Java via JNI.
    J'ai déjà récupérer un package qui fait cela (java + .so) mais il demande les droits root pour lire le port et ce n'est donc pas top.
    Il doit surement moyen de lire le port parallèle sans être root.

    Voici la fonction définie pour lir ela valur d'un port :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    JNIEXPORT jint JNICALL Java_parport_ParallelPort_readOneByte
      (JNIEnv * algo, jclass otro, jint portStatus)
    {
       int ret;
     
       if (ioperm(portStatus, 3, 1)){perror("ioperm error");}
     
       ret = inb(portStatus);   
     
       if (ioperm(portStatus, 3, 0)){perror("ioperm error");}
     
       return ret;
    }
    Pourriez-vous m'orienter pour que je trouve comment rendre cette fonction utilisable en mode utilisateur.

    merci

  2. #2
    Membre expérimenté
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Points : 1 680
    Points
    1 680
    Par défaut
    Je pense que je vais utiliser le module noyau ppdev qui créer un device /dev/parportn

    http://people.redhat.com/twaugh/parport/html/ppdev.html

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: [PORT PARALLELE] Lire le status d'une imprimante
    Citation Envoyé par narmataru
    Je suis totalement débutant en C et je dois lire la valeur de retour d'une imprimante sous linux
    On ne peut pas faire ça en C standard. Il faut soit appeler une fonction système, soit consulter un des fichiers d'états du système. Le bon forum est "développement Linux".

  4. #4
    Membre expérimenté
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Points : 1 680
    Points
    1 680
    Par défaut
    Ha bon
    Merci pour l'info...

    Est-ce qu'un admin pourrait déplacer mon message dans le forum linux s'il vous plait ?

    merci

  5. #5
    Membre expérimenté
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Points : 1 680
    Points
    1 680
    Par défaut
    Bon voici ou j'en suis.
    J'utilise cette doc pour essayer d'utiliser ppdev :
    http://people.redhat.com/twaugh/parport/html/x623.html

    J'essaye d'utiliser ioctl avec le paramètre PPRSTATUS :
    PPRSTATUS

    Returns an unsigned char containing bits set for each status line that is set (for instance, PARPORT_STATUS_BUSY). The ioctl parameter should be a pointer to an unsigned char.
    Voici donc le code que j'ai fait :

    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
    #include <stdio.h>
    #include <linux/ioctl.h>
    #include <linux/parport.h>
    #include <linux/ppdev.h>
    #include <fcntl.h>
     
    int main(int argc, char *argv[])
    {
    	drive_printer("/dev/par0");
    	printf("fin...");
    }
     
     
     
    int drive_printer (const char *name)
    {
        int fd;
        unsigned char status;
     
        fd = open (name, O_RDWR); // J'ouvre /dev/par0
        if (fd == -1) {
            perror ("open");
            return 1;
        }
     
        status=0;
     
        ioctl(fd, PPRSTATUS, &status); // Je récupère le status du port
     
        printf("status = %d", status); // J'affiche le status
     
        close (fd); // Je ferme le fichier /dev/par0
    }
    mais en sortie status me retourne toujours 0 quelque soit le status de l'imprimante (online, offline, etc...)

    Quelqu'un pourrait-il me dire ou je me trompe ?

    merci

  6. #6
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Mis à part que tu oublies de faire un return(0) quand tout se passe bien , je ne vois pas d'erreur grossière dans ton programme.
    En même temps je ne me suis jamais penché sur ce genre de problème.

  7. #7
    Expert confirmé
    Avatar de Katyucha
    Femme Profil pro
    DevUxSecScrumOps Full Stack Bullshit
    Inscrit en
    Mars 2004
    Messages
    3 287
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Irlande

    Informations professionnelles :
    Activité : DevUxSecScrumOps Full Stack Bullshit

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 287
    Points : 5 075
    Points
    5 075
    Par défaut
    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
    #include <stdio.h>
    #include <linux/ioctl.h>
    #include <linux/parport.h>
    #include <linux/ppdev.h>
    #include <fcntl.h>
     
    int main(int argc, char *argv[])
    {
            int monretour = 255;
    	monretour=drive_printer("/dev/par0");
    	printf("fin...");
            return (monretour);
    }
     
    OU
    int main(int argc, char *argv[])
    {
    	return(drive_printer("/dev/par0"));
    }
     
     
    int drive_printer (const char *name)
    {
        int fd;
        unsigned char status;
     
        fd = open (name, O_RDWR); // J'ouvre /dev/par0
        if (fd == -1) {
            perror ("open");
            return 1;
        }
     
        status=0;
     
        ioctl(fd, PPRSTATUS, &status); // Je récupère le status du port
     
        printf("status = %d", status); // J'affiche le status
     
        close (fd); // Je ferme le fichier /dev/par0
        return(status) ;
    }
    J'aurais fait ca plutot.
    Ca me semble plus logique

  8. #8
    Membre expérimenté
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Points : 1 680
    Points
    1 680
    Par défaut
    Oui Merci c'est sure c'est plus propre mais ça n'avance aucunement mon problème :p
    La valeur de retour est toujours 0 et je ne sais pas pourquoi

  9. #9
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    n'as tu pas moyen d'avoir une commande éxécutable dans un shell qui ferait la même chose que ton ioctl ?
    Tu aurais peut être un message d'erreur plus éloquent.

    Si ça se trouve c'est une question de droits.

  10. #10
    Expert confirmé
    Avatar de Katyucha
    Femme Profil pro
    DevUxSecScrumOps Full Stack Bullshit
    Inscrit en
    Mars 2004
    Messages
    3 287
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Irlande

    Informations professionnelles :
    Activité : DevUxSecScrumOps Full Stack Bullshit

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 287
    Points : 5 075
    Points
    5 075
    Par défaut
    a quel endroit ? au niveau de ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("status = %d", status);
    Ou quelque soit le status, tu as toujours 0 en retour de ton script ?

    Si c'est le cas, c'est plus un problème de C

  11. #11
    Membre expérimenté
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Points : 1 680
    Points
    1 680
    Par défaut
    je ne veux pas faire un script externe car c'est pour utiliser dans un thread qui devra faire une boucle permanente d'écoute du port parallèle.
    Le code que j'ai donnée est juste un test de la librairie ppdev donc c'est pour ça que je n'ai fait aucun retour de valeur. Ce qui m'intéresse ici est de récupérer le status de l'imprimante via ioctl (enfin si c'est la bonne manière).
    Je ne sais même trop ce que fait ioctl

    Comme je l'ai dit dans mes précédents message le problème que je veux résoudre est de lire la valeur de retour d'une impirmante en mode utilisateur.

    sinon oui j'ai les droits sur le fichier /dev/par0 (mais finalement je me demande même si c'est le bon fichier que j'ouvre )

  12. #12
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Je ne te propose pas de faire un script externe, mais d'utiliser un outil externe uniquement pour tester ce que devrait être la valeur retournée.
    ça n'est pas un solution alternative, mais une méthode pour comprendre le pourquoi du bug.

    http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man2/ioctl.2.html

    Tu devrais afficher la valeur de retour de ioctl.
    Blinde ton code, pour TOUT analyser, et pas seulement ce qui semble de pas marcher.

    tu dois vérifier que toutes tes fonctions ont bien travaillé.

  13. #13
    Membre expérimenté
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Points : 1 680
    Points
    1 680
    Par défaut
    ok
    ioctl me renvoie toujours 255 et non 0 ! [EDIT] ioctl me renvoie en fait -1 donc ça échoue bien[/EDIT]
    Je pense que je me trompe de device (fichier) car ppdev devrait normalement crée des fichiers /dev/parportn or je n'ai pas c'est ficheir alors que ppdev est bien chargé :
    debian:/dev# rmmod ppdev
    debian:/dev# modprobe ppdev
    debian:/dev# dmesg |tail
    lp0: using parport0 (interrupt-driven).
    ppdev: user-space parallel port driver
    pnp: Device 00:0f disabled.
    pnp: Device 00:0f activated.
    parport: PnPBIOS parport detected.
    parport0: PC-style at 0x378 (0x778), irq 7, dma 3 [PCSPP,TRISTATE,COMPAT,EPP,ECP,DMA]
    parport0: Printer, Hewlett-Packard HP LaserJet 6L
    lp0: using parport0 (interrupt-driven).
    ppdev: user-space parallel port driver
    ppdev: user-space parallel port driver
    Peut être queje doit créer moi-même le fichier ? mais là jene suis pas sure de moi...

  14. #14
    Membre expérimenté
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Points : 1 680
    Points
    1 680
    Par défaut
    Ca y est ça marche
    En fait je n'ouvrais pas le bon fichier. Il fallait bien ouvrir /dev/parport0 et non /dev/par0. J'ai donc du créer ce fichier via :
    $ mknod /dev/parport0 c 99 0
    $ chmod a+rw /dev/parport0
    et après c'est bon

    Donc j'ai bien créer mon fichier c destné à être lié à java.
    Cependant c'est ma première librairie en C et j'aurais voulu connaitre vos reflexions sur mon code (surtout pour les fuites de mémoire etc...)
    merci
    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
     
    #include <jni.h> 
    #include <stdio.h> 
    #include <parportlin_ParallelPortLin.h>
     
    #include <linux/ioctl.h>
    #include <linux/parport.h>
    #include <linux/ppdev.h>
    #include <fcntl.h>
     
    int fd;
    jint status = 0;
    const char *nomfich;
    jstring ppdf;
     
    JNIEXPORT jint JNICALL Java_parportlin_ParallelPortLin_readOneByte
      (JNIEnv *env, jclass laclass)
    {
    	printf("lecture du fd=%d = %s\n", fd, nomfich);
    	int ioct = ioctl(fd, PPRSTATUS, &status);
    	if(ioct != 0){
    		printf("Erreur lors de la récupération du status du port parallèle.\nioctl renvoie '%d'", ioct);
    		status = 0;
    	}
    	return status;
    }
     
    JNIEXPORT jint JNICALL Java_parportlin_ParallelPortLin_initNative
      (JNIEnv *env, jclass laclass, jstring ppdevfile)
    {
    	ppdf = ppdevfile;
    	nomfich = (*env)->GetStringUTFChars(env, ppdf, 0);
    	printf("Initialisation de ParallelPortLin avec le fichier : %s\n", nomfich);
     
     
    	fd = open (nomfich, O_RDONLY);
    		if (fd == -1) {
    			perror ("Erreur lors de l'ouverture du fichier ppdev");
    	}
    	ioctl(fd , PPCLAIM);
    	printf("File descriptor de %s = %d\n", nomfich, fd);
    }
     
    JNIEXPORT jint JNICALL Java_parportlin_ParallelPortLin_releaseNative
      (JNIEnv *env, jclass laclass)
    {
    	(*env)->ReleaseStringUTFChars(env, ppdf, nomfich);
    	ioctl(fd, PPRELEASE);
    	close (fd);
    }

  15. #15
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    dans ton code il n y a pas d'allocation memoire donc pas de fuite .....

  16. #16
    Membre expérimenté
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Points : 1 680
    Points
    1 680
    Par défaut
    il y a quand même "nomfich = (*env)->GetStringUTFChars(env, ppdf, 0);" qui doit être libéré : "(*env)->ReleaseStringUTFChars(env, ppdf, nomfich);"
    MAis enfin ta réflexion me rassure :p

    merci

  17. #17
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    peut être (connait pas GetStringUTFChars) mais cela devrait alors se faire au "close" ? ou juste apres usage de env dans l'appellant.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment lire les propriétés d'une imprimante ?
    Par zidenne dans le forum Langage
    Réponses: 18
    Dernier message: 06/08/2010, 12h26
  2. Comment lire une pin sur le port série du pc
    Par KENPACHI dans le forum LabVIEW
    Réponses: 1
    Dernier message: 25/05/2007, 13h56
  3. installer une imprimante sur un réseau
    Par amigo0 dans le forum Hardware
    Réponses: 3
    Dernier message: 08/05/2007, 20h12
  4. Tester la présence d'une imprimante sur le serveur
    Par PrinceMaster77 dans le forum ASP
    Réponses: 7
    Dernier message: 06/03/2006, 16h59
  5. Installer une imprimante sur plusieur poste
    Par bilb0t dans le forum Administration
    Réponses: 7
    Dernier message: 13/02/2006, 15h49

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