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


von Matthias K. (matthiask)


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?

von Markus R. (flyingkenny)


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
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.