www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32 USB Virtual Comport Read-Problem


Autor: Matthias K. (matthiask)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mit Hilfe der STM USB-FW Lib einen virtuellen COM-Port 
erstellt. Das senden vom µC zum PC/Terminalprogramm per USB klappt wie 
erwartet.

Beim senden vom PC kann ich die Zeichen zwar empfangen, aber nicht 
feststellen, wenn neue Zeichen anliegen. Also, ich drücke Taste X im 
Terminalprg., dann wird usb_read_byte = 1 und im usb_buffer[0] steht 
dann das 'X'. Wäre auch ok, aber beim nächsten Schleifendurchlauf ist 
usb_read_byte immer noch 1, obwohl am PC nichts mehr gesendet wurde.
While(1) {
  usb_read_byte = USB_SIL_Read(EP3_OUT, usb_buffer);
  if (usb_read_byte) {
    // Mind. 1 Byte empfangen
    sprintf(lcd.buffer,"Empfangen: %u",usb_read_byte);
    printf_tft(1,60,lcd.buffer);
    // Hier Buffer-Daten auswerten
    ....

    SetEPRxValid(ENDP3);
  } else {
    printf_tft(1,60,"Keine Daten empfangen");
  }
}

Habe mich weitgehend an das Bsp. der Artikelsammlung gehalten:
http://www.mikrocontroller.net/articles/STM32_USB-...

Read-Funktion wird dort allerdings nicht verwendet.

Ich dachte, der Aufruf von USB_SIL_Read setzt den Buffer automatisch 
zurück. Offenbar nicht der Fall. Wie handelt man das korrekt?

Autor: Markus Richter (flyingkenny)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Ich hab mich heute auch mit genau diesem Problem geplagt.
Ursache des ganze ist, dass der Buffer ja nicht mit "USB_SIL_Read()" 
geleert wird. Was auch Sin macht, da ja ein Interrupt ja bescheid gibt, 
wenn etwas empfangen wurde. Dies fängt in der usb_init.c -> CTR_LP() an. 
(warum der gerade dahin springt hab ich nicht gefunden) Jedenfalls geht 
es von dort mittels *pEpInt_OUT[] nach usb_istr.c-> "void 
(*pEpInt_OUT[7])(void)" zu den Programmadressen von b.B."void 
EP3_OUT_Callback(void)" , die in usb_endp.c stehen.
Das was in diesen Funktionen steht, wird bei jeden empfangenen 
Datenpaket, was nicht zur Steuerung der USB-Verbindung dient aufgerufen.

Hier ein Beispiel, basierend auf den STM32F10B_eval
es wird der empfangene Text als Antwort wieder zurück gesendet.
void EP3_OUT_Callback(void)
{  /*ließt die Daten aus dem Eingangspuffer undmerkt sich die Länge*/
  uint32_t DataLength = USB_SIL_Read(EP3_OUT, USB_Rx_Buffer);
  
  /*schreibt die Daten wieder*/
  USB_SIL_Write(EP1_IN,USB_Rx_Buffer , DataLength);
  
  /*Endpunkt für Übertragung freigeben*/
  SetEPTxValid(ENDP1);

  #ifndef STM32F10X_CL
     /* Enable the receive of data on EP3 */
      SetEPRxValid(ENDP3);
  #endif /* STM32F10X_CL */
}

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.