mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32: Virtual Serialport liefert Daten mehrfach


Autor: Thomas Burkhart (escamoteur)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich versuche einen Virtual Serial Port mit dem STM32-USB zum Laufen zu 
bringen.

Von µC zum PC Daten übertragen ist überhaupt kein Problem.

In der anderen Richtung empfängt der µC aber zeichen die ich im 
Terminalprogramm eingebe doppelt bis 5 fach.

Ich habe das von ST-Mitgelieferte Beispiel etwas angepasst. Es sollen 
einfach Zeichen vom PC gelesen werden bis ein CR gesendet wird, dann 
sollen die bis dahin empfangenen Daten wieder an den PC zurückgeschickt 
werden.

Statt "123456789" bekomme ich aber z.B. "11112233456678899" zurück.

Habt Ihr ne Idee? Stehe gerade auf dem Schlauch

count_out : die Anzahl über USB empfange Zeichen in buffer_out.
  uint8_t buffer[128];
  uint8_t SendBuffer[128];

int main(void)
{
  
  Set_System();
  Set_USBClock();
  USB_Interrupts_Config();
  USB_Init();

  
  int bufferPos =0;
  while (1)
  {
    if ((count_out != 0) && (bDeviceState == CONFIGURED))
    {
      for(int i = 0; i < count_out;i++)
      {
        buffer[bufferPos] = buffer_out[i];
        if( (bufferPos>126) || (buffer_out[i] == 0x0d))
        {

          /* Write the data to the USB endpoint */
          USB_SIL_Write(EP1_IN, buffer, bufferPos+1);
          SetEPTxValid(ENDP1);;

          bufferPos =0;
          break;

        }
        bufferPos++;

      }
      SetEPRxValid(ENDP3);
      count_out = 0;

    }
  }
}

Danke & Gruß
Tom

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas Burkhart schrieb:

>
> count_out : die Anzahl über USB empfange Zeichen in buffer_out.

Das kann jeder sagen.
Im Code ist das nicht sichtbar. Von meiner Seite des Bildschirms aus, 
ist count_out einfach nur eine Variable, von der ich nichts weiß und von 
der ich ausgehe dass sie nie irgend einen vernünftigen Wert bekommen 
hat.

Autor: Thomas Burkhart (escamoteur)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok,hier kommt der Teil.
extern __IO uint32_t count_out;
extern uint8_t buffer_out[VIRTUAL_COM_PORT_DATA_SIZE];


void EP3_OUT_Callback(void)
{
  /* Get the received data buffer and update the counter */
  count_out = USB_SIL_Read(EP3_OUT, buffer_out);
    
#ifndef STM32F10X_CL
  /* Enable the receive of data on EP3 */
//  SetEPRxValid(ENDP3);
#endif /* STM32F10X_CL */
}

Gruß
Tom

Autor: Thomas Burkhart (escamoteur)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Problem lag gar nicht in meinem Code.

Die Terminal-Emulation in Crossworks ist wohl buggy.

Seot ich mit HTerm teste, ist alles wie es sein soll :-)

Gruß
Tom

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.