Warum kann ich keine Nachrichten erfolgreich über RS232 senden?

9

In der vergangenen Woche habe ich daran gearbeitet, UART-Nachrichten von einem STM32F407 zu senden und sie auf meinem Laptop über ein ugreen RS232-zu-USB-Kabel mit Termite zu lesen.

Ich habe STMCube verwendet, um Code zu generieren und zu ergänzen, indem ich die entsprechenden Anweisungen oben in der Datei "stm32f4xx_hal_uart.c" gelesen habe (und viele Videos angesehen und online gelesen habe).

Ich habe die übertragene Nachricht auf einem Oszilloskop überprüft und sie stimmt mit der ASCII-Darstellung überein.

Zum Beispiel sende ich 'Q' mit 0101 0001 und erhalte 'W' mit 0101 0111. Die Anzeige auf dem Bereich zeigt:

Geben Sie hier die Bildbeschreibung ein

Termitenausgang für dasselbe Signal wie auf dem Oszilloskop angezeigt. Geben Sie hier die Bildbeschreibung ein

Ich habe bestätigt, dass die Baudraten / Parität / HW-Kontrolle auf Termite und in meinem Code übereinstimmen.

Um den richtigen Charakter zu erhalten, habe ich versucht, die Baudraten zu senken und zu erhöhen.
Ich habe verschiedene Zeichensätze ausprobiert, um ein Muster zu finden, bei dem falsche Zeichen angezeigt werden.
Zusätzlich habe ich verschiedene Terminals wie Putty oder Teraterm ausprobiert.

FeraTaTa
quelle
8
Funktioniert Ihr "RS232-zu-USB-Kabel" mit RS232-Spannungspegeln oder "TTL" -Spannungspegeln, und verwendet Ihre STM32F407-Karte den entsprechenden Treiber / Empfänger für diese Pegel? Ich bin mir fast sicher, dass die Antwort auf Frage 2 "Nein" lautet, denn wenn ich Ihre Oszilloskopspur durch einen Filter mit "falschen Pegeln und Polarität" interpretiere, sehe ich auch ein "W". Höchstwahrscheinlich verfügt Ihr Board über keine Treiber- / Empfängerhardware (verwendet also TTL-Pegel) und Ihr "RS232-zu-USB-Kabel" über RS232-Treiber- / Empfängerhardware (verwendet also RS232-Pegel).
Brhans
3
Das Ausprobieren verschiedener Zeichen würde die @ brhans-Hypothese sofort bestätigen. Das gleiche Zeichen immer und immer wieder zu senden, während ein anderes Ergebnis erwartet wird, ist eine der Definitionen von Wahnsinn ...
Dave Tweed
3
FeraTaTa - Nur ein Punkt, von dem ich glaube, dass er bisher nicht erwähnt wurde: Auf den ersten Blick zeigt Ihre Oszilloskopspur ein Signal, das bei 0 V im Leerlauf zu sein scheint (sehen Sie sich das 1Symbol mit dem gelben Hintergrund links neben der Spur an - das ist der 0V-Pegel) und pulsiert dann unter 0V. Das wäre für ein Logiksignal direkt von einem STM32 nicht wahr, und tatsächlich ist es nicht wahr. In der unteren linken Ecke haben Sie Kanal 1 auf AC-Kopplung eingestellt (das ist das ~Symbol, das Sie dort sehen). Das Signal ist wirklich im Leerlauf hoch und pulsiert auf etwa 0V. Verwenden Sie die Gleichstromkopplung, um eine vernünftige Ansicht dieses Signals zu erhalten.
SamGibson

Antworten:

22

Sie haben ein wichtiges Detail von RS232 übersehen. Die Logikstufen sind wie folgt:

Geben Sie hier die Bildbeschreibung ein

Abbildung 1. RS232-Signalpegel. Quelle: Wikimedia Commons .

  • Logik 1 = -3 bis -12 V.
  • Logik 0 = +3 bis +12 V.
  • Zwischen -3 und +3 ist der Logikpegel undefiniert.
  • Das RS232-Startbit ist eine logische 0.

Für die Konvertierung von TTL (5 V) -Logik in RS232 ist ein Treiber erforderlich. Chips wie der MAX232 übernehmen für Sie die Inversion des Logikpegels und die Spannungserhöhung.

Es ist manchmal möglich zu "schummeln" und ein TTL-Signal in einen RS232-Eingang einzuspeisen, vorausgesetzt, der Logikpegel ist invertiert. Die Zuverlässigkeit dieser Methode hängt von dem am RS232-Eingang verwendeten Chip ab.

