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

Interfacer Port Parallèle


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 127
    Par défaut Interfacer Port Parallèle
    Bonjour,
    mon but c'est de faire un petit projet en électronique de cryptage, très simple; le but c'est d'envoyer via le port parallèle pins 2 a 5 4 bits vers un circuit integré qui fera le cryptage et qui renvoyera les réponses via les pins 6 à 9 du port parallèle et qui affichere le message "crypté" à l'ecran.
    la programmation peut etre faite sur windows or linux, je sais que outportb ne fonctionne plus sur windows xp; pour le reste, je suis plutot perdu.
    merci d'avance.
    Mario

  2. #2
    Expert éminent
    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
    Par défaut
    Citation Envoyé par mariogarcia
    la programmation peut etre faite sur windows or linux, je sais que outportb ne fonctionne plus sur windows xp; pour le reste, je suis plutot perdu.
    Pour accéder directement au port // sous Windows, il existe probablemnt une fonction système (API). Le bon forum est Développement Windows

  3. #3
    Membre éclairé Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Par défaut
    Salut,

    Si t'es sous linux tu dois utiliser la fonction outb pour écrire sur le port parallèle. J'avais fais il y a un moment un programme pour allumer des diodes sur ce port. En téléchargeant l'archive qui se trouve sur ce lien, tu trouveras le code source de ce fichier dans le répertoire 'diodes'. Voilà, bon courage .


    Nico.

  4. #4
    Membre expérimenté Avatar de damienlann
    Profil pro
    Étudiant
    Inscrit en
    Mai 2005
    Messages
    293
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2005
    Messages : 293
    Par défaut
    tu peux utiliser outportb sous XP mais il y a quelques bidouilles a faire... (un ajout de dll et quelques autre truc..)

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 127
    Par défaut
    bonjour, le site que tu m'as donné est tres bien mais le code est en c++? je ne peut faire que du c procedural.
    on m'a dit que outportb ne fonctionne plus sur xp, et que je devais utiliser inp32 et oup32
    le probleme est que je ne dois pas lire sur tous les broches data, seulement la moitie d'entre elles, et puis lire sur l'autre moitie.
    merci beaucoup.
    mario

  6. #6
    Membre expérimenté Avatar de damienlann
    Profil pro
    Étudiant
    Inscrit en
    Mai 2005
    Messages
    293
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2005
    Messages : 293
    Par défaut
    il faut donc utiliser des masques.
    tu fais une lecture du port entier et tu masque ce que tu n'as pas besoin.

    (valeur_du_port & 0xF0)>>4 te donne l'etat des bits de poid fort.
    valeur_du_port & 0x0F te donne la valeurs des 4 bits de poid faible

  7. #7
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 127
    Par défaut
    bonjour voila le programme. que j'ai pu faire, mais je ne sais pas a l'état 3 du switch comment envoyer les données, vers le port parallèle, puisque je crypte seulement 4 bits il faut faire de masques, c'est tres bien mais franchement je ne sais pas comment. une idéee?
    merci d'avance
    mario
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <windows.h>
     
     
    #define FALSE 0
    #define TRUE !FALSE
    #define ADRESSEBASE 0x378 // addresse de base 
     
         typedef short _stdcall (*inpfuncPtr)(short portaddr);
         typedef void _stdcall (*oupfuncPtr)(short portaddr, short datum);
     
    void encryptionmenu(char *encryptionchoice)
    {
        //system("cls");
        printf("**********************\n");
        printf("*    cryptage menu   *\n");
        printf("**********************\n\n");
        printf("1. enter clear message\n");
        printf("2. read clear message \n");
        printf("3. read encrypted message \n");
        printf("your choice : \n");
        scanf("%c", encryptionchoice);
        fflush(stdin);
    }
      char choicemenu;
      char* encryptionchoice = &choicemenu;
    int main()
    {
        int msg;
        int cryptmsg;
        HINSTANCE hLib;
        inpfuncPtr inp32;
        oupfuncPtr oup32;
     
     
     
     
     
        hLib = LoadLibrary("inpout32.dll");
     
          inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32");
            oup32 = (oupfuncPtr) GetProcAddress(hLib, "Out32");
     
            fflush(stdin);
            encryptionmenu(encryptionchoice);
            switch (choicemenu)
            {
              case '1':
                   printf("enter message to crypt <= 16 \n");
                   scanf("%d", &msg);
              break;
              case '2': 
                   printf("lclear msg: %d \n", msg);
              break;
              case '3':
                      /*ici je dois envoyer msg vers le port parallele dans le broches 2 à 5 et recuperer des données qui viennent du circuit imprimé dans les broches 6 à 9*/
                   printf("encrypted msg : %d\n", cryptmsg);
              break;
              default: 
                       printf("bad choice or illegal operation\n");
                       getch();
                       system("cls");
     
            }
            getch();
            return 0;
    }

  8. #8
    Membre expérimenté Avatar de damienlann
    Profil pro
    Étudiant
    Inscrit en
    Mai 2005
    Messages
    293
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2005
    Messages : 293
    Par défaut
    si j'ai bien compris tu veut ecrire sur les bits 2 à 5 (inclus) du port sans touché aux bits 6 à 9.

    il faut que tu fasses une lecture avant de reecrire

    Je ne pense pas avoir fait d'erreur.
    Tu envois cette valeur sur le port.
    (Lecture_port & 0xF0) | (msg & 0x0F)

    lecture_port & 11110000 : xxxx0000
    msg & 00001111 : 0000yyyy
    xxxx0000 | 0000yyyy : xxxxyyyy

  9. #9
    Expert éminent
    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
    Par défaut
    Citation Envoyé par mariogarcia
    bonjour voila le programme. que j'ai pu faire, mais je ne sais pas a l'état 3 du switch comment envoyer les données, vers le port parallèle, puisque je crypte seulement 4 bits il faut faire de masques, c'est tres bien mais franchement je ne sais pas comment. une idéee?
    J'ai profité de ce codage pour commencer un module 'portable I/O' basé (pour la partie Win32) sur la DLL inpout32.dll de http://www.logix4u.net/inpout32.htm.

    Voici une base pour ton code :
    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
     
    #include <windows.h>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    #include "pio/inc/pio.h"
     
    static void purge(FILE *fp)
    {
       int c;
       while ((c = fgetc(fp)) != '\n' && c != EOF)
       {
       }
    }
     
    static void clean (char *s, FILE *fp)
    {
       /* search ... */
       char *p = strchr (s, '\n'); /* <string.h> */
       if (p != NULL)
       {
          /* ... and kill */
          *p = 0;
       }
       else
       {
          purge (fp);
       }
    }
     
    static int menu(void)
    {
       int choice;
       printf("**********************\n");
       printf("*    cryptage menu   *\n");
       printf("**********************\n\n");
       printf("1. enter clear message\n");
       printf("2. read clear message \n");
       printf("3. read encrypted message \n");
       printf("9. quit\n");
       printf("your choice : \n");
       {
          char s[4];
          fgets(s, sizeof s, stdin);
          clean(s, stdin);
          choice = strtol(s, NULL, 10);
       }
       return choice;
    }
     
    /*
    bit 3-0 : encryption-in
    bit 7-4 : encryption-out
    */
    unsigned encrypt_quartet(unsigned port, unsigned in)
    {
       unsigned char data;
     
       /* send quartet to bits 3 to 0 */
       pio_outb(port, in);
       /* wait 1 ms */
       Sleep (1);
       /* receive encoded MSB from bits 7 to 4 */
       pio_inb(port, &data);
       /* store encoded MSB */
     
       return (data >> 4) & 0x0F;
    }
     
    unsigned encrypt_byte(unsigned port, unsigned in)
    {
       unsigned out = 0;
     
       /* encode MSB to bits 3 to 0 */
       out |= (encrypt_quartet(port, (in >> 4) & 0xF) << 4);
     
       /* send LSB to bits 3 to 0 */
       out |= (encrypt_quartet(port, (in >> 0) & 0xF) << 0);
     
       return out;
    }
     
    void encrypt_string (unsigned port, char const *s_in, char *s_out, size_t size)
    {
       size_t i;
       for (i = 0; i < size - 1; i++)
       {
          s_out[i] = encrypt_byte(port, s_in[i]);
       }
       s_out[i] = 0;
    }
     
    int main()
    {
       /* addresse de base du port parallele */
       unsigned port = 0x378;
       int end = 0;
       char msg[16 + 1] = "";
     
       do
       {
          int choicemenu = menu();
          switch (choicemenu)
          {
          case 1:
             printf("enter message to crypt (max %u characters)\n", (unsigned) (sizeof msg - 1));
             fgets(msg, sizeof msg, stdin);
             clean(msg, stdin);
             break;
     
          case 2:
             printf("message to encrypt '%s'\n", msg);
             break;
     
          case 3:
             /* ici je dois envoyer msg vers le port parallele dans les
             broches 2 à 5 et recuperer des données qui viennent du circuit
             imprimé dans les broches 6 à 9*/
     
             /* hardware encryption */
             {
                char cryptmsg[sizeof msg];
                encrypt_string (port, msg, cryptmsg, sizeof cryptmsg);
                printf ("encrypted msg: '%s'\n", cryptmsg);
             }
             break;
     
          case 9:
             end = 1;
             break;
     
          default:
             printf("bad choice or illegal operation\n");
             getchar();
          }
       }
       while (!end)
          ;
       return 0;
    }
    Pose des questions si tu ne comprends pas.
    EDIT : mise au point.

    BUG : instable si on se trompe dans le menu...

  10. #10
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 127
    Par défaut
    bonjour, je vois vraiment pas, c'est qu'il faut faire;
    si je fais
    oup32((ADDRESSEBASE & 0xF0) | (msg & 0x0F)) selon mon programme cela va car je ne comprends pas ce que veux dire chez toi 'Lecture_port'

    merci

  11. #11
    Membre expérimenté Avatar de damienlann
    Profil pro
    Étudiant
    Inscrit en
    Mai 2005
    Messages
    293
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2005
    Messages : 293
    Par défaut
    moi je n'utilise pas ces fonction là pour lire et ecrire sur le port. alors j'ai fait un cas general.

    si tu as compris le principe du masquage ca devrai aller. (si ton probleme vient bien de là)

  12. #12
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 127
    Par défaut
    c'est en effet le mascage que je ne comprends pas. je ne vois vraiment pas comment je peux faire
    merci d'avance

  13. #13
    Expert éminent
    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
    Par défaut
    Citation Envoyé par mariogarcia
    c'est en effet le mascage que je ne comprends pas. je ne vois vraiment pas comment je peux faire
    merci d'avance
    Tu ne peux pas faire autrement que d'écrire ou lire 8 bits dans le registre.

    En faisant l'hypothèse (à vérifier avec le matériel) que pour coder on écrit dans les 4 bits de poids faible, et qu'on récupère le codage dans les 4 bits de poids fort :

    Codage :

    Ecrire le quartet 'clair' :
    Lire le quartet 'crypte' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    data = inp(port);
    data = data >> 4; /* decalage MSB -> LSB */
    data = data & 0x0F; /* suppression des eventuels 'parasites' sur les poids forts... */
    Entre les deux, il faut peut être prévoir un petit delai, histoire de ne pas stresser le hard. Sinon, étudier un protocole (handshake, par exemple) avec les signaux de contrôle du port 1 (0x279)...

Discussions similaires

  1. Interface port parallèle
    Par xortix dans le forum VB.NET
    Réponses: 4
    Dernier message: 17/12/2010, 14h09
  2. Réponses: 1
    Dernier message: 15/10/2007, 20h51
  3. Gestion du port paralléle sous 2000
    Par kardex dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 05/01/2006, 19h47
  4. ecriture vers le port parallèle
    Par Luther13 dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 19/03/2004, 22h46
  5. Port Parallèle EPP ou ECP, hardware vs software ?
    Par TONIAPEL dans le forum Assembleur
    Réponses: 3
    Dernier message: 21/08/2003, 01h39

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