Forum: PC-Programmierung Daten an USB-Device schreiben


von Usb N. (spawnb)


Lesenswert?

Hallo,

habe ein USB-Device mit eintsprechenden Treiber, welches ich auch unter 
XP erfolgreich installieren konnte.

Nun möchte ich es gerne im Programm ansprechen und im ersten Schritt 
Daten schreiben und im 2ten Schritt lesen.

Leider komme ich mit der WinAPI beim schreiben über "WriteFile()" der 
Daten nicht weiter, definition hier:

http://msdn.microsoft.com/en-us/library/aa365747(VS.85).aspx


Hier der Code-Abschnitt dazu:
1
HANDLE  DeviceHandle = CreateFile(
2
        lpcwstr_handle,
3
        GENERIC_READ | GENERIC_WRITE,
4
        FILE_SHARE_READ | FILE_SHARE_WRITE,
5
        NULL,                           // no SECURITY_ATTRIBUTES structure
6
        OPEN_EXISTING,                  // No special create flags
7
        0,                              // No special attributes
8
        NULL);                          // No template file
9
10
11
if(DeviceHandle != INVALID_HANDLE_VALUE)
12
{
13
   // geschriebene Anzahl an Bytes
14
   DWORD numBytesReturned =0;
15
16
   // Daten
17
   char Antwort[32];
18
   for(int i=0; i<32; i++)
19
     Antwort[i] = 1;
20
21
   result = WriteFile(DeviceHandle,   // open file handle
22
              (char*) Antwort,        // start of data to write
23
              32,                     // number of bytes to write
24
              &numBytesReturned,      // number of bytes that were written
25
              NULL);                  // no overlapped structure
26
27
   DWORD s = GetLastError();
28
}


Leider ist der Rückgabewert "result" von "WriteFile()" ==0 so wie auch 
"numBytesReturned" == 0

und die Funktion GetLastError() liefert ==87

Laut MSDN --> GetLastError() returns 87 (ERROR_INVALID_PARAMETERS)

Nu was kann denn da Falsch sein?

von Christian R. (supachris)


Lesenswert?

Was für ein USB Device? Was für einen Treiber hat das ganze?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Nicht jedes Device, dessen Handle man mit CreateFile öffnen kann, lässt 
WriteFile/ReadFile-Operationen zu.

Vermutlich will dieses Device hier mit DeviceIoControl angesteuert 
werden.

http://msdn.microsoft.com/en-us/library/aa363216(VS.85).aspx

von Usb N. (spawnb)


Lesenswert?

Es ist ein neu entwickelts System, bestehend aus einer Basis-platine und 
einem aufgesetzten Rechen-Modul mit kleinem OS. (näher darf ich nicht 
drauf ein gehen)

Es handelt sich um einen USBFN Driver (USB Serial Class Usage)

@Firefly das könnte es sein, werd mich gleich mal auf DeviceIoControl 
stürtzen.

Beim DDK (WDK) gibt es Test-Tools mit den ich Daten an das Gerät senden 
kann.
Besser gesagt bei der Generierung eines USBbulk-Treibers wird gleich ein 
kleines Test-tool mit generiert. (..\WinDDK\6001.18002\src\kmdf\usbsamp)

Wobei ich ja über den Quellcode dieses USB-Testtools verfüge und dort 
wird zwar "DeviceIoControl" unter anderem verwendet, aber die Daten auch 
über WriteFile() geschrieben.

Aber aufjeden Fall ein Anhaltspunkt für mich.

DANKE

von Usb N. (spawnb)


Lesenswert?

Hallo,

also mit "DeviceIoControl()" hat leider auch nicht funktioniert
1
int result = DeviceIoControl(
2
                             DeviceHandle,                        //__inopt
3
                             IOCTL_USBSAMP_GET_CONFIG_DESCRIPTOR, //__in
4
                             Antwort,
5
                             32,
6
                             Antwort,
7
                             32,
8
                             &numBytesReturned,
9
                             NULL
10
                             );
11
12
DWORD s = GetLastError();

Ergebnise:
result           = 0
numBytesReturned = 0
s                = 6

Laut MSDN --> GetLastError() returns 6 Error Code "The handle is 
invalid."


Das kann ja wiederum nicht ganz sein, da ich ja zuvor das Handle 
überprüfe  if(DeviceHandle != INVALID_HANDLE_VALUE)


Jemand Ideen ?

von Usb N. (spawnb)


Lesenswert?

Fehler gefunden, um ein Handle auf das Device zum schreiben bzw. lesen 
von daten zu erhalten, reicht es nicht aus nur den Pfad zum Device 
anzugeben, sondern man muss auch noch den Endpoint 
(Lesen/Schreiben-Pipe) angeben.

in etwa so (Beispiel-Daten):

\\\\?\\usb#vid_9999&pid_9999#5&479E82ES&4&2#{R4EC42X0Q-54G2-42Sf-A1C0-4C 
AWSDD002AA}\\PIPE01";

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.