USB Ansprechen --> Zeichenkette senden via USB



  • Hi leute,
    habe die Aufgabe bekommen eine Zeichenkette via usb an ein gerät zu senden, habe mich auch schon totgesucht nach einem richtigen Programmcode aber das meiste davon funktioniert nicht. Habe mich auch schon in diesem Forum drüber schlau gemacht wobei ich die Beispiele auch nciht gebrauchen kann.

    Zu dem Projekt:

    An den Usb- Anschluss wird ein Gerät angeschlossen an welches man ein Maus und eine Tastatur anschließen kann. Anstatt dieser Maus oder Tastatur wird aber nun eine Control Unit über diese Leitung verbunden mir nur diesen zwei eingängen. Wie kann ich nun daten über diesen Prot senden. Also habe mir auch nen Code zusammengebastelt :

    //Programm zur Verbindung mit dem USB_HID

    #include <stdio.h>
    #include <windows.h>

    int main()
    {
    HANDLE hTreiber = INVALID_HANDLE_VALUE;
    int string [] = {0x10, 0x00, 0x00, 0x49, 0x49, 0x16};
    char getstring[] = "";
    unsigned long BytesWritten, BytesRead;
    int i = 0;

    SetLastError(0);

    //USB Schnittstelle konfigurieren
    hTreiber = CreateFile("\\\.\\HID#Vid_046d&Pid_c00c#6&2b662242&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}",

    GENERIC_READ | GENERIC_WRITE,
    0,
    NULL,
    OPEN_EXISTING,
    0,
    NULL);

    if (hTreiber == INVALID_HANDLE_VALUE)
    {
    printf("Verbindung zum USB-HID konnte nicht hergestellt werden!\nError %u\n",
    GetLastError());

    CloseHandle (hTreiber);
    }
    else
    {
    //printf("Verbindung zum USB-HID konnte hergstellt werden!\n");
    WriteFile(hTreiber,
    string,
    sizeof(string),
    &BytesWritten,
    NULL);

    ReadFile(hTreiber,
    getstring,
    sizeof(getstring),
    &BytesRead,
    NULL);
    printf("%x\n", getstring);

    CloseHandle(hTreiber);
    }

    return 0;
    }

    Wobei beim ausführen immer ein falscher Handel autritt die Funktion GetLastError gibt mir den den FehlerCode 5 Zurück wobei ich nicht weiß waß dieser Bedeutet.
    Kann mir jemand helfen und mir sagen was dass der Fehlercode beduetet bzw. mir sasgen wie ich das Gerät via Usb anspreche

    Danke an alle die mir versuchen zu helfen



  • Hi,

    beim Ausführen welcher funktion bekommst du den Fehler (ReadFile, Writefile oder CreateFile) ?

    MfG



  • Danke Für deine Antwort habe noch ein bisschen am Code rumgespielt also:

    Create File ... läuft
    ReadFile ... Kommt ein Error
    WriteFile ... kommt auch ein Error habe mal einen Report erstellt
    Hier mein neuer code

    #include <stdio.h>
    #include <windows.h>

    #include <stdlib.h>
    #include <setupapi.h>
    extern "C" {
    #include <hidsdi.h>
    }

    //Programm zur Verbindung mit dem USB_HID

    int main()
    {
    .....HANDLE hTreiber = INVALID_HANDLE_VALUE;
    .....int string [] = {0x00, 0x10, 0x10};
    .....char getstring[] = "";
    .....unsigned long BytesWritten, BytesRead;

    .....SetLastError(0);

    ....//USB Schnittstelle konfigurieren
    ....hTreiber=CreateFile("\\\.\\USB#Vid_04b4&Pid_8081&MI_00#6&11fe4e10&0&0000#{325ddf96-938c-11d3-9e34-0080c82727f4}",
    ............................GENERIC_READ | GENERIC_WRITE,
    ............................0,
    ............................NULL,
    ............................OPEN_EXISTING,
    ............................0,
    ............................NULL);

    ....if (hTreiber == INVALID_HANDLE_VALUE)
    ....{
    .......printf("Keine Verbindung!\nError%u\n",
    ........GetLastError());
    ........CloseHandle (hTreiber);
    ....}
    ....else
    ....{
    .........//printf("Verbindung zum USB-HID konnte hergstellt werden!\n");

    ........HIDP_VALUE_CAPS* pValueCaps = new HIDP_VALUE_CAPS[ValueCapsLength];
    ........if (!WriteFile(hTreiber,string,sizeof(string),&BytesWritten,NULL) )
    ........{
    ............printf("Can't write to device.");
    ............printf("Error: %u\n", GetLastError());
    ........}
    ........if(! ReadFile(hTreiber, getstring, sizeof(getstring), &BytesRead, NULL))
    ........{
    ............printf("Can't read from device.");
    ............printf("Error: %u\n", GetLastError());
    ........}
    ........else
    ........{
    .............printf("%x\n", getstring);
    ........}
    .........//.CloseHandle(hTreiber);
    ........}

    ....HIDP_CAPS Capabilities;
    ....PHIDP_PREPARSED_DATA PreparsedData;
    ....HIDP_REPORT_TYPE HidP_Input;
    ....USHORT ValueCapsLength;

    ....HIDP_VALUE_CAPS* pValueCaps = new HIDP_VALUE_CAPS[ValueCapsLength];

    ....HidD_GetPreparsedData(hTreiber, &PreparsedData);
    ....HidP_GetCaps(PreparsedData, &Capabilities);
    ....ValueCapsLength = Capabilities.NumberInputValueCaps;

    ....if(!HidP_GetValueCaps(HidP_Input, pValueCaps, &ValueCapsLength, ....PreparsedData))
    .......{
    ........CloseHandle(hTreiber);
    ........printf("Error: %u\n", GetLastError());
    .......}

    ....printf("Input - GetValueCaps:\n\n");
    ....printf("ValueCaps: 0x%X\n", pValueCaps);
    ....printf("%s0x%X\n", "Input - ReportID: ", pValueCaps->ReportID);
    ....printf("%s%d\n", "Usage: ", Capabilities.Usage);
    ....printf("%s0x%X\n", "Usage Page: ", Capabilities.UsagePage);
    ....printf("%s%d\n", "Input Report Byte Length: ", ....Capabilities.InputReportByteLength);
    ....system("Pause");

    ....return 0;
    }

    Kann mir jemand sagen was ich flasch mache
    die Punkte sind nur wegen der Übersicht hier noch der Input Report

    Can't write to device.Error: 3758100489 --> Schreibe Anweisung
    Can't read from device.Error: 3758100489 --> LeseAnweisung
    Input - GetValueCaps:

    ValueCaps: 0x240048 --> Report
    Input - ReportID: 0x22
    Usage: 23700
    Usage Page: 0x77C0
    Input Report Byte Length: 8304



  • Auf Geräte kann man i.d.R. nur mittels Geräte-Treiber kommunizieren...



  • Ja aber das Gerät wird als HID-Konfomre Tastatur erkannt also kann ich doch mittels
    der Funktionen der Hid.dll auf dieses Gerät zugreifen oder ????

    Also im Prinzip bekomme ich einen Handle auf das Gerät nur bei der Funktion

    HidP_GetValueCaps --> bekomme ich auch einen Error zurück

    ErrorCode : 0xC0110001

    Was sagt mir dieser Fehler ???



  • Jochen Kalmbach schrieb:

    Auf Geräte kann man i.d.R. nur mittels Geräte-Treiber kommunizieren...

    Was meinst Du wohl, was die Funktionen WriteFile und ReadFile machen? Die kommunizieren neuerdings mit dem Gerät und nicht mit dem Treiber, oder was?



  • int string [] = {0x00, 0x10, 0x10};
    

    Integer??? Bist Du Dir da sicher? Für den Fall WriteFile: Wie sieht denn der Report aus? Für den Fall HidP_GetValueCaps: Ich kann nirgendwo erkennen, dass Du ValueCapsLength initialisierst, bzw. passiert das erst nach dem Funktions-Aufruf. Das kann so natürlich nicht klappen.


Anmelden zum Antworten