mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega8 + V-USB-HID: Mehrere Feature-Reports mit verschiedenen Report-IDs


Autor: Nils ‫‪ (n-regen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Nils ‫‪ (n-regen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schubs

Autor: hp-freund (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: Joachim K. (minifloat)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Nils ‫‪ (n-regen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Volker U. (volkeru)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.