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


von Thomas B. (escamoteur)


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.
1
  uint8_t buffer[128];
2
  uint8_t SendBuffer[128];
3
4
int main(void)
5
{
6
  
7
  Set_System();
8
  Set_USBClock();
9
  USB_Interrupts_Config();
10
  USB_Init();
11
12
  
13
  int bufferPos =0;
14
  while (1)
15
  {
16
    if ((count_out != 0) && (bDeviceState == CONFIGURED))
17
    {
18
      for(int i = 0; i < count_out;i++)
19
      {
20
        buffer[bufferPos] = buffer_out[i];
21
        if( (bufferPos>126) || (buffer_out[i] == 0x0d))
22
        {
23
24
          /* Write the data to the USB endpoint */
25
          USB_SIL_Write(EP1_IN, buffer, bufferPos+1);
26
          SetEPTxValid(ENDP1);;
27
28
          bufferPos =0;
29
          break;
30
31
        }
32
        bufferPos++;
33
34
      }
35
      SetEPRxValid(ENDP3);
36
      count_out = 0;
37
38
    }
39
  }
40
}

Danke & Gruß
Tom

von Karl H. (kbuchegg)


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.

von Thomas B. (escamoteur)


Lesenswert?

ok,hier kommt der Teil.
1
extern __IO uint32_t count_out;
2
extern uint8_t buffer_out[VIRTUAL_COM_PORT_DATA_SIZE];
3
4
5
void EP3_OUT_Callback(void)
6
{
7
  /* Get the received data buffer and update the counter */
8
  count_out = USB_SIL_Read(EP3_OUT, buffer_out);
9
    
10
#ifndef STM32F10X_CL
11
  /* Enable the receive of data on EP3 */
12
//  SetEPRxValid(ENDP3);
13
#endif /* STM32F10X_CL */
14
}

Gruß
Tom

von Thomas B. (escamoteur)


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

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.