Forum: Mikrocontroller und Digitale Elektronik VCP unerkennbar STM32F4


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Lalo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Guten Tag,

Ich möchte das Protocol USB mit dem Board STM32F4 implementieren.

Hier mein Code:

uint8_t  Data[] = "0123456789qwertzuioP";

int main(void)
{

  HAL_Init();

  /* Configure the system clock to 180 MHz */
  SystemClock_Config();


  MX_GPIO_Init();

  /* Init Device Library */
  USBD_Init(&USBD_Device, &VCP_Desc, 0);

  /* Add Supported Class */
  USBD_RegisterClass(&USBD_Device, USBD_CDC_CLASS);

  /* Add CDC Interface Class */
  USBD_CDC_RegisterInterface(&USBD_Device, &USBD_CDC_fops);

  /* Start Device Process */
  USBD_Start(&USBD_Device);


  /* Run Application (Interrupt mode) */
  while (1)
  {

    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, 1);
    CDC_Transmit_FS(Data,strlen((const char*)Data));
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, 0);
    HAL_Delay(100);

  }
}



1) Mein Problem liegt daran, dass wenn ich mehr als 97 Zeichen in Data[] 
sende, ist mein VCP nicht mehr im Computer erkennbar.
Was kann es sein?

2) Wie könnte ich die Geschwindigkeit für das senden von einem Block 
messen?  Hättet ihr eine Idee?

Ich versuche mit einer I/O Pin die Dauer der Ausführung der Funktion 
CDC_Transmit_FS zu messen, aber hat das etwas mit der Geschwindigkeit 
der Übertragung etwas direkt zu tun?


Vielen Dank

von jo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
>Wie könnte ich die Geschwindigkeit für das senden von einem Block
>messen?  Hättet ihr eine Idee?

Moin. Freien pin als ausgang konfigurieren. pin auf high setzen. ZU 
messende aktion ausführen. pin auf low setzen. Mit Qszi / Frequenzzähler 
am freien Pin die ON Zeit messen.

>Mein Problem liegt daran, dass wenn ich mehr als 97 Zeichen in Data[]
>sende, ist mein VCP nicht mehr im Computer erkennbar.
>Was kann es sein?

Bufferoverflow auf pc seite.



Gruß J

von Lalo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
jo schrieb.
> Moin. Freien pin als ausgang konfigurieren. pin auf high setzen. ZU
> messende aktion ausführen. pin auf low setzen. Mit Qszi / Frequenzzähler
> am freien Pin die ON Zeit messen.


Auf diese Webseit
http://mikrocontroller.bplaced.net/wordpress/?page_id=1263

Sag er:

Bei einer Geschwindigkeitsmessung für das senden von einem Block von 
1024 Bytes vom PC zur CPU bin ich auf ca. 4ms gekommen, was ca. 
256kByte/sec entspricht (ca. 2Mbit/sec)

Wie könntet man das messen?

von jo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
>Wie könntet man das messen?

>>Moin. Freien pin als ausgang konfigurieren. pin auf high setzen. ZU
>>messende aktion ausführen. pin auf low setzen. Mit Qszi / Frequenzzähler
>>am freien Pin die ON Zeit messen.

So schwer?

von Lalo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich habe so das konfiguriert:

  while (1)
  {

    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, 1);
    CDC_Transmit_FS(Data,strlen((const char*)Data));
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, 0);
    HAL_Delay(100);

  }


Ist das denn meiner Geschwindigkeitsmessung ?

von W.S. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Lalo schrieb:
> CDC_Transmit_FS(Data,strlen((const char*)Data));

Lalo schrieb:
> Mein Problem liegt daran, dass wenn ich mehr als 97 Zeichen in Data[]
> sende, ist mein VCP nicht mehr im Computer erkennbar.
> Was kann es sein?


Was das sein kann?
Nun, du hast dich weder mit dem Procedere als solchem noch mit der 
tatsächlichen Funktionalität des Treibercodes befaßt, den du da 
eingebunden hast.

Ich bin da recht mißtrauisch gegenüber sowas. Meist ist es so, daß in 
solchen grandiosen Treibern grundsätzlich nur blockweise agiert wird und 
gerade bei einem CDC ist das extrem kontraproduktiv, denn es fehlt 
komplett die Funktionalität des Zwischenspeicherns und somit des 
Pufferns eines asynchron funktionierenden Datenstromes.

In dem von dir beschriebenen Fall vermute ich, daß das Gerät sehr wohl 
erkannt wird, aber das Senden seitens des Gerätes zum Host hin wird 
entweder schon vor oder spätestens nach dem Abschluß des ersten 
Nutz-Paketes zum Host hin nicht gemerkt, daß man für neue Daten einen 
der Transfer-Puffer sendebereit machen müßte. Das ist so ähnlich wie bei 
manchen UART-Cores, die einen Interrupt nur dann liefern, wenn der 
TX-Puffer leer geworden ist, aber nicht, wenn er bereits leer ist.

Ich hatte in meinem VCP-Code den 1 ms Tick vom USB dazu benutzt, um 
sowas zu testen und in solchen Fällen den Sende-Transfer wieder 
anzuwerfen, falls er zuvor zum Stillstand gekommen war und jetzt neue 
Daten anliegen.

W.S.

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]
  • [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.