STM32 USB Virtual Comport Read-Problem

OP #1950716
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.
1
While(1) {
2
  usb_read_byte = USB_SIL_Read(EP3_OUT, usb_buffer);
3
  if (usb_read_byte) {
4
    // Mind. 1 Byte empfangen
5
    sprintf(lcd.buffer,"Empfangen: %u",usb_read_byte);
6
    printf_tft(1,60,lcd.buffer);
7
    // Hier Buffer-Daten auswerten
8
    ....
9

10
    SetEPRxValid(ENDP3);
11
  } else {
12
    printf_tft(1,60,"Keine Daten empfangen");
13
  }
14
}

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

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?
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.
1
void EP3_OUT_Callback(void)
2
{  /*ließt die Daten aus dem Eingangspuffer undmerkt sich die Länge*/
3
  uint32_t DataLength = USB_SIL_Read(EP3_OUT, USB_Rx_Buffer);
4
  
5
  /*schreibt die Daten wieder*/
6
  USB_SIL_Write(EP1_IN,USB_Rx_Buffer , DataLength);
7
  
8
  /*Endpunkt für Übertragung freigeben*/
9
  SetEPTxValid(ENDP1);
10

11
  #ifndef STM32F10X_CL
12
     /* Enable the receive of data on EP3 */
13
      SetEPRxValid(ENDP3);
14
  #endif /* STM32F10X_CL */
15
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.