ESP32: UART1 Kommunikation fehlerhaft

OP #7826856
Lesenswert?

Hallo,

ich habe ein Problem mit der seriellen Kommunikation zwischen meinem ESP32 und dem PC über ein FTDI USB-RS232-Kabel. Der ESP32 sendet Daten über UART1, aber auf dem PC kommen die Zeichen fehlerhaft an.

Alle Parameter (Baudrate, Parität, Stoppbits, Flow Control) sind korrekt eingestellt. Hat jemand eine Idee, woran es liegen könnte? Könnte es am Pegelwandler liegen oder gibt es bekannte Probleme mit FTDI-Chips in dieser Konstellation?

Wenn ich die bytes 0x55, 0x55 sende werden diese bytes auch korrekt empfangen. Wenn ich die beiden bytes abändere in 0xAA und 0xAA dann empfängt der PC die bytes 0x95 und 0x15.

#7826859
Lesenswert?

Zo R. schrieb:

Alle Parameter (Baudrate, Parität, Stoppbits, Flow Control) sind korrekt eingestellt. Hat jemand eine Idee, woran es liegen könnte?

Vermute: die Parameter sind NICHT richtig eingestellt. Lieber dreimal kontrollieren, als einmal blöd aus der Wäsche gucken.

Dann: Irgendwelche Zweitverwendungen für den UART-Pin in deinem Code? Irgend ein Timer der den TX-Pin zwischendurch mal als Debug-LED benutzen will?

GND von ESP32 und FTDI verbunden oder nicht? Auch ein beliebter Anfänger-Fehler...

#7826940
Lesenswert?

Zo R. schrieb:

Alle Parameter (Baudrate, Parität, Stoppbits, Flow Control) sind korrekt eingestellt.

Das sagen sie alle. Wenn dazu die Hardware und die Software fehlerfrei sind, muss es auch funktionieren.

Wie schnell versuchst du zu übertragen und wie sehen die Signale am UART aus? Passieren die Fehler bei Übertragung von Einzelzeichen oder bei Zeichenblöcken.

OP #7827133
Lesenswert?

Guten Morgen,

hier ein paar Angaben:

XIAO-ESP32-C3

1
#define UART1_TX_PIN 6  // D4
2
#define UART1_RX_PIN 7  // D5
3
#define UART1_BAUD 9600
4

5
uint8_t data[2] = {0xAA, 0xAA};
6

7
const uart_config_t uart_config = 
8
{
9
  .baud_rate = UART1_BAUD,
10
  .data_bits = UART_DATA_8_BITS,
11
  .parity = UART_PARITY_DISABLE,
12
  .stop_bits = UART_STOP_BITS_1,
13
  .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
14
  .source_clk = UART_SCLK_APB
15
};
16

