ESP32: UART1 Kommunikation fehlerhaft

OP #7826856

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.

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...

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

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.

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

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:

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.

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.

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

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

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.

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.

Gast

Vielleicht hat es Zo R. überlesen: ohne Pegelwandler auf ESP32-Seite kann das nicht funktionieren. Er soll doch bitte erst mal das ausprobieren.

ciao

Marci

Obelix X. schrieb:

Also im Endeffekt USB (CDC).

Die wenigsten USB-Seriell-Bridges sind CDC-Geräte, aber das ist im Rahmen dieses Threads genauso irrelevant wie Deine Beobachtung.

Da der Threadersteller nicht an einer Lösung seines Problemes interessiert ist, können wir genausogut übers Wetter reden. Hier hats heute Nacht geschneit.

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.

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 ;-)

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.

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.

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 ;-)

Ah, da hast Du natürlich recht, es gibt den einen oder anderen Kandidaten hier im Forum, der schon mehrfach deutlich darauf hingewiesen wurde, wie das mit dem Zitieren funktioniert, und der sich beharrlich weigert, das zur Kenntnis zu nehmen. Aber der war noch nicht in diesem Thread.

(Firma: Q3)

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

Eine eigene Frage? Dieser Thread ist über ein Jahr alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.