USB-Port ansprechen



  • -King- schrieb:

    Und eignet sich auch nicht für USB, sondern nur für LPT und COM.

    Sorry, hatte mir das Programm nicht so genau angeschaut (nur mit dem COM-Port hatte ich es mal getestet) 🙄



  • Hallo Leute!
    Ich habe einfach mal hier weitergeschrieben.
    Mittlerweile bin ich in meinem Praktikum ein ganzes Stück weitergekommen, habe jetzt aber ein neues Problem:
    Letztendlich will ich mit einer SPS (speicherprogrammierbaren Steuerung) arbeiten und sie steuern, da das Programm der Herstellerfirma zu teuer ist.
    Zur Kommunikation mit dem PC dient ein USB/PPI-Adapterkabel(USB ähnliches Protokoll), was sich unter

    Eingabegeräte(HID)-->USB-HID(HID) im Gerätemanager anmeldet.
    So spreche ich es an:

    HANDLE hTreiber = INVALID_HANDLE VALUE;
    int main()
    {
        hTreiber = CreateFile("\\\\.\\USB#Vid_0909_&Pid_0200#5&dfa6a2&0&!#{a5dcbf10-6530--11d2-901f-00c04fb951ed}",
        GENERIC_READ | GENERIC_WRITE,
        0,
        NULL,
        OPEN_EXISTING,
        0,
        NULL)
    
        if (hTreiber == INVALID_HANDLE_VALUE)
        {
             printf("Verbindung zum USB-Port konnte nicht hergestellt werden!\nError:\n", GetLastError());
             CloseHandle(hTreiber);
             return 0;
        }
        else
        {
         .
         .
         .
        }
    }
    

    Mit dem Prog WinObj, hier aus dem Forum, habe ich den SymbolicLink herausbekommen, nicht wundern, ist das gleiche wie "\\\.\\LPT1" zum Beispiel.

    Mein Problem ist, ich kann so auf jedes andere Gerät draufzugreifen(z.B. mit meinem USB-Stick funkionierts).
    Bei GetLastError() bringt er mir: Error: 6.
    Meine Vermutung, es könnte vielleicht an der Baudrate
    (PPI 9,6;19,2;187,5 kBitps) liegen, oder dass sich der Adapter als HID anmeldet.
    Hat jemand 'ne Ahnung?



  • baschti schrieb:

    Meine Vermutung, es könnte vielleicht an der Baudrate
    (PPI 9,6;19,2;187,5 kBitps) liegen, oder dass sich der Adapter als HID anmeldet.

    Eher letzteres. Das ist doch aber überaus erfreulich. Was besseres als ein HID kann Dir doch gar nicht passieren. Du kannst die Namen einfachst Enumerieren, brauchst den Namen von WinObj nicht fest zu codieren (sicher, man kann auch die Ports selbst enumerieren, nur lange nicht so einfach). Die Daten werden weiterhin per ReadFile/ WriteFile übertagen. Das Format kannst Du durch einfaches Parsen der Reports herausbekommen.



  • Hallo King!
    Danke für Deine Antwort. Hört sich gut an, könntest mir trotzdem bitte 'n bissl Code posten bzw. sagen worauf ich achten muß und wo ich Hilfe finde? Bin noch immer kein Profi in der harwarenahe Programmierung. Bis jetzt habe ich aber ganz gut durchgesehen.
    Thx 🙂



  • Mir ist übrigens gerade aufgefallen, daß der Name nicht stimmen kan:

    6530--11d2
    

    Da ist ein '-' zuviel.

    Und Code? Hier findest Du jedenfalls schonmal was zum Thema Enumerieren:
    http://www.c-plusplus.net/forum/viewtopic.php?t=14977&

    In diesem Beispiel wird das SetupApi verwendet. Du mußt natürlich noch den GUID anpassen. Den HID-GUID bekommst Du von HidD_GetHidGuid.

    Zum Parsen der Report-Descriptoren stehen Dir dann einige andere Funktionen zur Verfügung.



  • Prima, danke. Werde mich gleichmal dahinter klemmen.
    Sorry war'n Schreibfehler von mir.

    6530--11d2
    

    sollte eigentlich

    6530-11d2
    

    heißen.



  • hiii

    wie schauts auf...hattest du schon erfolg das usb port anzusprechen???

    mfg surf.



  • Da geh ich mal von aus, daß er das hinbekommen hat. So schwierig ist es dann nun auch wieder nicht. Sag doch einfach, was Du wissen willst. Dann kan man gezielte Hinweise geben.



  • hi! ich wollte fragen ob du da ein tu über usb und ansteuerung mit winapi hast?
    ich will mich mal da in das thema einlesen.....will so eine camera über usb mit c++ also winapi ansteuern....

    mfg surf.



  • Nein, ich kenne kein tu. Aber was ist denn das für eine Kamera? Was kannst Du denn da alles Steuern? Und warum willst Du mit aller Gewalt direkt mit der Kamera sprechen?



  • hab so ein benzinauto (vielleicht hast du den film 2 fast 2 furious gesehen;-)
    ...ich hab folgende verbindungen:
    - Sender: über einen 433 mhz transceiver will ich das auto lenken können
    - Empfänger: über usb fahr ich zu einem video reseiver...der die bilder empfängt.....da usb schnell ist....will ich dann die bilder auf dem notebook visualisieren....

    dazu will ich mich da zuerst mal bissi mit usb und ansteuerung mit c++ auskennen....
    bin über jede hilfe dankbar...

    mfg surf.



  • http://www.bcb-box.de/fstart.htm

    hab da was gefunden;-)
    wie wäre es wenn jemand mal ein tu machen würde...? mir kommt e vor das das relativ oft gefragt wird...

    mfg surf.



  • Die einfachste Möglichkeit zum Darstellen von Bildern ist Video for Windows. Da zauberst Du Dir in 3 Zeilen Quell das Bild auf den Schirm. Wenn Du noch mehr Kontrolle benötigst, solltest Du Dir DirectShow ansehen. Bei beiden Möglicjkeiten mußt Du über USB nichts wissen.

    Mit den Informationen aus dem von Dir geposteten Link kannst Du in Deinem Fall gar nichts anfangen. Der Cypress-Controller ist ein LowSpeed Device, das ist für Video-Daten zu wenig.



  • hi aber möchte das gerne selber proggen die ansteuerung...damit ich mich dann auch gut mit usb auskenne.....
    hast du schon mal mit usb und c++ was gemacht?

    cu



  • surf. schrieb:

    hi aber möchte das gerne selber proggen die ansteuerung...damit ich mich dann auch gut mit usb auskenne.....

    Na klar. Das machst Du am Besten mit dem CY7C63001. Der digitalisiert das Video-Signal mal eben so 'on the fly'. Das Komprimieren macht er dann sowieso im Schlaf, schliesslich arbeitet er intern mit satten 12MHz. Das Video-RAM bekommst Du auch prima an die 20Pins angeschlossen. Über den sage und schreibe 8 Bytes umfassenden FIFO übertragen sich die Daten ruckzuck an den PC. 25 Bilder/ Sekunde sind keine Hexerei.

    So, und dann schreibst Du schnell noch den passenden Treiber und alles wird gut. Hallo?

    hast du schon mal mit usb und c++ was gemacht?

    Ja, habe ich. Für Video verwende ich aber handelsübliche Hardware und zum Zugriff darauf die üblichen Schnittstellen.

    Kauf Dir lieber ein ordentliches Buch!



  • Hallo!
    Allen noch'n gesundes neues Jahr.
    Da bin ich mal wieder, mittlerweile auch ein ganzes Stück weiter.
    Meinen USB/PPI-Adapter habe ich dazu bekommen, mir zu sagen was für ein Gerät er ist und dass er mit mir spricht (auf An- und Abstecken meldet er mir, dass er da ist oder nicht). Daten könnte ich auch empfangen, bloß habe ich das Problem, dass ich nicht weiß, wie ich das Datengeschäft (PC/SPS) initialisieren soll. Ich empfange zwar etwas, aber fast immer das gleiche, was nicht sein kann. Die SPS muss dazu mit dem Adapter und dem PC verbunden sein (logo 🙄 ). Im Herstellerprogramm brauche ich dann nur auf beobachten klicken und das Geschäft zwischen SPS und PC wird initialisiert (ich kann die jeweiligen Veränderungen der Programmvariablen beobachten). Außerdem habe ich mitbekommen, dass das USB-Protokoll auf das PPI-Protokoll oben aufgesetzt wird, der Adapter regelt den Rest.
    Wer hat eine Idee, wie ich das Geschäft zum laufen bekomme?



  • Moin!

    Mit wem oder was unterhälst Du Dich denn jetzt? Ist es das HID? Wenn ja, dann ist es normal, daß Du immer die gleichen Daten bekommst.

    Der Host pollt Deine Geräte in regelmäßigen Abständen. Wie oft das passiert, steht in den Descriptoren der Endpoints. Wenn ich mir jetzt an Deiner SPS einfach mal 8 digitale IOs vorstelle, wird in Deinem Input-Report auch ein Byte vorhanden sein, das den logic level repräsentiert. Und wenn sich da nichts ändert, bekommst Du immer wieder die gleichen Daten vom Gerät zurück. Das sieht man auch bei einem Joystick sehr schön: Du bekommst immer wieder die gleichen Koordinaten geliefert. Es ändert sich in den Daten erst dann etwas, wenn Du den Knüppel bewegst oder Knöpfe drückst.

    Man kann natürlich auch einen SET_IDLE Request mit 0 für Duration an das Gerät senden. Dann antwortet das Gerät nur noch dann, wenn sich auch die Daten geändert haben. Dazu muß das Gerät diesen Request natürlich auch bearbeiten. Wie man diesen Request im User-Mode an das Gerät sendet, weiß ich auch nicht. Und im Kernel Mode bin nun auch nicht gerade heimisch ...

    Als Abhilfe könntest Du in einem Timer mit ReadFile das Gerät befragen. Das Ergebnis vergleichst Du nun mit dem Ergebnis der vorherigen Abfrage. Hat sich etwas geändert, kannst Du entsrechend verfahren.

    Ich gebe aber noch zu bedenken, daß ich SPSen allenfalls vom Hörensagen kenne. Ich hoffe trotzdem, daß Du mit den Ausführungen etwas anfangen kannst.

    BTW: Klappt das nun mit dem Enumerieren, oder holst Du noch immer den Namen mit WinObj?



  • Ich unterhalte mich mit dem Adapter als HID. Da wird mir jetzt klar, warum ich immer das Gleiche empfange. Die Idee mit dem Timer hatte ich auch schon, dadurch ist mir das erst aufgefallen.

    Das Enumerieren klappt wunderbar. Ich habe festgestellt, dass meine Adresse falsch gewesen ist und ich immer ein ungültiges Handle zurückbekommen habe.

    Der GUID ist für HIDs immer gleich (meine Maus hat den gleichen wie der Adapter, habe ich, glaube ich jedenfalls, irgendwo in der MSDN gelesen).Die Adressierung unterscheidet sich dann nur noch von der VendorID, ProductID und dem jeweiligen Port.

    Ich werde mal versuchen was aus Deinem Tip zu machen.
    Danke erstmal. 🙂



  • baschti schrieb:

    Der GUID ist für HIDs immer gleich (meine Maus hat den gleichen wie der Adapter, habe ich, glaube ich jedenfalls, irgendwo in der MSDN gelesen).Die Adressierung unterscheidet sich dann nur noch von der VendorID, ProductID und dem jeweiligen Port.

    Ist das jetzt eine Frage oder eine Feststellung? Aber ja, der GUID ist immer gleich. Es handelt sich auch immer um die gleiche Geräteklasse.

    Und ja, Mäuse sind auch HIDs, ebenso wie Joysticks und Tastaturen. Allerdings folgen diese einem speziellen Protokol (festgelegt über den Device Descriptor).



  • Morgen!
    Wer immer schon mal wissen wollte, was auf seinen USB-Ports los ist, kann sich hier (www.lvr.com (-->ziemlich weit unten, unter protocol analyzers)):
    den HHD USB Monitor

    als Demoversion von HHD Software runterladen. Das ist ein software-only tool. Dieses Tool ist ein Filtertreiber, der sich zwischen host controller und Gerätetreiber installiert. Die Software lässt dann den Datenstrom an sich vorbeilaufen und dokumentiert diesen mit. Ihr habt 30 Tage oder 100 Versuche zum testen.

    Daher habe ich auch den Hex-Code, den ich eigentlich meiner SPS senden wollte, aber irgendetwas geht an meinem Prog noch nicht 😕 . Kann mir bitte jemand sagen, was daran falsch ist?

    Code für eine Statusanforderung:

    10 00 00 49 49 16
    

    Das ist mein Prog in der kurzen Version (nur eine einmalige Anforderung als Consolen-Anwendung):

    //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;	
    
    	SetLastError(0);
    
    	//USB Schnittstelle konfigurieren
    	hTreiber = CreateFile("\\\\.\\hid#vid_0908&pid_0200#6&1d2d6ffa&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;	
    }
    

    Danke, für Eure Hilfe. 🙂


Anmelden zum Antworten