Hallo! Ist es möglich, mit V-USB ein USB-HID zu programmieren, dem der Computer mehrere unterschiedlich große Datenpakete schicken kann? Mit dem hid-data-Beispiel aus dem V-USB-Paket kann man ja nur n Bytes (im Beispiel 128) an den µC senden und n Bytes vom µC empfangen. Ich bräuchte aber eine Möglichkeit, 16 Bytes an den µC zu senden, 1 Byte an den µC zu senden und 3 Bytes vom µC zu empfangen. Hat irgendjemand dafür einen funktionierenden Beispiel-Quelltext oder eine genaue Anleitung, was ich in den HID-Report-Descriptor schreiben und wie ich die Daten senden/empfangen muss?
Wenn Du Zeit hast, setz den Puffer auf 1Byte und sende und empfange jedes Byte einzeln. Oder, so hab ich es gemacht, fülle einfach den Puffer auf beiden Seiten auf. Kannst den Puffer trotz dem kleiner machen...
1Byte zum µC hin? Entweder du Implementierst ein billiges Protokoll dahinter, also dass du immer 16Bytes zum µC schickst(Ein bit zur Unterscheidung wirst du noch finden). Das benötigt natürlich auf Rechnerseite einen Treiber. Zweite Möglichkeit wäre, 2 Endpoints auf dem µC zu haben. V-USB kann das, soweit ich das verstanden habe. Übrigens: es gibt eine "minimum transfer unit". Die ist Länger als deine 16Bytes - das Protokoll wäre vllt eine einfachere Lösung, zumal man sich nicht auch noch einen Treiber selber schreiben muss. Schau dir auch mal den virtuellen Com-Port von dem Japaner hier an: http://www.recursion.jp/avrcdc/cdc-232.html Vielleicht lässt sich der für deine Zwecke ummünzen und du kannst ohne eigens geschriebenen Treiber arbeiten. Damit deine Software nur mit deinem USB-Gerät zusammen arbeitet und nicht mit irgendeinem anderen: Falls du das nicht willst, implementiere noch einen "@WHO" Befehl, wie beim CDC-IO auf der selben Webseite. Der kann noch um Hin- und Rücksendung eines verschlüsselten Strings erweitert werden. mfg mf
Mini Float schrieb: > Entweder du Implementierst ein billiges Protokoll dahinter, also dass du > immer 16Bytes zum µC schickst(Ein bit zur Unterscheidung wirst du noch > finden). Das benötigt natürlich auf Rechnerseite einen Treiber. So hab ich's bisher immer gemacht: 17 Bytes schicken und anhand vom Byte feststellen, was für Daten die restlichen 16 Bytes enthalten. Einen Treiber hab ich dafür aber nicht gebraucht, weil Windows einen Standardtreiber für HIDs hat und ich in Delphi (meine Programmiersprache für Windows-Anwendungen) über eine Komponente zumindest Feature-Reports direkt senden kann. Was ich hauptsächlich vermeiden wollte ist, dass ich z.B. alle paar Millisekunden 17 Byte übertragen müsste, nur um einen Taster zu pollen. Aber das... > es gibt eine "minimum transfer unit". Die ist Länger als deine 16Bytes ...hieße ja, dass sowieso mehr als 16B übertragen werden, auch wenn ich die Reportlänge auf 1B setze? Nachtrag: Ich weiß, dass es auch Input- und Output-Reports gibt, mit denen ich mir das Gemurkse mit Feature-Reports, Polling etc. sparen könnte, aber ich habe noch keine einfache Möglichkeit gefunden, In- und Output-Reports mit einem eigenen Programm zu nutzen. Jetzt, wo ich mehrere Report-IDs verwenden möchte, sollte ich wohl mal in die Richtung recherchieren.
Nils schrieb: > ...hieße ja, dass sowieso mehr als 16B übertragen werden, auch wenn ich > die Reportlänge auf 1B setze? Mal ne ganz doofe Frage: Wie ändere ich denn die Reportlänge? Ich kriege immer nur 128 Bytes gesendet und empfangen. Eigentlich sogar nur 127, denn in dem Paket mit 129 Bytes ist nicht nur das erste, sondern auch das letzte Byte stets eine 0. Das funktioniert zwar wunderbar, aber es gibt viel Overhead, weil ich gar keine 128 Bytes im Transfer brauche. Ich habe in den (nicht gerade sehr einfach zu verstehenden) Firmware-Sourcen rumgesucht wie ein Blöder, aber keine Stelle gefunden, wo man die Reportlänge einstellen könnte. Ich benutze übrigens das "hid-data" Beispiel aus dem V-USB Paket vom 15.07.2010. Gruß, Volker
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.