STM32 UART andere Daten empfangen wie gesendet

OP #6557760
Lesenswert?

Hallo zusammen,

ich habe das Problem, dass wenn ich Daten vom µC sende, andere Daten am 
PC empfange.
Ich benutze HAL_UART_Transmit Funktion. Die Parameter am Seriellen 
Monitor und auf dem µC sind die gleichen.

Senden:    54, 3A, 30, 32, 35, 2e, 39, 37
Empfangen: D5, EC, B6, 56, 36, 6B, 91, 00

Wenn ich einen Logic-Analyser benutze sehe ich auch, dass die richtigen 
Daten gesendet werden. Benutze ich jetzt aber einen seriellen Adapter, 
sehe ich andere Daten.

Hat von euch einer eine Idee, woran das liegen könnte bzw. was ich 
falsch mache?

Gruß Maurice
Gast #6557770
Lesenswert?

Maurice H. schrieb:
> Benutze ich jetzt aber einen seriellen Adapter,
> sehe ich andere Daten.
>
> Hat von euch einer eine Idee, woran das liegen könnte bzw. was ich
> falsch mache?

Vielleicht passt dein Serieller Adapter nicht zu deinen Datensignale, 
die vom µC kommen (Invertierung, Pegeldefinition).

Was für einen Adapter verwendest du?
Wie sehen die Signale auf dem LA aus?
Gast #6557778
Lesenswert?

Maurice H. schrieb:
> sehe ich auch, dass die richtigen
> Daten gesendet werden. Benutze ich jetzt aber einen seriellen Adapter,
> sehe ich andere Daten.

Auf der gleichen Leitung? Dann siehst du etwas falsch. Die Daten am Ende 
einer seriellen Leitung sind die gleichen wie am Anfang, also geht es um 
die Interpretation und/oder Synchronisation.

Maurice H. schrieb:
> Die Parameter am Seriellen
> Monitor und auf dem µC sind die gleichen

Das ist wohl nicht so.

Georg
OP #6557828
Lesenswert?

Ja, daten sind reproduzierbar. Es kommt immer das selbe.
Datenbits sind 8 und Parität verwende ich nicht.
Stoppbits habe ich gerade erhöht. Daten ändern sich ein bisschen, aber 
ist nichts sinnvolles.

Ich sende gerade als ASCII: '1,2,3,4,5,6,7,8'.
Im Logic-Analyser passen die Daten.
Im Seriellen Monitor kommt aber als hex: 67,B3,76,56,36,16,F6,00

Das sind meine Parameter auf dem µC
1
  huart1.Instance = USART1;
2
  huart1.Init.BaudRate = 19200;
3
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
4
  huart1.Init.StopBits = UART_STOPBITS_1;
5
  huart1.Init.Parity = UART_PARITY_NONE;
6
  huart1.Init.Mode = UART_MODE_TX_RX;
7
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
8
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
Angehängte Dateien:
Gast #6557839
Lesenswert?

timing?

Stimmt die Baudrate auf beiden Seiten?

Das ein PC das falsche Timing hat ist eher ungewöhnlich, beim 
selbstgestrickten µC aber schnell passiert.

Aber Du hast ja einen LA und solltest dort die Bit/Bytezeit exakt messen 
können.

Ich nutze diverse BluePills auch per Serial zum PC und es paßt mit 
CubeMX/HAL perfekt, auch bei knapp 1MBaud.
Gast #6557842
Lesenswert?

Maurice H. schrieb:
> Benutze ich jetzt aber einen seriellen Adapter,
> sehe ich andere Daten.

Was ist das für ein Adapter?
Laut LA verwendest du wohl RS232 TTL, also ohne "richtige" Pegel. Denn 
der Ruhepegel von RS232 ist -12V. Also, ist dein Adapter einer der 
+/-12V erwartet oder auch TTL?
Gast #6557868
Lesenswert?

Maurice H. schrieb:
> Ich werde mit einen Pegelwandler besorgen und das ausprobieren.

Es gibt von FTDI welche, die 3V3 oder 5V "TTL" erwarten (das ist nämlich 
invertiert) und auf USB die passenden Signale ausgeben. Kosten so 15 € 
rum. Kauf dir nur FTDI oder auch MOXA, mit denen gibt es keine Probleme.
Von allen Anderen würde ich deutlich Abstand halten, auch wenn sie noch 
so billig sind.
Gast #6557972
Lesenswert?

Maurice H. schrieb:
> Hat von euch einer eine Idee, woran das liegen könnte bzw. was ich
> falsch mache?

Ja, da habe ich eine Idee: Du solltest lieber mit 2 Stopbits senden, das 
verschafft deiner Transmission soviel Reserve, daß der Empfänger den 
Byteanfang zuverlässig erkennen kann. Die Folge ist natürlich, daß du 
auch vom PC aus mit 2 Stopbits senden mußt, sonst erstickt dein µC in dn 
Daten.

Ich habe diesen Synchronisationsverlust selber schon öfters mit den 
verschiedendsten USB-Serial Konvertern erlebt. Mit 2 Stopbits war der 
Spuk zuende und alles ging glatt wie gewünscht.

Maurice H. schrieb:
> Ich benutze HAL_UART_Transmit Funktion.

Die kenne ich nicht, aber eines sei gesagt: beide Richtungen sollten 
gepuffert werden und per Interrupt bedient sein.

W.S.
OP #6557980
Lesenswert?

W.S. schrieb:
> Ja, da habe ich eine Idee: Du solltest lieber mit 2 Stopbits senden, das
> verschafft deiner Transmission soviel Reserve, daß der Empfänger den
> Byteanfang zuverlässig erkennen kann. Die Folge ist natürlich, daß du
> auch vom PC aus mit 2 Stopbits senden mußt, sonst erstickt dein µC in dn
> Daten.

Danke für den Tipp. Werde ich dementsprechend noch anpassen.

>Die kenne ich nicht, aber eines sei gesagt: beide Richtungen sollten
>gepuffert werden und per Interrupt bedient sein

Ja, habe ich schon umgeschrieben. Danke

Nick M. schrieb:
> Es gibt von FTDI welche, die 3V3 oder 5V "TTL" erwarten

Ich muss die Daten an eine SPS mit serieller Schnittstelle senden, daher 
brauche ich einen Pegelwandler. Ich werde mir aber den Tipp merken.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren