USB Problem



  • Hallo Leute,
    Hallo USB – Kenner,
    ich habe ein USB Gerät zur Signalerzeugung, an welches ich gerne für Versuchszwecke Daten versenden möchte. Leider ist das Gerät schon ein bisschen älter so dass UVCview lediglich „This is an Interface Class Defined Device“ zurückgibt. Nach längerer Recherche im Netz habe ich auf der Basis von Beispielcode zum Thema folgenden experimentellen Code zusammengestellt:

    #pragma comment(lib, "setupapi.lib");
    #include "stdafx.h"
    #include <stdio.h>
    #include <windows.h>
    #include <memory.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <String>
    #include "setupapi.h"
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        HDEVINFO hDevInfo;
        SP_DEVINFO_DATA DeviceInfoData;
        SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
     	_GUID GUID = { 0xA5DCBF10L, 0x6530, 0x11D2, { 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9,0x51, 0xED}};
    
        DWORD i;
        DWORD InterfaceNumber= 0;
        hDevInfo = SetupDiGetClassDevs(&GUID,
            0, // Enumerator
            0,
            DIGCF_PRESENT | DIGCF_INTERFACEDEVICE );
    
        if (hDevInfo == INVALID_HANDLE_VALUE)
        {
            return 1;
        }
        DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
        for (i=0;SetupDiEnumDeviceInfo(hDevInfo,i,
            &DeviceInfoData);i++)
        {
    		DWORD DataT;
            LPTSTR buffer = NULL;
            DWORD buffersize = 0;
    		while (!SetupDiGetDeviceRegistryProperty(
                hDevInfo,
                &DeviceInfoData,
                SPDRP_DEVICEDESC,
                &DataT,
                (PBYTE)buffer,
                buffersize,
                &buffersize))
            {
                if (GetLastError() ==
                    ERROR_INSUFFICIENT_BUFFER)
                {
                    if (buffer) LocalFree(buffer);
                    buffer = (LPTSTR)LocalAlloc(LPTR,buffersize);
                }
                else
                {
                    break;
                }
            }
            _tprintf(TEXT("Device Number %i is: %s\n"),i, buffer);
            if (buffer) LocalFree(buffer);
        }
    
    	printf("\n\n\n");
    	//CONNECT to DEVICE 1 *************************************************
    	i = 1;
    	//********************************************************************
    
    	if(!SetupDiEnumDeviceInfo(hDevInfo,i,&DeviceInfoData)) printf("INFO Fehlschlag\n");
    	else {
    		DWORD DataT;
            LPTSTR buffer = NULL;
            DWORD buffersize = 0;
    
    		while (!SetupDiGetDeviceRegistryProperty(hDevInfo,&DeviceInfoData,SPDRP_DEVICEDESC,&DataT,(PBYTE)buffer,buffersize,&buffersize)) {
                if (GetLastError() ==
                    ERROR_INSUFFICIENT_BUFFER)
                {
                    if (buffer) LocalFree(buffer);
                    buffer = (LPTSTR)LocalAlloc(LPTR,buffersize);
                }
                else
                {
                    break;
                }
            }
            _tprintf(TEXT("Device Number %i is: %s\n"),i, buffer);
    	}
    
        if ( GetLastError()!=NO_ERROR &&
             GetLastError()!=ERROR_NO_MORE_ITEMS )
        {
            return false;
        }
    
        DeviceInterfaceData.cbSize = sizeof(DeviceInterfaceData);
        if (SetupDiEnumDeviceInterfaces(
            hDevInfo,
            NULL,
            &GUID,
            i,
            &DeviceInterfaceData))
    
            printf("\nGot interface");
        else
        {
            printf("\nNo interface");
            if ( GetLastError() == ERROR_NO_MORE_ITEMS) printf(", since there are no more items found.");
            else printf(", unknown reason.");
        }
    
    	// Aufruf, um RequiredSize zu ermitteln
    	DWORD RequiredSize = 0;         	
    	SetupDiGetDeviceInterfaceDetail(hDevInfo,&DeviceInterfaceData,0,0,&RequiredSize,0);
    	printf("Size for DetailData is:: %d \n",RequiredSize);
    
    	PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(LPTR,RequiredSize);
        DeviceInterfaceDetailData->cbSize = sizeof(*DeviceInterfaceDetailData);
    
    	if (!SetupDiGetDeviceInterfaceDetail(hDevInfo, &DeviceInterfaceData, DeviceInterfaceDetailData,RequiredSize,&RequiredSize,NULL)) { 
    			printf("Fehler SetupDiGetDeviceInterfaceDetail: %d \n",GetLastError()); 
    
    		} else {
    			printf("DETAILDATEN liegen vor; ERZEUGE USB Handle \n");
    			     HANDLE UsbHandle = CreateFile(DeviceInterfaceDetailData->DevicePath,
                                             GENERIC_READ | GENERIC_WRITE, 
                                            FILE_SHARE_READ | FILE_SHARE_WRITE, 
                                            NULL, 
                                            OPEN_EXISTING, 
                                            FILE_ATTRIBUTE_NORMAL , 
                                            NULL); 
    				 printf("USB_HANDLE is: %d \n", UsbHandle);
                if (UsbHandle == INVALID_HANDLE_VALUE)  printf("Invalid Handle Value. \n"); 	
    
    		    	byte DataBuffer1[] = {0xc0,0x42,0x00,0x00,0x00,0x00,0x01,0x00};
    			    DWORD dwBytesToWrite1 = 8;
    				DWORD dwBytesWritten1 = 0;
    				if(!WriteFile( 
                        UsbHandle,           // open file handle
                        DataBuffer1,      // start of data to write
                        dwBytesToWrite1,  // number of bytes to write
                        &dwBytesWritten1, // number of bytes that were written
    					NULL)) printf("Error: %d\n",GetLastError());           
    		}
    
    		getchar();
            SetupDiDestroyDeviceInfoList(hDevInfo);
    	return true;
    }
    

    Das USB Gerät wird gefunden und es wird auch ein UsbHandle zugewiesen. Leider liefert die Funktion writefile den Fehlercode 1: ERROR_INVALID_FUNCTION.
    Gibt es vielleicht eine alternative Vorgehensweise, die zum Ziel führt ?

    MfG



  • Eine Alternative wäre die WinUSB Schnittstelle

    How to Access a USB Device by Using WinUSB Functions (Windows Drivers)

    http://msdn.microsoft.com/en-us/library/windows/hardware/ff540174(v=vs.85).aspx



  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten