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

Windows Discussion :

Difficultés de programmation d'un cordon convertisseur USB/parallèle


Sujet :

Windows

  1. #1
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut Difficultés de programmation d'un cordon convertisseur USB/parallèle
    Bonjours
    J'aimerais programmer un cordon convertisseur usb/parallele, le condon cote connecteur imprimante est configure en NULL modem
    connection Strobe et ACK
    connection Busy et PE à la masse via une resistance
    connection SLCT et ERROR à INIT via une resistance
    Ce cordon va me servir a commander un moteur pas à pas, je n'ai besoin d'envoyer que des valeurs comprises entre 0x00 et 0xFF
    voici comment je recupere le Handle de ce cordon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    HANDLE handle = CreateFile(
                    "\\\\?\\USB#Vid_067b&Pid_2305#5&36c701f9&0&10#{a5dcbf10-6530-11d2-901f-00c04fb951ed}",
                    GENERIC_READ,     // | GENERIC_WRITE,
                    FILE_SHARE_READ,  // | FILE_SHARE_WRITE,
                    NULL,
                    OPEN_ALWAYS,
                    FILE_ATTRIBUTE_NORMAL,
                    NULL
                    );
    pour envoyer les donnees j'utilise " WriteFile " (sans grand succes)
    j'ai lu les articles de bernard acquier
    je suppose que c'est a partir de ces valeurs que l'on construit les chaines de commande
    Voici le Descripteur Bulk Out Endpoint (recupere a partir du Datasheet)
    Offset Field Size Value Description
    0 bLength...............Byte....07h.....Size of this descriptor in bytes.
    1 bDescriptorType....Byte....05h.....ENDPOINT descriptor type.
    2 bEndpointAddress..Byte....01 h....Out Endpoint 1.
    3 bmAttributes.........Byte...02h.....BULK Endpoint
    4 wMaxPacketSize....Word..0040h..Maximum packet size is 64.
    6 bInterval..............Byte...00h.....N/A
    je pense que c'est a partir de ces valeurs que l'on construit les chaines de commande
    Sync PID ADDR ENDP CRC5 EOP
    Sync PID Data0 CRC16 EOP
    Sync PID EOP
    1 - Si c'est le cas comment est calcule le CRC est ce sur l'ensemble des valeurs Sync, PID, ADDR, ENDP (comment doivent elles etre organisees)
    2 - Quelle doit etre la valeur de EOP
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  2. #2
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 203
    Points : 28 105
    Points
    28 105
    Par défaut
    A mon avis ce n'est pas le périphérique USB que tu dois récupérer mais plutôt le périphérique LPTx.

    Quant à comment faire, je n'en sais rien.
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  3. #3
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Merci pour ta reponse sevyc64
    tu dois récupérer mais plutôt le périphérique LPTx
    Je ne sais pas non plus comment faire, mais j'ai bien peur que les caracteres speciaux non pris en compte par une imprimante soient supprimes par le driver, j'ai vraiement besoins des valeurs de 0x00 à 0xFF, de plus c'est un Timer qui va lancer regulierement l'ecriture, je ne sais pas si Window va aimer, pour une gestion USB/Serie on retrouve " CreateFile, WriteFile ".
    Mes recherches sur l'USB/Parallele non pas permis de trouver un exemple pour pouvoir esperer me debrouiller.
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  4. #4
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 203
    Points : 28 105
    Points
    28 105
    Par défaut
    Je ne pense pas qu'ils soient supprimer puisque les imprimantes réelles les utilisent aussi.

    Je ne connais pas en C, mais je pense que tu dois pouvoir te connecter au port LPT comme tu le fait avec le périphérique USB.

    Je me rappelle, quelques années en arrière, j'utilisais aussi CreateFile pour me connecté au port COM, je me dis que LPT ça doit être pareil.
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  5. #5
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Pour recuperer le Handle d'un port LPT ou COM il suffit de remplacer la chaine
    \\\\?\\USB#Vid_067b&Pid_2305#5&36c701f9&0&10#{a5dcbf10-6530-11d2-901f-00c04fb951ed}
    Il suffit juste de retrouver la bonne chaine
    Pour mon cas je prefererais quand meme parametrer moi meme le port USB, je ne pense pas etre trop loin de la solution, ce n'est pas le code qui m'interresse, deja c'est de savoir si les parametres que j'utilise sont les bons, la ou les chaines qui sont pris en compte pour le calcul du CRC et la valeur de EOF
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  6. #6
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Voila ou j'en suis j'ai effectue des recherche mais je n'ai rien de concluant
    avec ce code si le cordon est debranche ou mis sur une autre sortie USB j'ai bien un message d'erreur
    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
    HANDLE handle = CreateFile(
                    "\\\\.\\USB#Vid_067b&Pid_2305#5&36c701f9&0&10#{a5dcbf10-6530-11d2-901f-00c04fb951ed}",
                    GENERIC_WRITE, 
                    FILE_SHARE_WRITE,  
                    NULL,
                    OPEN_ALWAYS,  
                    FILE_ATTRIBUTE_NORMAL, 
       FILE_FLAG_SEQUENTIAL_SCAN,
                    NULL
                    );
    // message d'erreur
    // si Ok Opération réussie
    // si Erreur " Le fichier spécifié est introuvable "
    ShowMessage(SysErrorMessage(GetLastError()));
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  7. #7
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 203
    Points : 28 105
    Points
    28 105
    Par défaut
    Je ne saurais dire.

    Je pense que le code est bon, mais par contre tu dois avoir un identifiant de périphérique en fonction du port USB ou tu le branche.

    Recherche peut-etre dans la base de registre si tu n'as pas plusieurs identifiants différents qui auraient le même VID et PID
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  8. #8
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Merci de ta reponse sevyc64
    Je n'ai actuellement qu'un seul cordon connecte et ce pour les testes, et c'est dans la base de registre que j'ai recupere la chaine \\\\.\\USB#Vid_067b&Pid_2305#5&36c701f9&0&10#{a5dcbf10-6530-11d2-901f-00c04fb951ed}, je sais grace a USBVIEW que le cordon est connecte au port 10, ce qui semble correspondre a ce que j'avais remarque dans la chaine " Vid_067b&Pid_2305#5&36c701f9&0&10 ", si je me connecte sur une autre sortie USB du PC ce numero change.
    Je n'ai pas d'erreurs mais mon code ne fonctionne pas, je ne sais pas comment verifier que je recupere le bon Handle
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  9. #9
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    N'y a t'il pas un moyen de verifier que le Handle renvoye par " CreateFile " est correcte ( comme pour le Handle d'une fenetre en employant un utilitaire comme Spy++ )
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  10. #10
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 203
    Points : 28 105
    Points
    28 105
    Par défaut
    Là, ça dépasse clairement mes compétences. J'aurais dit qu'à priori tu devrais avoir une erreur à la création du "fichier" mais si tu dis ne pas en avoir ...

    Par contre peut-être pourrais-tu essayer de remplacer OPEN_ALWAYS par OPEN_EXISTING pour voir.
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 376
    Points : 41 545
    Points
    41 545
    Par défaut
    J'ai du mal à comprendre ta définition de "correcte", à part "différent de INVALID_HANDLE_VALUE"...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Merci Médinoc de t'interresser a ce post
    Voici le pourquoi de mon interrogation
    Si le cordon est debranche handle = FFFFFFFF, ce qui est normal
    Si j'ecris HANDLE handle = CreateFile("\\\\.\\USB#Vid_067b&Pid_2305#5&36c701f9&0&10#{a5dcbf10-6530-11d2-901f-00c04fb951ed}",...)
    ou HANDLE handle = CreateFile("USB010",...), et que le cordon est branche handle = 00000760
    Si je branche le cordon sur une autre sortie USB
    Si j'ecris HANDLE handle = CreateFile("\\\\.\\USB#Vid_067b&Pid_2305#5&36c701f9&0&9#{a5dcbf10-6530-11d2-901f-00c04fb951ed}",...)
    ou HANDLE handle = CreateFile("USB009",...), et que le cordon est branche handle = 00000760
    J'obtient toujours la meme valeur de handle, c'est cela qui me parait bizarre
    Voici ce que les infos que j'ai recuperees sur mon PC
    dans le gestionnaire de periferiques,->controleur de bus USB " Prise en charge d'impression USB ",->propriete,->details " USB\\Vid_067b&Pid_2305\5&36c701f9&0&10 "
    dans la base de registre HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\USB\Vid_067b&Pid_2305

    Vid_067b&Pid_2305
    (par default) REG_SZ (valeur non definie)

    5&36c701f9&0&10
    (par default) REG_SZ (valeur non definie)
    Capabilites REG_DWORD 0x00000084(132)
    Class REG_SZ USB
    ClassGUID REG_SZ {36FC9E60-C465-11CF-8056-444553540000}
    CompatibleIDs REG_MULTI_SZ USB\Class_07&SubClass_01&Prot_01 USB\Class_07&SubClass_01 USB\Class_07 USB\Class_07
    ConfigFlags REG_DWORD 0x00000000(0)
    DeviceDesc REG_SZ Prise en charge d'impression USB
    Driver REG_SZ {36FC9E60-C465-11CF-8056-444553540000}\0014
    HardwareID REG_Multi_SZ USB\Vid_067b&Pid_2305&Rev_0202 USB\Vid_067b&Pid_2305
    LocationInformation REG_SZ IEEE-1284 Controler
    Mfg REG_SZ Microsoft
    Service REG_SZ usbprint
    UINumber REG_DWORD 0x00000000(0)

    Control
    (par default) REG_SZ (valeur non definie)
    ActiveService REG_SZ usbprint

    DeviceParameters
    (par default) REG_SZ (valeur non definie)
    ExtPropDescSemaphore REG_DWORD 0x00000001(1)
    SymbolicName REG_SZ \??\USB#Vid_067b&Pid_2305#5&36c701f9&0&10#{a5dcbf10-6530-11d2-901f-00c04fb951ed}

    LogConf
    (par default) REG_SZ (valeur non definie)
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 376
    Points : 41 545
    Points
    41 545
    Par défaut
    La valeur d'un handle ne dépend pas de ce qu'il y a derrière, donc pour moi c'est normal.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Merci
    Je vais verifier les valeurs passees au cordon
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  15. #15
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Grace a ton intervention Médinoc je pense etre parvenu a programmer mon cordon USB, voici le code qui apparemment fonctionne, il reste je pense un probleme hardware a regler, je suis oblige de faire passer d'un niveau haut a un niveau bas la ligne Busy, et les lignes Strobe et ACK sont connectees
    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
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    HANDLE handle = CreateFile(
                    "\\\\.\\USB#Vid_067b&Pid_2305#5&36c701f9&0&10#{a5dcbf10-6530-11d2-901f-00c04fb951ed}",
                    GENERIC_WRITE,     // | GENERIC_READ,
                    FILE_SHARE_WRITE,  // | FILE_SHARE_READ,
                    NULL,
                    OPEN_EXISTING,      // OPEN_EXISTING,
                    FILE_ATTRIBUTE_NORMAL, // | FILE_FLAG_SEQUENTIAL_SCAN,
                    NULL
                    );
    // message d'erreur
    // si Ok " Opération réussie "
    // si Erreur " Le fichier spécifié est introuvable "
    ShowMessage(SysErrorMessage(GetLastError()));
    DWORD written;
    // Paquet Jeton (TOKEN)
    char command1[6] = {0x01,   // SYNC
                        0x87,   // PID OUT 0001->1000  complement 1110->0111 envoye 10000111->0X87
                        0x80,   // ADDR 01->0x80
                        0x40,   // ENDP 02->40
                        0xB8,   // CRC5 1D->B8
                        0x01};  // EOF
    // Paquet Donnees (DATA)
    char command2[6] = {0x01,   // SYNC
                        0xC3,   // DATA0
                        0x01,   // donnees envoyees
                        0xE4,   // CRC16  02->40 FD->BF  - A727->E4E5
                        0xE5,
                        0x01};  // EOF
    // Paquet de control (HANDSHAKE)
    char command3[3] = {0x01,   // SYNC
                        0x4B,   // ACK
                        0x01};  // EOF
    // WriteFile &gOverlapped
    int a = WriteFile(handle, command1, 6, &written, NULL);
    // message d'erreur
    //ShowMessage(SysErrorMessage(GetLastError()));
    a = WriteFile(handle, command2, 6, &written, NULL);
    // message d'erreur
    //ShowMessage(SysErrorMessage(GetLastError()));
    a = WriteFile(handle, command3, 3, &written, NULL);
    // message d'erreur
    //ShowMessage(SysErrorMessage(GetLastError()));
    CloseHandle( handle );
    }
    ce code passe au niveau haut la ligne D0
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  16. #16
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Voici comment programmer le Paquet Jeton (TOKEN)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    char command1[6] = {0x01, // SYNC
                        0x87, // PID OUT 0001->1000 complement 1110->0111 envoye 10000111->0X87
                        0x80, // ADDR 01->0x80
                        0x40, // ENDP 02->40
                        0xB8, // CRC5 1D->B8
                        0x01}; // EOF
    SYNC
    pas de probleme sa valeur est 0x01
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    OUT
    est une donnee sur 4 bits complementee pour avoir 8 bites
    OUT          | complement
    D7 D6 D5 D4  | D3 D2 D1 D0
    0  0  0  1   | 1  1  1  0
    les donnes sont mise en forme poids faible en premier pour OUT puis pour le complement ce qui donne
    OUT         | complement
    D7 D6 D5 D4 | D3 D2 D1 D0
    1  0  0  0  | 0  1   1  1
    c'est donc 10000111 ou 0x87 que l'on va envoyer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ADDR
    sa valeur est 0x01
    D7 D6 D5 D4 D3 D2 D1 D0
    0  0  0  0  0  0  0  1
    ici aussi la valeur est envoyee bits de poids faible en premier ce qui donne
    D7 D6 D5 D4 D3 D2 D1 D0
    1  0  0  0  0  0  0  0
    c'est donc 1000000 ou 0x80 que l'on envoie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ENDP
    est une donnee sur 8 bits
    sa valeur est 0x02
    D7 D6 D5 D4 D3 D2 D1 D0
    0  0  0  0  0  0  1  0
    ici aussi la valeur est envoyee bits de poids faible en premier ce qui donne
    D7 D6 D5 D4 D3 D2 D1 D0
    0  1  0  0  0  0  0   0
    c'est donc 1000000 ou 0x40 que l'on envoie
    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
    CRC5
    est une donnee que l'on calcul en utilisant les valeurs OUT et ENDP voici la formule ( CRC5 = x5 + x2 + x0 )
    comme je n'ai pas encore su programmer le calcul j'ai utulise cette methode manuelle trouvee sur le NET
    0 0 0 0 . 0 0 0 1 . 0 0 0 0 . 0 0 1 0 . 0 <---- valeur sur laquelle on va effectuer le calcul
    1 0 0 1 . 0 1 <---- valeur utilisee pour le calcul 
    1 0 0 1 . 0 1 0 1 <---- valeur calculee 
      1 0 0 . 1 0 1 0 <---- valeur utilisee pour le calcul 
     
      1 0 1 . 1 1 1 1 . 0 <---- valeur calculee 
         1 0 . 0 1 0 1 . 0 <---- valeur utilisee pour le calcul 
     
         1 1 . 1 0 1 0 . 0 0 <---- valeur calculee 
                   1 0 0 . 1 0 1 0 <---- valeur utilisee pour le calcul 
     
                   1 1 0 . 1 0 1 0 . 0 <---- valeur calculee 
                        1 . 0 0 1 0 . 1 0 <---- valeur utilisee pour le calcul 
     
                        1 . 1 0 0 0 . 1 0 <---- valeur calculee 
                             1 0 0 1 . 0 1 0 <---- valeur utilisee pour le calcul 
     
                             0 0 0 1 . 1 1 0 <---- valeur calculee 
                                     1 . 0 0 1 0 .1 <---- valeur utilisee pour le calcul
     
                                     0 . 1 1 1 0 . 1 <---- CRC5
    ici aussi la valeur est envoyee bits de poids faible en premier ce qui donne
    D7 D6 D5 D4 D3 D2 D1 D0
    1   0   1   1   1   0   0   0
    c'est donc 10111000 ou 0xB8 que l'on envoie
    EOF
    sa valeur est 0x01
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  17. #17
    Membre éprouvé
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Points : 1 018
    Points
    1 018
    Par défaut
    Salut tout le monde,

    Citation Envoyé par blondelle Voir le message
    Grace a ton intervention Médinoc je pense etre parvenu a programmer mon cordon USB, voici le code qui apparemment fonctionne
    Oui, mais attention.

    Tu ne dois pas utiliser le nom de ton périphérique en brut comme cela dans la fonction «CreateFile» car il contient un numéro d'instance entre le Product ID et l'Identificateur de Classe. L'idéal c'est de passer par une énumération en utilisant les différentes fonctions de la lib «Setupapi» pour enfin accéder au nom complet (lien symbolique) du périphérique («devicepath»). Outre cet aspect, ça te permet d'interroger le système et savoir si le périphérique en question est connecté avant même de tenter d'y accéder.

    Aussi, tes paquets devraient être consignés dans des structures plutôt que des tableaux, ton code serait à la fois plus lisible et plus expressif (un code qui parle de lui même vaut mieux que de longs //discours).

    Enfin, en ce qui concerne «CreateFile», son seul intérêt est bien entendu d'obtenir un handle, mais le penchant de ce que serait un «WriteFile / ReadFile» pour la communication et le pilotage c'est «DeviceIoControl», qui a l'avantage d'être bien plus riche que le simple «WriteFile» que tu utilises.

    Bonne continuation.

  18. #18
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Merci pour ton intervention maxim_um
    Je n'ai pas cherche a creer un driver, mais juste a programmer un convertisseur USB/parallele, comme je n'ai rien trouve de convaincant sur le Net et que l'utilisation de DLL ou d'OCX peut ou pas documentes ne me plaisait pas, j'ai donc utilise ce que je connaissait CreateFile WrteFile de meme que les donnees stockees dans un tableau, les cordons que je vais utiliser il y en auras au moins 4 seront toujours branches au meme emplacement donc pas besoins de detection quand au " devicepath " j'aurais pu utiliser " USB001 " qui est le numero du port sur lequel est branche le cordon de teste ( on peut le verifier a l'aide de USBVIEW ), quand au code tel qu'il est il n'y a aucun test d'erreur quand à la presence ou non du cordon ce ne sont que les preliminaires d'un programme beaucoup etoffe, quand a «DeviceIoControl», je ne l'ai jamais utilise, quand au debut d'explications sur les paquets envoyes c'est suite a une demande sur un autre post afin d'aider l'internaute, ce code ne doit servir que de base de depart ( pour un programmeur debutant ou en difficulte ) a lui d'y mettre sa touche personnelle.
    En tout cas encore merci de t'on intervention ca montre l'interet pour le sujet
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  19. #19
    Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 9
    Points : 3
    Points
    3
    Par défaut Presque...
    Salut,

    Est-tu sur que sa marche?

    Je pense que sa ne marche pas encore, et ce que tu relève est le 0x01 de SYNC. Et si tu regarde le Writefile où tu est censé écrire 6 octets tu n'écris que le premier octet du tableau (SYNC).
    En ce qui concerne la mise à 0 du busy pour prendre en compte le WriteFile peut être remplacé par un SOFT_RESET entre chaque WriteFile mais je pense que ce n'est pas mieux que le passage par zéro manuel.

    Bonne continuation.

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/07/2008, 22h13
  2. Convertisseur USB/Parallele et USB/serie
    Par feat12 dans le forum LabVIEW
    Réponses: 1
    Dernier message: 27/10/2007, 20h07
  3. Adresse d'un convertisseur USB --> parallèle
    Par ProgElecT dans le forum Composants
    Réponses: 4
    Dernier message: 15/08/2007, 16h10
  4. Réponses: 10
    Dernier message: 11/01/2007, 21h45
  5. [Question de programmation] Comment piloter un port USB ?
    Par Hucklus dans le forum C++Builder
    Réponses: 1
    Dernier message: 14/02/2006, 16h33

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