STM32 USB Virtual Comport Read-Problem

OP #1950716
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.
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?
#2279948
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.
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren