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 :

Problème ReadFile sur un Handle avec un périphérique USB error 1784


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 92
    Points : 47
    Points
    47
    Par défaut Problème ReadFile USB. 1784 problème buffer
    Bonjour, (le nom un peu compliqué du sujet est pour les recherches, parce que j'aimerai bien que tous les titres soient précis ( "j'ai un probleme" c pas sympa comme titre de thread ^^ ) )

    Résumé du problème : Mon ReadFile renvoit false quand mon Handle (qui est bon) est sur un périphérique USB, je n'ai pas le problème en Visual Basic.

    Le problème en détail
    Je rencontre un petit problème avec un ReadFile.
    Dans un premier cas j'ouvre un Handle sur un port virtuel "COM6" et je communique via ce port avec un hardware distant (par bluetooth) et avec le ReadFile suivant tout se passe bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    h = CreateFile("COM6",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
    (...)
    if(ReadFile(h,data,3,&nbRead, NULL)){...}
    dans mon deuxieme cas j'ouvre un handle sur un periphérique USB; le handle marche correctement, (grace au fonction fournit par la bibliotheque hid.dll je peux le vérifier aisément (ca communique ) ) mais le ReadFile me renvoit false. Avec la meme structure que précédemment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    h = CreateFile(FunctionClassDeviceData.DevicePath,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
    // FunctionClassDeviceData.DevicePath correspond au chemin d'acces a l'USB, et cette ligne marche :)
    (...)
    if(ReadFile(h,data,3,&nbRead, NULL)){...}
    Je cherche donc à résoudre ce problème, sachant que cela fonctionne en VB :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    OpenForRead = CreateFile(FileName, GENERIC_READ, FILE_SHARE_READWRITE, SA, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
    OpenForWrite = CreateFile(FileName, GENERIC_WRITE, FILE_SHARE_READWRITE, SA, OPEN_EXISTING, 0, 0);
    (...)
    Success = ReadFile(ReadHandle_USB, Buffer, Count, BytesRead, ReadOverlap)
    Si qqun voit l'erreur flagrante ?

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 590
    Points
    41 590
    Par défaut
    GetLastError() ?
    FormatMessage() ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 92
    Points : 47
    Points
    47
    Par défaut
    error 1784.

    Apres qq recherche sur internet (ok premier résultat sur google -_-):
    ==> Error: 1784 The supplied user buffer is not valid for the requested operation.

    Sinon je ne sais pas encore me servir de FormatMessage je regarde un peu les docs et je tiens au courant pour ce dernier

    Voila l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // MessageId: ERROR_INVALID_USER_BUFFER
    //
    // MessageText:
    //
    //  The supplied user buffer is not valid for the requested operation.
    //
    #define ERROR_INVALID_USER_BUFFER        1784L

    La définition, (incluant mon buffer) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	BYTE data[1600];
    	DWORD nbRead = 0;
    y a un probleme la dessus?

    Windows me dit ca : http://support.microsoft.com/default...;EN-US;Q259573
    Je sais c pas si il y a un lien, et y en aurait un , j'ai pas bien compris comment mettre en place leur solution.

    Y a des semaines comme ca ou rien ne marche et il faut passer 1 journée par ligne de code ... envie de week end

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Désolé, je me m'y connais pas en ports de communication.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 92
    Points : 47
    Points
    47
    Par défaut
    Y aurait il un forum plus approprié que le forum C++ pour poster cette question ?

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Développement Windows, peut-être.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 92
    Points : 47
    Points
    47
    Par défaut Pointeur Buffer
    Oki je vais voir.

    Sinon j'avance :

    J'ai trouvé pour les indications suivantes :

    ERROR_INVALID_USER_BUFFER
    "The supplied user buffer is not valid for the requested operation."
    FIX: Supply a non-zero value for the buffer pointer.
    Je rappelle ma définition de mon buffer :
    J'ai donc voulu vérifier buffer pointer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("pointeur buffer %ld :",data);
    Et j'ai eu comme résultat ===> 12173244
    Ce qui pour moi est différent de 0 : /

    Dites moi que j'ai fait n'importe quoi, que ca ne correspond pas au pointeur du buffer et que pour forcer le buffer pointer à ne plus etre à 0 il faut que je fasse autre chose. Plz dites moi ca

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Vérifie que ce n'est pas un problème de taille, genre "il faut que ce soit multiple de 512" ou pire "il faut que ce soit aligné sur 512" ou un truc du genre...

    Note: Ces conditions existent réellement, mais seulement pour le mode FILE_FLAG_NO_BUFFERING. Mais pour tes ports de communication, on ne sait jamais...

    Note2 : Tu peux allouer de la mémoire alignée sur 512 avec VirtualAlloc().

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 92
    Points : 47
    Points
    47
    Par défaut
    Ca y est ca marche, le problème venait a peu pret de ca.

    Il fallait que je lise la tram entière.

    Donc en lisant 65 octets avec un buffer data[64] tout marche parfaitement !!!

    Enfin.


    ERREUR 1784 FAITES ATTENTION A LA LONGEUR DE TRAM pour une ReadFile.
    Bien lire le bon nombre d'octet !!!!!!!


    Merci beaucoup Médinoc pour toute ton aide.
    Malheureusement je ne suis pas encore au bout de mes peines ^^ je pense que vous allez me revoir

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Euh... tu lis 65 octets dans un buffer qui ne peut en contenir que 64 ??

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    Bonjour moi aussi j'ai un probleme sur mon read fille il lit rien voila mon code est que c'est bon:

    char buf[4096];

    DWORD Read;
    POINT pt;
    BOOL bContinue = TRUE;
    SHORT Mask = 32768;
    DWORD dwEventFlags;
    DWORD dwData;
    while (bContinue)
    {
    dwData = 0;
    dwEventFlags = MOUSEEVENTF_ABSOLUTE;
    if (GetKeyState(VK_ESCAPE) & Mask)
    bContinue = FALSE;

    ReadFile(hUsbDevice, buf, 8, &Read, NULL ); //lecture du port usb
    buf[Read] = 0;

    if( buf== "5")
    SetCursorPos(0,0);
    //bContinue = FALSE;
    }
    PurgeComm(hUsbDevice, PURGE_RXCLEAR);

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 15/04/2015, 21h36
  2. [RestFB] Problème publication sur page facebook avec une application facebook
    Par shark59 dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 20/04/2012, 11h20
  3. Réponses: 4
    Dernier message: 07/07/2011, 09h51
  4. [Débutant] Interface graphique avec un périphérique USB
    Par mr:titi7 dans le forum Langages de programmation
    Réponses: 8
    Dernier message: 02/11/2007, 18h54
  5. [Système] Communiquer avec un périphérique USB
    Par Blackshade dans le forum Langage
    Réponses: 5
    Dernier message: 20/09/2007, 19h28

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