17
void setup() 
18
{
19
  Serial.begin(115200);
20

21
  uart_param_config(UART_NUM_1, &uart_config);
22
  uart_set_pin(UART_NUM_1, UART1_TX_PIN, UART1_RX_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
23
  uart_driver_install(UART_NUM_1, 1024, 0, 0, NULL, 0);  
24
}
25

26
void loop() 
27
{
28
  uart_write_bytes(UART_NUM_1, data, 2);
29
  delay(1000);
30
}

Für eine weitere UART Verbindung, können diese Pins verwendet werden. Oder kann ich für die UART1 Verwendung nur bestimmt Pins nutzen?

Ich habe mal die GPIO Pin 2 und 3 benutzt. Auch da ist das Fehlerbild gleich.

#7827164
Lesenswert?

Zo R. schrieb:

Kabel: USB-RS232 mit FTDI Chip

Das ist keine Hardwarebeschreibung.

Ein ESP32 hat keine UART mit RS232-Pegeln.

Wie hast Du das Kabel mit Deinem ESP32 verbunden?

Zeig ein Photo von Deinem Aufbau, wenn es Dir zu schwer fällt, das ganze in Worte zu fassen oder einen Schaltplan zu zeigen.

Zo R. schrieb:

Auf dem Oszilloskope sieht das Bitmuster soweit ok aus.

Zeig das Oszillogramm. Weißt Du, wie eine UART-Datenübertragung funktioniert, d.h. wie das Oszillogramm aussehen sollte, oder ist das von Deiner Seite nur so eine Art Annahme ("sieht soweit gut aus")?

OP #7827173
Lesenswert?

Harald K. schrieb:

Zo R. schrieb:

Kabel: USB-RS232 mit FTDI Chip

Das ist keine Hardwarebeschreibung.

Ein ESP32 hat keine UART mit RS232-Pegeln.

Wie hast Du das Kabel mit Deinem ESP32 verbunden?

Ich habe das Kabel direkt an dem ESP32 verbunden (TX/TX/GND)

Zeig ein Photo von Deinem Aufbau, wenn es Dir zu schwer fällt, das ganze in Worte zu fassen oder einen Schaltplan zu zeigen.

XIAO-ESP32-C3 mit USU-RS232 direkt verbunden.

Zo R. schrieb:

Auf dem Oszilloskope sieht das Bitmuster soweit ok aus.

Mit dem Oszilloskope habe ich jedes Bit von dem UART Datenpacket untersucht. 0x01 Datenbyte das gesendet wird. Startbit Datenbits (LSB first) Stopbit 0 1 0 0 0 0 0 0 0 1

Zeig das Oszillogramm. Weißt Du, wie eine UART-Datenübertragung funktioniert, d.h. wie das Oszillogramm aussehen sollte, oder ist das von Deiner Seite nur so eine Art Annahme ("sieht soweit gut aus")?

Angehängte Dateien:
#7827174
Lesenswert?

Es bleibt leider immer noch unklar, ob der "USU-RS232" ein echtes RS-232 macht (dann sind die Pegel invertiert, also low bei Idle). Falls er einen Sub-D-9 hat, ist das sehr wahrscheinlich. Zur Überprüfung könntest du den TX vom Adapter auf dem Oszi anschauen, und Daten vom PC her senden, und das Oszillogramm vergleichen bezüglich Pegeln und Baudrate.

#7827175
Lesenswert?

Harald K. schrieb:

Der ESP32 ist mit RS232-Pegelwandlern ausgestattet?

Es reicht ein USB-Seriell-Wandler für 3.3V

Zo R. schrieb:

FTDI USB-RS232-Kabel

Der ESP32 kann mit RS232-Pegeln nichts anfangen.

Uwe schrieb:

Noname vom Ali, mehr weiß ich auch nicht mehr, halt so kleine Platinchen, eine Seite USB A, andere Seite 2.54er Stiftleiste.

Dann stelle fest, was dort für Chips drauf sind. Du brauchst einen USB-Seriell Wandler für 3.3V Signalpegel.

#7827179
Lesenswert?

Uwe schrieb:

Noname vom Ali, mehr weiß ich auch nicht mehr, halt so kleine Platinchen, eine Seite USB A, andere Seite 2.54er Stiftleiste.

Dann stelle fest, was dort für Chips drauf sind. Du brauchst einen USB-Seriell Wandler für 3.3V Signalpegel.

Sorry für die Verwirrung, MEIN Thema hatte sich erledigt, ich hab das seltsame Teil vor geraumer Zeit entsorgt und nun ausreichend Adapter, die mit 921600 Baud funktionieren. Alles bestens.

@TO: Es bleibt leider immer noch unklar, ob der "USU-RS232" ein echtes RS-232 macht (dann sind die Pegel invertiert, also low bei Idle). Falls er einen Sub-D-9 hat, ist das sehr wahrscheinlich. Zur Überprüfung könntest du den TX vom Adapter auf dem Oszi anschauen, und Daten vom PC her senden, und das Oszillogramm vergleichen bezüglich Pegeln und Baudrate.

Ein Foto vom Aufbau und den Oszi-Bildern der beiden Datenleitungen könnten Wunder wirken, und das lustige Ratespiel etwas abkürzen :-)

OP #7827296
Lesenswert?

Das jetztige Kabel funktioniert wohl nicht mit meinem Vorhaben. Man sieht doch der Pegel vom TX Ausgang USB RS232 ist nicht 0V ... 3.3V.

Foto vom Aufbau bringt nix. Das Foto hift auch nicht weiter.

Aufbau

PC <==> USB-RS232 ==> TX ==> GPIO6 ESP32C3 Board <== RX <== GPIO7 == GND == GND

#7827318
Lesenswert?

Wenn man davon ausgeht dass der ESP32 den RS232 Pegel scheinbar kurzzeitig überlebt, der UART Pegel aber invertiert ist (wegen RS232) dann kommt man auf das beobachtete Ergebnis: 0x55 0x55 liefert ein 0x55 0x55 und 0xAA 0xAA ein 0x95 0x15

Beispiel (ohne Garantie):

1
0xAA 0xAA
2

3
10101010 10101010
4
Invertiert (da RS232 Pegel)
5
01010101 01010101
6

7
LSB first
8

9
10101010 10101010
10

11
S: Start Bit, s: Stop Bit
12
000: Pegel ohne Signal
13

14
Das wird gesendet (8N1):
15

16
    S        s S        s
17
000 1101010100 1101010100 000
18

19
So wird es von der ESP32 UART interpretiert
20

21
     S        sS 
22
00011010101001101010100000
23
      10101001  10101000
24

25
LSB First:
26

27
10010101 -> 0x95
28
00010101 -> 0x15

Das fehlenden Stop Bit hat scheinbar keine Wirkung bzw. würde man wohl in den ESP32 UART Status Bits als Frame-Error sehen.

#7827977
Lesenswert?

Jens K. schrieb:

Dass der ESP32-C3 über natives USB verfügt hat von euch keiner auf dem Schirm?

Hast du den Eröffnungspost nicht gelesen? Zo R. möchte Daten über UART1 und USB-Seriell-Wandler an einen PC schicken und fragt, warum die gesendeten Daten bei ihm falsch am PC ankommen. Der ESP32 hat auch natives WLAN, über dass man die Daten übertragen könnte.

#7828142
Lesenswert?

