writeFile gibt immer Fehler 87 zurück (HID)
-
Hallo zusammen,
ich habe hier ein MCBSTM32E von Keil, mit dem ich über den USB Port kommunizieren will. Das mitgelieferte Beispiel von Keil funktioniert auch bestens, nur wenn ich jetzt versuche das umzuschreiben komme ich nicht ganz zurecht.
Ich habe folgenden Code:
DWORD cnt; BYTE OutReport[2]; OutReport[1] = 0x01; ... h_device = CreateFile(p_interface_detail_data->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, (LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING, 0, NULL); HidD_GetProductString(h_device, buffer, 1000); for(x=0; x<NameLng; x++){ if(buffer[x] == name[x]) equal = 1; else equal = 0; } if(equal == 1){ printf("Name: %ls\n", buffer); if (!WriteFile(h_device, OutReport, sizeof(OutReport), &cnt, NULL)) { GetLastErrorText(sz_err, 256); printf("[ERR] %s\n", sz_err); } }WriteFile liefert mir nur immer den Fehler 87 Invalid Parameter zurück, nur welcher der Parameter ist falsch? Ich verwende die gleichen Parameter wie in dem funktionierenden Beispiel.
Achja mit der For-Schleife überprüfe ich, ob der gefundene Name der Name meines Boards ist, um so auf das richtige Handle zu kommen.
Hoffe ihr könnt mir weiterhelfen.Gruß
Mathias
-
Weißt du denn sicher, dass nicht schon CreateFile fehlschlägt? In dem Fall wäre der falsche Parameter das Handle. Überprüfe das mal mit dem Debugger.
-
Ich habs zwar noch nicht explizit überprüft, da ich aber nach dem CreateFile den Namen auslesen kann hätte ich gedacht, dass es funktioniert hat. Und falls ich ein Fehlerhaftes Handle an WriteFile gebe kommt ein anderer Fehler (hatte ich auch schon ^^)
Deswegen hätte ich gesagt, dass das Problem nicht beim Handle liegt.
Werde es aber nochmal testen
-
Sorry, stimmt natürlich. Ich hatte den Aufruf übersehen...
-
Wenn (equal == 1) ist, heißt das nicht unbedingt, daß (buffer == name) ist. Bitte Schleifenlogik kontrollieren.

-
Hi
for(x=0; x<NameLng; x++){ if(buffer[x] == name[x]) equal = 1; else equal = 0; }Logischer Fehler ...
besser
rc = memcmp(buffer , name ,NameLng);lowbyte
-
Hi
for(x=0; x<NameLng; x++){ if(buffer[x] == name[x]) equal = 1; else equal = 0; }Logischer Fehler ...
besser
rc = memcmp(buffer , name ,NameLng);lowbyte
-
Hi,
Danke für den Hinweis, aber ich muss gestehen ich finde den logischen Fehler nicht. NameLng ist genauso lang wie Zeichen in name stehen.
Was macht memcmp wenn buffer größer als name ist, ich aber memcmp nur die Größe von Name übergebe? Sie vergleicht doch dann nur die Zeichen bis NameLng oder?Gruß
-
Darkfirefighter schrieb:
Hi,
Danke für den Hinweis, aber ich muss gestehen ich finde den logischen Fehler nicht.
Bei deinem Code vergleichst du pro Schleifendurchlauf die einzelnen Zeichen an Stelle x. Das Ergebnis dieses einen Vergleichs pro Durchlauf speicherst du in equal. Nun stell dir vor, die ersten Zeichen der beiden Strings stimmen nicht überein. Du setzt also equal auf 0. Jetzt stimmt das letzte Zeichen aber zufällig überein. Also setzt du im letzten Durchlauf equal auf 1 und denkst, dass die Strings wohl gleich waren. Was in den ganzen Durchläufen zuvor in equal stand, beachtest du nicht, da du es überschrieben hast.
-
_matze schrieb:
Darkfirefighter schrieb:
Hi,
Danke für den Hinweis, aber ich muss gestehen ich finde den logischen Fehler nicht.
Bei deinem Code vergleichst du pro Schleifendurchlauf die einzelnen Zeichen an Stelle x. Das Ergebnis dieses einen Vergleichs pro Durchlauf speicherst du in equal. Nun stell dir vor, die ersten Zeichen der beiden Strings stimmen nicht überein. Du setzt also equal auf 0. Jetzt stimmt das letzte Zeichen aber zufällig überein. Also setzt du im letzten Durchlauf equal auf 1 und denkst, dass die Strings wohl gleich waren. Was in den ganzen Durchläufen zuvor in equal stand, beachtest du nicht, da du es überschrieben hast.
Hmm klar, jetzt wo du es sagst
manachmal sieht man echt den Wald vor lauter Bäumen nicht.
Danke!Das eigentliche Problem ist auch gelöst, habe vergessen OutReport[0] mit 0 zu initialisieren
Gruß