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

MFC Discussion :

Lecture du port USB


Sujet :

MFC

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 79
    Par défaut Lecture du port USB
    Slt tlm, j'ai un adaptateur de manette Playstation2- USB. Et sur cette adaptateur,j'ai branché une télécommande play2. Je voudrais savoir
    si c'est possible de programmer cette télécommande. J'avais pensé a regardé quel données étaient envoyé sur le port USB lorsque l'on appuie sur une touche de la télécommande.Mais je ne saity pas comment faire pour voir ce qui arrive aux niveau d'un port USB. Si quelqu'un peut m'aider ça serait cool. merci ++

  2. #2
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Faut écrire un driver filtre... c'est très complexe.
    Regarde plutot sur le net si des mecs n'ont pas déjà fait ce que tu souhaites.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 79
    Par défaut
    est ce kon peut utilisé la fonction createfile()???

  4. #4
    Membre confirmé Avatar de Hokagge
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 149
    Par défaut
    => createfile() pour ouvrir le port
    => ReadFile() pour lire ce qui y arrive
    => CloseHandle() pour refermer le port

    J'ai réalisé une petit appli dans le genre.

    Celle ci me permettait d'afficher ce qu'y arrivait sur le port de manière pratiquement instantanné, grace à un timer.

    C'est juste une petite piste, en espérant que ce t'aide un peu

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 79
    Par défaut
    merci Hokagge. J'ai deja fait des test avec cette fonction. Mais le probléme c'est que je n'arrive pas à savoir kel port je doit allé scruter.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    PortHandle=CreateFile("\\.\USB1",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
    Est ce ke ce bout de code est bon pour louverture d'un port??

    et pour voir ce ki arrive sur le port j'ai mi ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    char tab[500];
    	DWORD dwBytesRead;
    	OVERLAPPED m_OverlappedRead;
    	dwBytesRead = (DWORD) 500;
    	if(ouvert)
    	{
    		ReadFile(PortHandle,tab,dwBytesRead,&dwBytesRead,&m_OverlappedRead);
    		CString str;
    		str.Format("%d",tab);
    		SetDlgItemText(IDC_LABEL3,str);
    	}
    Si tu pouvait maidé ca serait cool

  6. #6
    Membre confirmé Avatar de Hokagge
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 149
    Par défaut
    Pour le createfile(), je ne pourrais pas te dire quel est l'ID de ton port...

    Par contre sur mon appli je l'ai écrit comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CreateFile(L"COM7:", bla bla bla)
    Pour le reste des paramètres, un chti coup d'oeil dans la msdn et c'est parti

    Pour ce qu'y est du readfile voila ce que j'ai fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char buf[4096],
    chaine[4096];
     
    DWORD Read;
     
    ReadFile( handlePort, buf, 2048, &Read, NULL )
     
    buf[Read] = 0;
    m_Texte = buf;
    PurgeComm(handlePort, PURGE_RXCLEAR);
    Hey oui je suis un des rares qui bosse encore avec des chaine plutôt que des string
    (j'espère que personne me tapera )

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 79
    Par défaut
    merci pour cette aide. est ce ke tu c komen je pourré faire pour identifié mes ports usb?

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 79
    Par défaut
    est ce ke tu pourré mettre ton code soure en ligne Hokagge stp?,

  9. #9
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    J'avais pas bien compris. Si tu reçois des trames c'est plus facile, mais c'est pas gagné pour autant.
    USB, c'est un bus. Ce que tu veux adresser, c'est un périphérique sur ce bus. Donc, en soit, l'USB ne te concerne pas. C'est comme pour attaquer directement le disque dur, tu ouvres le disque dur, pas l'IDE0.
    Faut donc trouver le nom de ton périphérique. Pour cela faut énumérer les périphériques branchés, car le nom peut varier entre chaque branchement. Lors de cette énumération, tu files l'identifiant de ton périphérique (un GUID). Faut déjà déterminer la valeur de ce GUID, puis s'en servir pour filtrer l'énumération des périph branchés. Tu récupères alors la liste des périph de ce type qui sont branchés, et pour chacun d'entre eux le nom à filer à CreateFile.
    Après y'a plus qu'à espérer que ReadFile donne quelque chose, car ça dépend du bon vouloir du driver...
    Un bon lien qui illustre tout ça:
    http://www.delcom-eng.com/downloads/USBPRGMNL.pdf
    et un autre pour t'aider dans l'énumération et la recherche du GUID:
    http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q259695

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 79
    Par défaut
    merci de ton aide. g récupéré un ptit prog sur le net, ki permet de connaitre les propriété des périphérik é g trouvé kel port usb je voulé lire. mais je trouve po le "devicename". j'ai fait un screen du resultat du prog.

    http://membres.lycos.fr/fireboo666//...utres/enum.JPG

    Si tu c ce ki fo mettre ds la fonction createfile(), c le premier paramétre ki me mank. merci de ton aide

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 79
    Par défaut
    Je n'arivve pas a trouvé le devicename du port USB, si kelkun puové maidé ca seré cool,merci

  12. #12
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Je me suis embrouillé avec les GUID, celui obtenu de cette manière c'est pas le bon (il identifie la classe de périphérique, or il te faut le GUID propre à ce périphérique).
    Je ne sais pas comment retrouver programmaticalement le GUID de ton périph. Tu peux le faire à la main en utilisant winobj par exemple:
    http://www.sysinternals.com/Utilities/WinObj.html
    Dans "GLOBAL??", cherche le nom de ton périph USB, dont le début doit être assez proche de la propriété SPDRP_HARDWAREID renvoyé par SetupDiGetDeviceRegistryProperty, ce qui d'après ton screenshot devrait donner un truc du genre "HID#Vid_14fe&Pid_232a[...]#{GUID}" et se terminer par le GUID qui nous intéresse outouré par deux accolades (la partie "{GUID}" juste avant).
    Note ce GUID, et copie le dans ton code via la macro DEFINE_GUID.
    Chez moi ça donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #define INITGUID // <- important !
    #include <windows.h>
     
    //{4D36E978-E325-11CE-BFC1-08002BE10318}
    DEFINE_GUID(PORT_GUID,
    0x4D36E978, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1,
    0x03, 0x18);
    puis tu t'en sers comme expliqué dans le PDF (SetupDiGetClassDevs->SetupDiEnumInterfaceDevice->SetupDiGetInterfaceDeviceDetail qui te renvoie PSP_INTERFACE_DEVICE_DETAIL_DATA.DevicePath qui est le nom à utiliser pour CreateFile).

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 79
    Par défaut
    Bon jvien de compilé le prog kom tu ma di é en suivant le PDF. Mai lorsque je lance le prog, il y a une erreur. Jcompren pas pourquoi. pourrais tu menvoyé ton code stp? merci ++

  14. #14
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    En utilisant le code du PDF avec comme GUID celui renvoyé par HidD_GetHidGuid ça devrait marcher.

  15. #15
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Vu que ça fait partie du DDK, tu peux définir le GUID à utiliser ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    const GUID HidClassGuid = {0x4D1E55B2, 0xF16F, 0x11CF, {0x88,0xCB,0x00,0x11,0x11,0x00,0x00,0x30}};

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 79
    Par défaut
    Slt, j'ai essayais comme tu as dit,mais je n'arrive toujours pas à faire un programme qui marche jte donne le code pour me dire si il est juste. J'ai rajouter quelque ligne,car javais des erreurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #define INITGUID // <- important !
    #include <windows.h>
     
    GUID USBIODS_GUID = {0x745A17A0,0x74D3, 0x11D0, {0xB6, 0xFE, 0x00, 0xA0, 0xC9, 0x0F, 0x57, 0xDA}};
    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
     
    void CCMDTVDlg::OnButton1()
    {
       // TODO: Add your control notification handler code here
    int i;
    bool t=false;
    CString Devices[10]; // an array of cstrings
    for (i=0; i<50 ; i++)
    {
    t=true;
     
    SP_INTERFACE_DEVICE_DATA Interface_Info;
    Interface_Info.cbSize = sizeof(Interface_Info);
     
    // Enumerate device
    if (!SetupDiEnumInterfaceDevice(hInfo, NULL, (LPGUID)
    &USBIODS_GUID,i, &Interface_Info))
    {
    SetupDiDestroyDeviceInfoList(hInfo);
    //SetDlgItemText(IDC_LABEL,"Pas De device enum");
    t=false;
    }
     
    DWORD needed; // get the required lenght
     
    SetupDiGetInterfaceDeviceDetail(hInfo, &Interface_Info,
    NULL, 0, &needed, NULL);
     
    PSP_INTERFACE_DEVICE_DETAIL_DATA detail =
    (PSP_INTERFACE_DEVICE_DETAIL_DATA) malloc(needed);
     
    if (!detail)
    {
    SetupDiDestroyDeviceInfoList(hInfo);
    //SetDlgItemText(IDC_LABEL,"CCC");
    t=false;
    }
    CString str;   
    // fill the device details
    if(t)
    {
       detail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
       if (!SetupDiGetInterfaceDeviceDetail(hInfo,&Interface_Info,detail, needed,NULL, NULL))
       {
       free((PVOID) detail);
       SetupDiDestroyDeviceInfoList(hInfo);
       SetDlgItemText(IDC_LABEL,"Pas interface");
       }
     
       char name[MAX_PATH];
       strncpy(name, detail->DevicePath, sizeof(name));
     
       free((PVOID) detail);
     
       Devices[i] = name; // keep a copy of each device name
     
    }
    for(int a=0;a<10;a++)
    SetDlgItemText(IDC_LABEL,Devices[a]);
    }
    }
    Voila. Si deja cette partie de programme était juste je pourrais récupéré le nom du périph,mais ca marche pas. Merci de ton aide @+

  17. #17
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Ca marche pas c.a.d ?
    Tu devrais faire une version simple console pour commencer, car y'a de drôle de trucs dans ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(int a=0;a<10;a++) 
    SetDlgItemText(IDC_LABEL,Devices[a]);
    tu changes 10 fois à la suite le texte d'un même label...
    Quel est le nom du périph qui t'intéresse tel que tu le vois dans Winobj ?

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 79
    Par défaut
    Le nom du périph c'est :

    HID#vid_14fe&Pid_232a&Col01#6&32feb84d&1&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 79
    Par défaut
    Ca yé g rectifié ce qui allé pas voila le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #define INITGUID // <- important !
    #include <windows.h> 
    GUID USBIODS_GUID = {0x4d1e55b2,0xf16f, 0x11cf, {0x88, 0xcb, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30}};
    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
     
    void CCMDTVDlg::OnButton1() 
    {
    	// TODO: Add your control notification handler code here
    int i;
    bool t=false;
    CString Devices[10]; // an array of cstrings
    for (i=2; i<3 ; i++)
    {
    t=true;
     
    SP_INTERFACE_DEVICE_DATA Interface_Info;
    Interface_Info.cbSize = sizeof(Interface_Info);
     
    // Enumerate device
    if (!SetupDiEnumInterfaceDevice(hInfo, NULL, (LPGUID)
    &USBIODS_GUID,i, &Interface_Info))
    {
    SetupDiDestroyDeviceInfoList(hInfo);
    //SetDlgItemText(IDC_LABEL,"Pas De device enum");
    t=false;
    }
     
    DWORD needed; // get the required lenght
     
    SetupDiGetInterfaceDeviceDetail(hInfo, &Interface_Info,
    NULL, 0, &needed, NULL);
     
    PSP_INTERFACE_DEVICE_DETAIL_DATA detail =
    (PSP_INTERFACE_DEVICE_DETAIL_DATA) malloc(needed);
     
    if (!detail)
    {
    SetupDiDestroyDeviceInfoList(hInfo);
    //SetDlgItemText(IDC_LABEL,"CCC");
    t=false;
    }
    CString str;	
    // fill the device details
    if(t)
    {
    	detail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
    	if (!SetupDiGetInterfaceDeviceDetail(hInfo,&Interface_Info,detail, needed,NULL, NULL))
    	{
    	free((PVOID) detail);
    	SetupDiDestroyDeviceInfoList(hInfo);
    	SetDlgItemText(IDC_LABEL,"Pas interface");
    	}
     
    	char name[MAX_PATH];
    	strncpy(name, detail->DevicePath, sizeof(name));
     
    	free((PVOID) detail);
    	str.Format("%s",name);
     
    	hUsbDevice = CreateFile(name, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
    if(hUsbDevice == INVALID_HANDLE_VALUE)
    {
    	SetDlgItemText(IDC_LABEL1,"Erreur lors de l'ouverure du port");
    }else
    {
    	SetDlgItemText(IDC_LABEL1,"Port ouvert");
     
    }
    	Devices[i] = name; // keep a copy of each device name
     
    }
     
    SetDlgItemText(IDC_LABEL,str);
     
    }
    }
    Maintenant j'essai de lire au nivo du périph mais ca a pas l'air de marché
    Je lis comme ca :

    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
     
     
    void CCMDTVDlg::OnButton3() 
    {
    	// TODO: Add your control notification handler code here
     
    char buf[4096],
    chaine[4096];
    CString strb;
    DWORD Read;
     
    ReadFile(hUsbDevice, buf, 2048, &Read, NULL );
     
    buf[Read] = 0;
    //m_Texte = buf;
    strb.Format("%d",buf);
    SetDlgItemText(IDC_LABEL3,strb);
    PurgeComm(hUsbDevice, PURGE_RXCLEAR);
    }
    Est ce ke la lecture est juste?

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 79
    Par défaut
    Maintenan, j'arrive a lire sur le port usb, le prob ke g c que la valeur que je récupére je la converti :
    en cstring : ┐€€€€¤
    en hexa: 12e688
    en decimal: 1238664

    Lorsque jappuie sur un autre bouton, la valeur en CString change mais pas celle en hexa et decimal. Donc je cherche un moyen pour réussir a différencier l'appuie des touches en utilisant un CString. Faudrais que je trouve un moyen pour récupéré la valeur en binaire...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Lecture de port USB
    Par riete dans le forum Langage
    Réponses: 4
    Dernier message: 09/06/2009, 11h05
  2. Lecture sur Port USB en C/C++
    Par gobelin88 dans le forum C++
    Réponses: 1
    Dernier message: 10/09/2007, 22h08
  3. [PHP-JS] Lecture du Port USB
    Par toons18 dans le forum Langage
    Réponses: 13
    Dernier message: 05/10/2006, 00h15
  4. lecture d'un port usb
    Par bob21 dans le forum C++
    Réponses: 1
    Dernier message: 13/06/2006, 13h18
  5. Réponses: 2
    Dernier message: 27/02/2003, 01h33

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