Forum: Mikrocontroller und Digitale Elektronik STM32 VCP receive


von STM32-Entwickler (Gast)


Lesenswert?

Hallo zusammen,

Ich habe VCP für USB-FS initialisiert und es funktioniert, wie kann ich 
Nachrichten die vom PC geschickt werden an STM32 empfangen?

int main(void)
{
  __IO uint32_t i = 0;

  /*!< At this stage the microcontroller clock setting is already 
configured,
  this is done through SystemInit() function which is called from 
startup
  file (startup_stm32fxxx_xx.s) before to branch to application main.
  To reconfigure the default setting of SystemInit() function, refer to
  system_stm32fxxx.c file
  */

  USBD_Init(&USB_OTG_dev,
#ifdef USE_USB_OTG_HS
            USB_OTG_HS_CORE_ID,
#else
            USB_OTG_FS_CORE_ID,
#endif
            &USR_desc,
            &USBD_CDC_cb,
            &USR_cb);

  /* Main loop */
  while (1)
  {
    if (i++ == 0x100000)
    {
      STM_EVAL_LEDToggle(LED1);
      STM_EVAL_LEDToggle(LED2);
      STM_EVAL_LEDToggle(LED3);
      STM_EVAL_LEDToggle(LED4);
      i = 0;
    }
  }
}

von STM32-Entwickler (Gast)


Lesenswert?

Kennst sich denn Niemand aus?

von STM32-Entwickler (Gast)


Lesenswert?

Bitte lesen ob Jemand mir hier weiterhelfen kann.

von Walleby (Gast)


Lesenswert?

Hi,

ich arbeite mich grade auch in das selbe Thema ein mit dem Beispiel was 
du benutzt. Soweit ich das verstanden habe, wird dabei eine USB-to-UART 
Verbindung eingesetzt. Also musst du per UART die Informationen von 
deinem Rechner auf den Chip schieben. In der Initialisierung wird dabei 
der UART1 (PD5 und 6) verwendet.

Walleby

von Andreas W. (geier99)


Lesenswert?

STM32-Entwickler schrieb im Beitrag #3050833:
> Kennst sich denn Niemand aus?

  * - usbd_cdc_DataOut   , hier werden die Daten vom USB empfangen
  * - und hier verarbeitet : VCP_DataRx

von STM32-Entwickler (Gast)


Lesenswert?

Zuesrt danke für eure Antworten.

Mit der Funktion VCP_DataRx werden die Daten an UART(PC) geschickt, der 
Name sagt zwar VCP_DataRX aber die Funktion sendet die Daten.

Empfangen werden die Daten durch die Interruptfunktion 
EVAL_COM_IRQHandler, die Daten werden durch die Funktion VCP_DataTx von 
COM1 empfangen und in den APP_Rx_Buffer geschrieben.

Das Problem ist, wie kann man Daten mit VCP vom PC schicken und an uC 
empfangen?

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Wenn Du dieses Programm im STM32 drin hast und Du dann das Board mit USB 
am PC verbindest, dann möchte der PC einen Gerätetreiber installieren, 
in dem Fall einen Virtuellen COM Port Treiber (gibt es irgendwo bei ST).
Wenn das geschehen ist, so sieht man im Gerätemanager einen neuen COM 
Port und mittels Hyperterminal kann man sich damit verbinden und was 
tippen und das kommt beim STM32 an. Bzw. wenn der STM32 was schickt, 
dann sieht man das auf dem Hyperterminal.

von STM32-Entwickler (Gast)


Lesenswert?

Das habe ich doch zuerst getan daß VPC überhaupt am PC funktioniert.
Das ist auch nicht das Thema, sondern wie kann man Daten mit VCP vom PC 
schicken und an uC empfangen?

von hunz (Gast)


Lesenswert?

Hallo,

ich hab vor ner weile auch mal VCP auf STM32 gemacht und den code hier: 
https://github.com/znuh/STM32_VCP und da: 
https://github.com/znuh/STM32_IR_ACM abgelegt.
Ersteres macht VCP mit loopback mode, zweiteres verbindet den VCP mit 
dem realen UART und aktiviert da IR-mode.
Der interessante Teil ist 
https://github.com/znuh/STM32_VCP/blob/master/usb_endp.c - 
EP1_IN_Callback überträgt VCP-Daten vom µC zum PC, EP3_OUT_Callback 
empfängt die VCP-Daten vom PC.
Vielleicht hilft das ja.

VG,

hunz

von STM32-Entwickler (Gast)


Lesenswert?

Hallo,

Danke für die gute Antwort.
Ich werde deine Links untersuchen, hoffentlich komme ich zu einem 
Ergebnis.

von Andreas W. (geier99)


Lesenswert?

STM32-Entwickler schrieb im Beitrag #3052000:
> Zuesrt danke für eure Antworten.
>
> Mit der Funktion VCP_DataRx werden die Daten an UART(PC) geschickt, der
> Name sagt zwar VCP_DataRX aber die Funktion sendet die Daten.

ja genau, und zwar die Daten die per USB empfangen wurden, werden hier 
per UART wieder gesendet.

Da ich mich auch erst seit letzter Woche mit dieser Thematik befasse, 
habe ich dann in dieser Funktion das Senden per UART unterbunden und 
stattdessen meinen eigenen USB Empfangsbuffer gefüllt um die 
LAWICEL-Protokolldaten die vom PC via VCP gesendet werden entgegen zu 
nehmen und dann als CAN Botschaften rauszuschicken.

Bist jetzt funktioniert das ganze prima :-)
(auch mit 500 kBit/s und hoher Buslast)

Jetzt haut mich aber bitte nicht für diese Lösung :-)
Das war für mich erst mal der schnellste und einfachste Weg, um Daten 
vom PC entgegen zu nehmen.

Somit konnte ich das Demo-Projekt:
STM32_USB-Host-Device_Lib_V2.1.0\Project\USB_Device_Examples\VCP\

einfach  für meine Zwecke zu missbrauchen.

Gruß
 Andi
PS: und mit DCD_EP_Tx(...)  sende ich dann die CAN-Daten via USB wieder 
an den PC zurück

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.