USB GenericHID mit LUFA -?Datenempfang verarbeiten??

Gast #1809638
Lesenswert?
• ▲
▼
Hallo

Ich arbeite an einem kleinen Projekt mit dem AT90USB162 das vom PC per 
USB-Verbindung einige Aufgaben/Daten geschickt bekommt und diese in den 
internen Flash speichern soll um spaeter ohne aktive USB verbindung die 
Daten zu verarbeiten. Als USB Stack verwende ich LUFA. Meinen bisherigen 
Programmcode habe ich schon mit LUFA ClassDriver Demo Code GenericHID 
(ClassDriver steht für die HighLevel Variante)zusammengeführt. Bis jetzt 
laesst sich auch alles ohne Fehler und Warnungen compilieren.

Meine Fragen:
1.Wie setzte ich den Datenempfang geschickt um? Mit Zugriffen auf den 
Flash habe ich schon gearbeitet. Die Speicherung selbst stellt also kein 
Problem dar.
2.Wie kann ich Daten senden? (z.B. Messergebnisse, ...)



Hier zwei Ausschnitt aus dem LUFA Demo Code:

1.Das Hauptprogramm (unveraendert)
1
int main(void)
2
{
3
  SetupHardware();
4
  
5
  LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
6
  sei();
7
  
8
  for (;;)
9
  {
10
    HID_Device_USBTask(&Generic_HID_Interface);
11
    USB_USBTask(); //ist das zur USB Funktionalitaet?
12
  }
13
}


2.Der Datenempfangstask: (unveraendert)
1
void HID_Device_USBTask(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo)
2
{
3
  if (USB_DeviceState != DEVICE_STATE_Configured)
4
    return;
5

6
  Endpoint_SelectEndpoint(HIDInterfaceInfo->Config.ReportINEndpointNumber);
7
  
8
  if (Endpoint_IsReadWriteAllowed())
9
  {
10
    uint8_t  ReportINData[HIDInterfaceInfo->Config.PrevReportINBufferSize];
11
    uint8_t  ReportID     = 0;
12
    uint16_t ReportINSize = 0; //Standardmaeßig = 8
13

14

15
/* diese Zeile hat etwas mit dem Datensenden zu tun. Soweit ich verstanden
16
habe, wird hier aber nur 0 in jedes Byte von ReportINData geschrieben.*/
17
    memset(ReportINData, 0, sizeof(ReportINData)); 
18

19

20
// Diese Zeile verstehe ich überhaupt nicht
21
    bool ForceSend         = CALLBACK_HID_Device_CreateHIDReport(HIDInterfaceInfo, &ReportID, REPORT_ITEM_TYPE_In, ReportINData, &ReportINSize);
22
// Das ist klar.
23
    bool StatesChanged     = false;
24
// Das verstehe ich auch nicht.
25
    bool IdlePeriodElapsed = (HIDInterfaceInfo->State.IdleCount && !(HIDInterfaceInfo->State.IdleMSRemaining));
26
    
27

28
/*wenn ich das richtig verstanden habe, dann wird hier überprüft, ob Daten
29
zum abholen bereit stehen. wenn ja, wird StatesChanged = 1 und die neuen
30
Daten werden in ReportINData geschrieben.*/
31
    if (HIDInterfaceInfo->Config.PrevReportINBuffer != NULL)
32
    {
33
      StatesChanged = (memcmp(ReportINData, HIDInterfaceInfo->Config.PrevReportINBuffer, ReportINSize) != 0);
34
      memcpy(HIDInterfaceInfo->Config.PrevReportINBuffer, ReportINData, HIDInterfaceInfo->Config.PrevReportINBufferSize);
35
    }
36

37

38
/*hier dürfte dann, wenn einmal daten empfangen wurden, immer wieder diese
39
Daten wieder zurück geschickt werden, bis Neue kommen. Dann werden die neuen gesendet*/
40
    if (ReportINSize && (ForceSend || StatesChanged || IdlePeriodElapsed))
41
    {
42
      HIDInterfaceInfo->State.IdleMSRemaining = HIDInterfaceInfo->State.IdleCount;
43

44
      Endpoint_SelectEndpoint(HIDInterfaceInfo->Config.ReportINEndpointNumber);
45

46
      if (ReportID)
47
        Endpoint_Write_Byte(ReportID);
48

49
      Endpoint_Write_Stream_LE(ReportINData, ReportINSize, NO_STREAM_CALLBACK);
50
      
51
      Endpoint_ClearIN();
52
    }
53
  }
54
}

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.