Geben Sie hier die Bildbeschreibung ein

Abbildung 2. Die übertragene Wellenform. Oben ist das Bitmuster des 'Q', das Sie übertragen haben. Unten sehen Sie, wie der RS232-Eingang es liest.

Beachten Sie, dass der RS232-Eingang nach einer positiven Flanke sucht, um das Startbit anzuzeigen. Dies geschieht erst im zweiten Bit Ihrer Daten, sodass alles danach ein Bit nach rechts und invertiert ist, wie der Empfänger es sieht. Glücklicherweise ist Ihr MSB der richtige Logikpegel für das Stoppbit, daher hat der Empfänger ihn als gültigen Frame interpretiert, dekodiert und ein 'W' angezeigt.

Zu Testzwecken können Sie Ihre TTL-Ausgabe invertieren. Dies wird wahrscheinlich funktionieren, da es im Moment "funktioniert".

Geben Sie hier die Bildbeschreibung ein

Abbildung 3. Die MAX232- Chip verwendet Kondensatoren in Ladungspumpenschaltungen, um die 5-V-Versorgung für RS232-Pegel zu erhöhen.

Fügen Sie aus Gründen der Zuverlässigkeit einen MAX232-Chip hinzu, um ein ordnungsgemäßes RS232-Pegelsignal zu senden und zu empfangen.

Transistor
quelle
3
Als vielleicht bessere Alternative stehen USB-zu-TTL-UART-Kabel zur Verfügung. Wenn das OP ohnehin einen USB-Adapter verwendet, ist es nicht so sinnvoll, einen zusätzlichen Chip für die Pegelverschiebung hinzuzufügen.
Graham
1
RS-232 ist eine logische 0 = bipolare V +, die alles> 2 V ist, und eine TTL-Äquivalenzschwelle von 1,5 V typ. in CMOS wie 74HCTxx mit kleiner Hysterese (50 mV ??)
Tony Stewart Sunnyskyguy EE75
6
Auf Englisch bitte, Tony?
Transistor
3
Das ist Englisch für EEs, welchen Teil verstehst du nicht? RS232 ist -V im Leerlauf und> + 2V beim Start, ist jedoch eine negative Logik für die Spannung (0 = V +, 1 = V-) für Daten und stoppt bei V-. Ich wette, Sie wussten nicht, dass der RS-232-Schwellenwert 1,4 ~ 1,5 V beträgt
Tony Stewart Sunnyskyguy EE75
8
Danke, Tony. Das ist viel lesbarer und sinnvoller. Sie lassen Interpunktion, Schlüsselwörter und Konjunktive bei zu vielen Ihrer Schnellantworten weg. Ich bin ein alter Junge wie Sie mit fast vier Jahrzehnten EE. Meine Abbildung 1 zeigt die Schwellenspannungen für RX. Siehe auch Omega , Analog , Wikipedia und Maxim . Alle Zustände ± 5 V für TX und ± 3 V für RX.
Transistor
7

In Anbetracht der Kurzstrecke und der niedrigen Bitrate von 9600 funktionieren TTL- und CMOS-Pegel einwandfrei. Das von @Transistor eloquent beschriebene Problem besteht darin, dass UART-Daten eine negative Logik von 0 bis 5 V und RS-232 eine positive Logik von +/- V f zwischen +/- 3 und +/- 15 V (?) Sind.

Daher funktioniert, wie er auch vorschlägt, ein Wechselrichter.

Das Problem ist nicht ein Problem mit der Bitfehlerrate (BER) oder der Signalintegrität, sondern eine invertierte Logik.

Die "Grauzone" ist auch für die Langstreckengeräuschspanne vorgesehen. Sie beträgt für Sie nicht <+/- 3 V , da Ihr Kabel kurz ist. Die tatsächliche logische Schwelle von RS-232 Rx entspricht genau der alten TTL-Toleranz (zwei Vbe-Abfälle) oder 1,4 V +/- 20% (?).

Sie nennen es eine Grauzone, um alle Entfernungs- und Baudratenspezifikationen aufgrund von Rauschstörungen und Kantenklingeln zu erfüllen.

Für längere Kabel erhalten Sie einen MAX232. Abweichungen können von der Spannungsgeschwindigkeit und den Merkmalen abhängen.

Tony Stewart Sunnyskyguy EE75
quelle