Der große Vorteil des Lebens im 21. Jahrhundert gegenüber zum Beispiel des 18. Jahrhunderts ist der problemlos funktionierender Heizungen. Und Klospülungen!

Um das jetzt nicht völlig entgleiten zu lassen, wiederhole ich ein letztes Mal die Aufforderung an den Threadstarter, endlich mal ein BILD seines Aufbaus zu zeigen, oder in klaren Worten zu erklären, wie er denn seinen FTDI-Adapter mit RS232-Pegeln an seinen ESP32 angeschlossen haben will.

#7828148
Lesenswert?

Ich fass noch mal kurz zusammen:

  • (hier regnet es)
  • Der TO hat mit dem Oszi gemessen, dass der ESP sendet (Bild vom 11.2.).
  • Er sieht 900µs Bitzeit, also ca. 115k.
  • Idle is high, wie man das erwarten würde.
  • Der Tastkopf ist falsch eingestellt. Das Bild zeigt 330mV anstatt 3.3V high.
  • Am Ausgang des USB-RS232-Wandlers misst er (am 11.2. 10:05) dass Idle low ist, also ein echtes RS232. Damit ist klar, dass das am ESP32 nicht funktionieren kann, weil die Pegel invertiert und verschoben sind.
  • Auch hier falsche Tastkopfeinstellungen. Die +0.6V und -0.6V dürfen in natura +6V und -6V sein.
  • Die Baudratenwünsche mag sich der TO noch mal anschauen. Es sind 9600 und 115k im Spiel, die Oszi-Bilder deuten auf 115k.
  • Der TO hat verstanden, dass er einen anderen Adapter braucht.
  • Alternativ hätte er zusätzlich einen MAX232 einbauen können, der das logic-level-seriell auf echtes RS232 gewandelt hätte, womit der RS232-Adapter funktioniert hätte.

Wenn jetzt noch vom TO ein Bild vom "falschen" und "richtigen" Adapter kämen und die Erfolgsmeldung, dass alles funktioniert, könnte man den Thread dann eigentlich zu machen ;-)

#7828162
Lesenswert?

Uwe schrieb:

Noname vom Ali, mehr weiß ich auch nicht mehr, halt so kleine Platinchen, eine Seite USB A, andere Seite 2.54er Stiftleiste.

Hatte ich auch schon. Bei mir waren MAX3232 drauf. War aber Fake oder schlechte Nachbauten. Habe die Chips runter gelötet und von Reichelt neu rauf getan. Seitdem funktionieren diese. Ich hatte vorher aus Neugier Fehlersuche betrieben. Die Fakechips waren am schwingen, mal ja mal nicht. War auf dem Scope gut zu sehen. Seitdem kaufe ich fast keine Halbleiter oder kleine Breadboards mehr in China oder wenn recht eindeutig zu erkennen ist, dass die angebotenen dort her stammen.

#7828170
Lesenswert?

Uwe schrieb:

Alternativ hätte er zusätzlich einen MAX232 einbauen können, der das logic-level-seriell auf echtes RS232 gewandelt hätte, womit der RS232-Adapter funktioniert hätte.

übliche 232 Chips arbeiten nur an 4,5V und somit ist idle also in Ruhe auch >3,3V kein Pegel der dem ESP gefällt. Was immer klappt ist einen echten MAX3232 am ESP zu verwenden auf echte "V24" mit dem PC zu verbinden. Die eingebaute Ladungspumpe und Invertierung sorgt für Anpassung von Spannung und Ruhepegel.

#7828625
Lesenswert?

Harald K. schrieb:

Der große Vorteil des Lebens im 21. Jahrhundert gegenüber zum Beispiel des 18. Jahrhunderts ist der problemlos funktionierender Heizungen. Und Klospülungen!

Der andere Vorteil ist, das HTML bereits erfunden wurde und neuerdings in der Lage ist, Verknüpfungen zu nutzen, so dass man an Stelle von bspw. "(am 11.2. 10:05)" einfach einen Link einbauen kann, z.B. indem man die referenzierte Stelle markiert und beherzt auf "Markierten Text zitieren" klickt. Das spart dem Leser viel Sucherei im Faden, weil man einfach darauf klicken kann und der Text auf dem Bildschirm dann in wundersamer Weise zur referenzierten Stelle springt. Und genauso wundersam gelangt man mit der "Zurück"-Taste, die bereits in viele Browser unterstützen wird, wieder zum ursprünglichen Beitrag.

Zo R. schrieb:

OsziBild.jpg

In diesem Sinne: Der Fortschritt ist nicht aufzuhalten, auch wenn es noch nicht bei allen angekommen ist ;-)

(Firma: Q3) #7828927
Lesenswert?

Nutze doch mal testweise ein ESP32-Board mit eingebautem USB-Anschluss. Dann sieht man zumindest, ob das Problem durch die Hard- oder die Software verursacht wird.

Ein weiterer Test wäre es, mal eine SoftSerial zu benutzen. Dort gibts m.W. in der Begin-Methode eine Option, um inverse Logik einzuschalten ...

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