www.mikrocontroller.net

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


Autor: Mathias Dubdidu (darkfirefighter)
Datum:

Bewertung
0 lesenswert
nicht 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:
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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: Mathias Dubdidu (darkfirefighter)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: René König (king)
Datum:

Bewertung
0 lesenswert
nicht 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].

Autor: Mathias Dubdidu (darkfirefighter)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Mathias Dubdidu (darkfirefighter)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.