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 :

Soucis avec la fonction WriteFile de windows


Sujet :

Windows

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Soucis avec la fonction WriteFile de windows
    bonjour,
    j'essaye de faire communiquer un periphérique avec connectique bluetooth et usb (je me sers des 2). j'arrive à établir une communication du périphérique vers une application PC mais je n'arrive pas à envoyer des informations vers ce periphérique.
    mon environnement de developpement est windows XP, j'utilise donc les fonctions createFile pour récupérer un Handle vers mon port com ou mon port usb, readFile pour recevoir des données (dans ce sens, la communication marche), et writeFile pour ecrire vers le périphérique sauf que writeFile echoue et getLastError() me renvoie une erreur de type 87 (à savoir : INVALIDE_PARAMETER)
    mon appel à la fonction writeFile est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	bool success=WriteFile(handle,data,64,&nbWritten,NULL);
    avec : handle mon handle vers mon port (il doit etre bon car je peux je peux faire un readFile avec ce handle là)
    data un tableau de BYTE de taille 64
    nbWritten un pointeur vers un DWORD
    mon tableau data semble être initialisé correctement.
    D'où peut donc bien venir cette erreur 87 ???


    extrait de 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
    ....
    ....
    BYTE dataToSend[64];
    DWORD nbWritten;
    
    dataToSend[0] = 16 ; 
    for(int i=1; i<=63;i++){
    	dataToSend[i]=0;
    }
    ....
    ....
    handle = CreateFile(FunctionClassDeviceData.DevicePath,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
    
    if(handle != INVALID_HANDLE_VALUE) {
    	success=WriteFile(handle,dataToSend,64,&nbWritten,NULL);
    	if(!success){
    		std::cout<<"Erreur numéro "<<GetLastError()<< std::endl;
    	}
    }
    Kendra533

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    bonjour et bienvenue sur developeez.com

    la seule erreur possible que je vois, ce serait une erreur sur le paramètre nbBytesToWrite. Comment est-il déclaré?
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Le h en premier paramètre de WriteFile (qui devrait être handle a priori), c'est une faut de frappe ou bien tu as vraiment un h dans ton code ?

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    oui, c une erreur (en fait, la createFile n'est pas fait dans le meme fichier à l'origine...) ça y est c'est corrigé!
    Mais le nbByteToWrite est simplement un entier. en fait je veux envoyer un paquet de 64 octets vers mon port...

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Personne n'aurait une petite idée?? meme juste une piste?

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    up!

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Vu l'écart de temps, tu dois poster la dernière version de ton code.
    Et un VRAI copier-coller s'il te plait, pas un truc avec un nom de variable pour un autre...
    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.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    c'est pas faux!
    bon du coup, j'ai remanier mon code mais j'ai toujours le même pb. voici le code :

    le .h :
    Code C++ : 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
     
    #pragma once
     
    class Connection
    {
    public:
    	Connection(void);
    public:
    	~Connection(void);
     
     
    // Attributes
    public :
    	HANDLE h;
     
    // Methode's prototypes
    public :
    	bool Connection::checkConnectionUSB();
    	HANDLE Connection::connectToBoard();
    };

    et le .cpp

    Code C++ : 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
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
     
    #include "StdAfx.h"
    #include <iostream>
    #include "Connection.h"
     
    extern "C"{
    	#include "setupapi.h"
    	#include "hidsdi.h"
    }
     
    #pragma comment (lib, "hid.lib") 
    #pragma comment (lib, "setupAPI.lib") 
     
     
    struct {DWORD cbSize; char DevicePath[256];} FunctionClassDeviceData;
     
    using namespace std;
    Connection::Connection(void)
    {
     
    }
     
    Connection::~Connection(void)
    {
    }
     
     
    HANDLE Connection::connectToBoard(){
    	if (checkConnectionUSB() && h!=INVALID_HANDLE_VALUE){
    		cout<<"Plateau connecté en USB"<<endl;		
    	}
    	else {
    		h = CreateFile("COM6",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
    		if (h!=INVALID_HANDLE_VALUE){
    			cout<<"Plateau connecté en BlueTooth"<<endl;
    		}
    	}
    	return h;
    }
     
    bool Connection::checkConnectionUSB(){
     
    	DWORD wmWritten; 
    	char strData[] = "Test data written to explain the win32 file sample";
     
    	HANDLE HIDHandle;
    	bool success=false;
    	DWORD nbBytesReturned;
    	DWORD needed;
    	SP_DEVICE_INTERFACE_DETAIL_DATA buffer;
    	HIDD_ATTRIBUTES HIDAttributes;
     
     
    	HDEVINFO hDevInfo;
        SP_DEVINFO_DATA DeviceInfoData;
        SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
        struct _GUID GUID;
        HidD_GetHidGuid(&GUID);
        DWORD i;
        DWORD InterfaceNumber= 0;
     
        // Create a HDEVINFO with all present devices.
        hDevInfo = SetupDiGetClassDevs(&GUID,
            0, // Enumerator
            0,
            DIGCF_PRESENT | DIGCF_INTERFACEDEVICE );
     
        if (hDevInfo == INVALID_HANDLE_VALUE)
        {
    		cout<<"SetupDiGetClassDevs a generer une erreur "<<endl;
            // Insert error handling here.
            return 1;
        }
     
        // Enumerate through all devices in Set.
     
        DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
        for (i=0;SetupDiEnumDeviceInfo(hDevInfo,i,
            &DeviceInfoData);i++)
        {
            DWORD DataT;
            LPTSTR buffer = NULL;
            DWORD buffersize = 0;
     
            //
            // Call function with null to begin with,
            // then use the returned buffer size
            // to Alloc the buffer. Keep calling until
            // success or an unknown failure.
            //
            while (!SetupDiGetDeviceRegistryProperty(
                hDevInfo,
                &DeviceInfoData,
                SPDRP_DEVICEDESC,
                &DataT,
                (PBYTE)buffer,
                buffersize,
                &buffersize))
            {
                if (GetLastError() ==
                    ERROR_INSUFFICIENT_BUFFER)
                {
                    // Change the buffer size.
                    if (buffer) LocalFree(buffer);
                    buffer = (LPTSTR)LocalAlloc(LPTR,buffersize);
                }
                else
                {
                    // Insert error handling here.
                    break;
                }
            }
            _tprintf(TEXT("Device Number %i is: %s\n"),i, buffer);
     
            if (buffer) LocalFree(buffer);
        }
     
        if ( GetLastError()!=NO_ERROR &&
             GetLastError()!=ERROR_NO_MORE_ITEMS )
        {
            // Insert error handling here.
            return false;
        }
        InterfaceNumber = 0;  // this just returns the first one, you can iterate on this
     
    	for (InterfaceNumber=0;InterfaceNumber<8;InterfaceNumber++)
    	{
    	DeviceInterfaceData.cbSize = sizeof(DeviceInterfaceData);
        if (SetupDiEnumDeviceInterfaces(hDevInfo,NULL,&GUID,InterfaceNumber,&DeviceInterfaceData))
    	{
    			printf("\nGot interface");
    			FunctionClassDeviceData.cbSize=5; 
    			success=SetupDiGetDeviceInterfaceDetail(hDevInfo,&DeviceInterfaceData,(PSP_DEVICE_INTERFACE_DETAIL_DATA)(&FunctionClassDeviceData),256,&nbBytesReturned,NULL);
    			cout<<"SetupDiGetDeviceInterfaceDetail returns "<<success<< "codeError: "<< GetLastError()<<endl;
    			cout<<"nbBytesReturned= "<< nbBytesReturned<<endl;
    			cout<<"devicePath:"<<FunctionClassDeviceData.DevicePath<<endl;
    			if(success){
    				HIDHandle=CreateFile(FunctionClassDeviceData.DevicePath,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    				cout<<"CreateFile returns "<<HIDHandle<< "codeError: "<< GetLastError()<<endl;
    				if (HIDHandle!=INVALID_HANDLE_VALUE){
    					success = HidD_GetAttributes(HIDHandle, &HIDAttributes);
    					cout<<"HidD_GetAttributes returns "<<success<< "codeError: "<< GetLastError()<<endl;
    					if (!success){ 
    						 printf("Could not get HID attributes\n"); return false; 
    					}
    					else{
    						if( HIDAttributes.VendorID == 0x4242  && HIDAttributes.ProductID == 0xee01 ){
    								cout<<"On a le device en USB "<<endl;
    								h = HIDHandle;
     
    								success= WriteFile(h,strData,(DWORD)(sizeof(strData)),&wmWritten,NULL); 
     
    								cout<<"WriteFile returns  "<<success<< " codeError: "<< GetLastError()<<endl;
    								return true;
    						}
     
    					}
    			    }
     
    			}
    	}
        else
        {
            printf("\nNo interface");
     
            if ( GetLastError() == ERROR_NO_MORE_ITEMS) printf(", since there are no more items found.\n");
            else printf(", unknown reason.\n");
        }
     
    }
    	cout<<"\nLe device n'est pas connecté par usb!\n"<<endl;
        //  Cleanup
        SetupDiDestroyDeviceInfoList(hDevInfo);
        return false;
    }


    J'ai toujours le meme probleme : writeFile echoue et GetLastError me renvoie une erreur 87 : invalid parameter.
    c'est donc que je fais quelque chose mal, mais je vois pas quoi...
    je sais pas si c'est utile de préciser mais j'utilise visual studio 2005.

    quelqu'un saurait me dire où est-ce que j'ai fait le boulet?? lol

    merci d'avance!

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Salut,
    1. Un .c avec des classes ? Tu devais vouloir dire .cpp...
    2. FunctionClassDeviceData est une variable globale. Es-tu sûr que c'est ce que tu voulais ? (surtout que tu as une classe, où tu pourrais mettre des variables static...)
    3. Je me demande si le problème n'est pas dû à une histoire d'alignement. Tu devrais essayer en allouant unbuffer avec VirtualAlloc() (et pas une autre fonction), y copier ta strdata et faire un WriteFile() avec...

    PS: Précise "C" ou "C++" dans la balise code pour activer la coloration syntaxique sur ce forum:
    [CODE="C"]...[/CODE]
    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.

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    merci pour le coup de la balise, je connaissais pas. Pour le fichier c'est bien un .cpp! j'ai pas l'habitude encore, je pense en C...désolée!

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup Medinoc, ça a l'air de fonctionner avec ta solution du virtualAlloc! En tout cas, writefile renvoie plus d'erreur

    encore merci!

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

Discussions similaires

  1. Soucis avec une fonction et un include
    Par Olivier Regnier dans le forum Langage
    Réponses: 7
    Dernier message: 05/11/2007, 14h58
  2. [FTP] Soucis avec la fonction "unlink"
    Par Petit bateau dans le forum Langage
    Réponses: 8
    Dernier message: 05/08/2007, 22h37
  3. [VBA] Soucis avec la Fonction Format
    Par kleenex dans le forum VBA Access
    Réponses: 4
    Dernier message: 11/06/2007, 11h17
  4. Souci avec la fonction SetFocus
    Par uranium-design dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 09/04/2007, 12h53
  5. [Système] P'tit soucis avec la fonction EXEC
    Par nais_ dans le forum Langage
    Réponses: 9
    Dernier message: 23/08/2006, 11h36

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