Kommunikation mit HID über USB



  • Hallo!

    Ich arbeite gerade an einer Kommunikation des PCs mit einem USB-tauglichen Mikrocontroller (PIC16C765). Ich suche vergeblich nach einer Kommunikationsmöglichkeit in Visual C++ 6.0 mit sogenannten "Human Interface Devices" (HID), denn der Chip meldet sich so am PC an. Ich habe schon was mit der Datei hid.dll gehört, mehr weiß und finde ich dazu leider auch nicht.

    Bitte helft mir weiter!

    Betriebssystem: Win2k
    USB: 1.1

    mfG
    Firestormer



  • Mahlzeit!

    Ich mache auch gerade etwas ähnliches mit HIDs. Du brauchst zunächst, um auf Dein HID zugreifen zu können, den Namen für CreateFile, dazu gibt's auch jede Menge Threads hier im Forum. Um dann Daten lesen und schreiben zu können, brauchst Du ReadFile und WriteFile. Den Namen für CreateFile bekommst Du hiermit:

    #include <stdio.h>
    #include <windows.h> 
    #include <setupapi.h> 
    extern "C" {
    #include <hidsdi.h>
    }
    int main() 
    { 
    	PSP_DEVICE_INTERFACE_DETAIL_DATA pspdidd; 
        SP_DEVICE_INTERFACE_DATA         spdid; 
        SP_DEVINFO_DATA                  spdd; 
        HDEVINFO                         hDevInfo; 
        DWORD                            dwIndex, dwSize, dwType; 
        TCHAR                            szProperty[256]; 
        GUID                             guid; 
    
        ZeroMemory(&spdid, sizeof(spdid)); 
        spdid.cbSize = sizeof(spdid); 
        HidD_GetHidGuid(&guid);
        hDevInfo = SetupDiGetClassDevs(&guid, 
    								   NULL, 
    								   NULL, 
    								   DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
    
        if(hDevInfo == INVALID_HANDLE_VALUE) 
        { 
            printf("SetupDiGetClassDevs failed, Error %u\n", GetLastError()); 
            return(FALSE); 
        } 
    
        for(dwIndex = 0; (SetupDiEnumDeviceInterfaces(hDevInfo, 
    												  NULL, 
    												  &guid, 
    												  dwIndex, 
    												  &spdid)); dwIndex++) 
        { 
            printf("Geraete-Index: %u\n\n", dwIndex); 
            dwSize = 0; 
    
            SetupDiGetDeviceInterfaceDetail(hDevInfo, 
    										&spdid, 
    										NULL, 
    										0, 
    										&dwSize, 
    										NULL); 
    
            if(dwSize) 
            { 
                if(NULL == (pspdidd = (PSP_DEVICE_INTERFACE_DETAIL_DATA)HeapAlloc(GetProcessHeap(), 
    																			  HEAP_ZERO_MEMORY, 
    																			  dwSize))) 
    				continue; 
    
                pspdidd->cbSize = sizeof(*pspdidd); 
    
                ZeroMemory((PVOID)&spdd, sizeof(spdd)); 
                spdd.cbSize = sizeof(spdd); 
    
                if(SetupDiGetDeviceInterfaceDetail(hDevInfo, 
    											   &spdid, 
    											   pspdidd, 
    											   dwSize, 
    											   &dwSize, 
    											   &spdd)) 
                { 
                    printf("Name fuer CreateFile(): %s\n\n", pspdidd->DevicePath); 
                    if(SetupDiGetDeviceRegistryProperty(hDevInfo, 
    													&spdd, 
    													SPDRP_FRIENDLYNAME, 
    													&dwType, 
    													(PBYTE)szProperty, 
    													sizeof(szProperty), 
    													NULL)) 
                    { 
                        if(dwType == REG_SZ) 
                        { 
                            printf("FriendlyName: %s\n\n", szProperty); 
    					} 
                    } 
                    if(SetupDiGetDeviceRegistryProperty(hDevInfo, 
    												    &spdd, 
    													SPDRP_DEVICEDESC, 
    													&dwType, 
    													(PBYTE)szProperty, 
    													sizeof(szProperty), 
    													NULL)) 
                    { 
                        if(dwType == REG_SZ) 
                        { 
                            printf("DeviceDescription: %s\n\n", szProperty); 
                        } } } 
                HeapFree(GetProcessHeap(), 0, pspdidd); 
           } } 
        SetupDiDestroyDeviceInfoList(hDevInfo); 
        return(TRUE); 
    }
    

    ähnliche Threads gibt's hier:
    http://www.c-plusplus.net/forum/viewtopic.php?t=54095&start=0
    http://www.c-plusplus.net/forum/viewtopic.php?t=14977&

    Du darfst aber nicht vergessen, in den Einstellungen

    setupapi.lib
    hid.lib
    

    mit zu verlinken.



  • Danke vorerst einmal!

    Das hilft mir schon einigermaßen weiter.

    Ein Problem das ich noch habe: Brauche ich das Win 2000 DDK?, denn da gibt es so viele include-Dateien die ich nicht habe (hidsdi.h,ntstatus,...usw.)

    mfG
    Firestormer



  • hidsdi.h is ausm ddk falls du die funktionen daraus zwingend brauchst, brauchst du wohl auch das ddk



  • Mahlzeit!
    Ja, das DDK brauchst Du. In dem Prog was ich Dir gepostet habe, sind schon Libs bzw. Header mit dabei. Leider will Microsoft Kohle dafür sehen, zwar nicht für das DDK selber, aber dafür satte 25$ Versandkosten.



  • hast du zufällig die url der bestellseite?



  • Danke!
    Bestelladresse fürs DDK:

    http://www.microsoft.com/whdc/ddk/winddk.mspx



  • Nicht schlagen *duck*
    Du könntest es ja mal bei der Tauschbörse deiner Wahl versuchen (weiß aber nicht ob das legal ist).



  • ich hab jetzt mal 2 jahre danach dieses skript verwendet und ... tadaaaa ... es geht. hab jetzt nur noch ne kurze frage:

    ich gebe die ergebnisse auch über ein printf aus (so wie im bsp), bekomm aber nur den ersten buchstaben des wortes zurück ... habe vc++ 2005. liegt wohl am wide char. Wie kann ich das trotzdem ausgeben ?

    grüße Nils



  • Nimm die UNICODE-Version von printf() - wprintf()

    (oder, wenn du sowohl mit ANSI als auch mit UNICODE zurechtkommen willst: _tprintf())



  • Hi,

    ich würde gerne die Funktion HidD_GetHidGuid benutzen. Doch leider bringt mir der linker folgenden Fehler:

    1>KBUSB.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""void __stdcall HidD_GetHidGuid(struct _GUID *)" (?HidD_GetHidGuid@@YGXPAU_GUID@@@Z)" in Funktion ""unsigned char __cdecl CreateListOfDevices(void)" (?CreateListOfDevices@@YAEXZ)".

    ich habe das header file hid.h eingebunden, die hid.lib bei den liberies unter einstellungen linker hinzugefügt und das verzeichnis wo diese liegt (ddk verzeichnis) bei zusätzliche Bibliotheksverzeichnisse eingefügt

    habe ich noch was vergessen?

    MfG



  • Hallo ich bin seit einiger Zeit drüber eine eigene USB-Firmware für
    einen AT90USB162 zu schreiben.

    Nach dem ich jetzt endlich das Gerät richtig in Windows als HID-Tastatur
    erkannt habe wollte ich nun die ersten Kommunikationsversuche mit dem
    Host starten. Dafür wollte ich mir eine kleine C Application schreiben und dabei bin ich auf den Thread hier gestoßen. Die Erkennung des Gerätes klappt soweit auch gut.

    Soweit so gut:
    Das Problem ist wenn ich HidP_GetCaps aufrufe stürtzt mein Programm
    jedesmal mit dem Fehler hidparse.sys konnte nicht gefunden werden.

    Jetzt ist die Datei aber im richtigen verzeichniss und auch vorhanden.
    Die richtigen Bibiliotheken müsste ich auch eingebunden haben sonst
    könnte ich es ja nicht compelieren.

    Jemand eine idee an was das liegen könnte

    hier mal der C-Code

    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <ddk/hidsdi.h>
    #include <ddk/hidpi.h>
    #include <ddk/hidusage.h>
    #include <setupapi.h>
    
    int main()
    {
        PSP_DEVICE_INTERFACE_DETAIL_DATA pspdidd;
        SP_DEVICE_INTERFACE_DATA         spdid;
        SP_DEVINFO_DATA                  spdd;
        HDEVINFO                         hDevInfo;
        DWORD                            dwIndex, dwSize, dwType;
        TCHAR                            szProperty[256];
        GUID                             guid;
        HANDLE                           DeviceHandle;
        HIDD_ATTRIBUTES                  Attributes;
        PHIDP_PREPARSED_DATA             PreparsedData;
        HIDP_CAPS                        Capabilities;
    
        ZeroMemory(&spdid, sizeof(spdid));
        spdid.cbSize = sizeof(spdid);
        HidD_GetHidGuid(&guid);
        hDevInfo = SetupDiGetClassDevs(&guid,NULL,NULL,DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
    
        if(hDevInfo == INVALID_HANDLE_VALUE)
        {
            printf("SetupDiGetClassDevs failed, Error %u\n", GetLastError());
            return(FALSE);
        }
    
        for(dwIndex = 0; (SetupDiEnumDeviceInterfaces(hDevInfo,NULL,&guid,dwIndex,&spdid)); dwIndex++)
        {
            printf("Geraete-Index: %u\n", dwIndex);
            dwSize = 0;
    
            SetupDiGetDeviceInterfaceDetail(hDevInfo,&spdid,NULL,0,&dwSize,NULL);
    
            if(dwSize)
            {
                if(NULL == (pspdidd = (PSP_DEVICE_INTERFACE_DETAIL_DATA)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwSize)))
                    continue;
    
                pspdidd->cbSize = sizeof(*pspdidd);
    
                ZeroMemory((PVOID)&spdd, sizeof(spdd));
                spdd.cbSize = sizeof(spdd);
    
                if(SetupDiGetDeviceInterfaceDetail(hDevInfo,&spdid,pspdidd,dwSize,&dwSize,&spdd))
                {
                    printf("Name fuer CreateFile(): %s\n", pspdidd->DevicePath);
    
                    if(SetupDiGetDeviceRegistryProperty(hDevInfo,&spdd,SPDRP_FRIENDLYNAME,&dwType,(PBYTE)szProperty,sizeof(szProperty),NULL))
                    {
                        if(dwType == REG_SZ)
                            printf("FriendlyName: %s\n", szProperty);
                    }
                    if(SetupDiGetDeviceRegistryProperty(hDevInfo,&spdd,SPDRP_DEVICEDESC,&dwType,(PBYTE)szProperty,sizeof(szProperty),NULL))
                    {
                        if(dwType == REG_SZ)
                            printf("DeviceDescription: %s\n\n", szProperty);
                    }
                }
                HeapFree(GetProcessHeap(), 0, pspdidd);
            }
            if((strstr(pspdidd->DevicePath, "hid#vid_03eb&pid_201c#6&1cdb5d6c&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}")) != NULL)
                break;
        }
        SetupDiDestroyDeviceInfoList(hDevInfo);
        DeviceHandle = CreateFile(pspdidd->DevicePath,GENERIC_READ,FILE_SHARE_READ,(LPSECURITY_ATTRIBUTES)NULL,OPEN_EXISTING,0,NULL);
        HidD_GetAttributes(DeviceHandle,&Attributes);
     //   printf("\nVendorID : %X",Attributes.VendorID);
     //   printf("\nProductID: %X",Attributes.ProductID);
     //   printf("\nVersion  : %X",Attributes.VersionNumber);
        HidD_GetPreparsedData(DeviceHandle,&PreparsedData);
        HidP_GetCaps(PreparsedData,&Capabilities);
    
        return(0);
    }
    

    gruß


Anmelden zum Antworten