Forum: PC-Programmierung writeFile gibt immer Fehler 87 zurück (HID)


von Mathias D. (darkfirefighter)


Lesenswert?

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:
1
DWORD cnt;
2
BYTE OutReport[2];
3
OutReport[1] = 0x01;
4
5
...
6
7
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);
8
HidD_GetProductString(h_device, buffer, 1000);
9
for(x=0; x<NameLng; x++){
10
    if(buffer[x] == name[x])
11
    equal = 1;
12
    else
13
    equal = 0;
14
}
15
if(equal == 1){
16
    printf("Name: %ls\n", buffer);
17
    if (!WriteFile(h_device, OutReport, sizeof(OutReport), &cnt, NULL)) {
18
    GetLastErrorText(sz_err, 256);
19
    printf("[ERR] %s\n", sz_err);
20
    }
21
}

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Hast Du mal überprüft, wie der Rückgabewert von CreateFile aussieht, 
also was in h_device drinsteht?

von Mathias D. (darkfirefighter)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Tja, dann poste mal den funktionierenden Original-Code und Deinen 
nichtfunktionierenden, und beschreibe, welche Veränderung Du angestellt 
hast.

Ansonsten ist bei solchen Programmierereien die Auswertung der 
Rückgabewerte von Funktionen immer wichtig, die sollte nie weggelassen 
werden. Gewöhn Dir das ganz schnell ab.

von René K. (king)


Lesenswert?

Die Länge des Output-Reports ist die tatsächliche Länge des Reports + 1. 
Das erste Byte des Reports wird dann vor dem Aufruf von WriteFile mit 
dem Report-Identifier initialisiert. Arbeitest Du nicht mit Identifiern, 
setzt Du das erste Byte ganz einfach auf 0.

In Deinem Auszug fehlt auf alle Fälle schon mal die Initialisierung von 
OutReport[0].

von Mathias D. (darkfirefighter)


Lesenswert?

Rufus t. Firefly schrieb:
> Tja, dann poste mal den funktionierenden Original-Code und Deinen
> nichtfunktionierenden, und beschreibe, welche Veränderung Du angestellt
> hast.

Ok, werd ich machen, kanns aber erst am Montag machen.

> Ansonsten ist bei solchen Programmierereien die Auswertung der
> Rückgabewerte von Funktionen immer wichtig, die sollte nie weggelassen
> werden. Gewöhn Dir das ganz schnell ab.

Werd ich machen :)

René König schrieb:
> Die Länge des Output-Reports ist die tatsächliche Länge des Reports + 1.
> Das erste Byte des Reports wird dann vor dem Aufruf von WriteFile mit
> dem Report-Identifier initialisiert. Arbeitest Du nicht mit Identifiern,
> setzt Du das erste Byte ganz einfach auf 0.
>
> In Deinem Auszug fehlt auf alle Fälle schon mal die Initialisierung von
> OutReport[0].

Hmm ok werde ich auch am Montag gleich nachhohlen.

Danke für eure Hilfe!

Gruß

von Mathias D. (darkfirefighter)


Lesenswert?

René König schrieb:
> Die Länge des Output-Reports ist die tatsächliche Länge des Reports + 1.
> Das erste Byte des Reports wird dann vor dem Aufruf von WriteFile mit
> dem Report-Identifier initialisiert. Arbeitest Du nicht mit Identifiern,
> setzt Du das erste Byte ganz einfach auf 0.
>
> In Deinem Auszug fehlt auf alle Fälle schon mal die Initialisierung von
> OutReport[0].

Danke, daran lag es. Hab OutReport[0] = 0 gesetzt und jetzt gehts.

Gruß

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.