Arduino mit PC über Com-Schnittstelle (USB zu Seurielladapter) ansteuern

Guten Morgen zusammen,

zunächst vielen Dank für die vielen Beiträge hier im Forum, die mir bei vielen Problemen bereits geholfen haben. Jedoch habe ich jetzt ein Problem, wozu ich keine Lösung finde. Und zwar möchte ich meinen Arduino Uno mit dem PC über eine Serielle Schnittstelle verbinden. Und zwar nicht über die eigentliche USB-Schnittstelle die bereits auf dem Board vorhanden ist, sondern über die Pins 2 und 3. Auf der PC-Seite habe ich am USB-Anschluss einen Adapter auf Serielle Schnittstelle (Auf meinem PC ist das Com5). Das möchte ich um den Arduino mit 2 PCs ansteuern zu können. Die Schnittstelle auf dem Arduino ist eingerichtet mit

SoftwareSerial Schnittstelle(2, 3);

Schnittstelle.begin(9600);

Jetzt sollen ganz einfach ein paar Bytes an den PC gesendet werden:

Schnittstelle.write(60); Schnittstelle.write(61);

Funktioniert auch fast... Es werden auch genau 2 Bytes gelesen. Jedoch völlig andere. Ich wiederhole diesen Vorgang des Sendens alle 5 Sekunden. Es werden jedes mal die gleichen Bytes gelesen, jedoch halt komplett andere... Dazu fehlt mir jede Idee.

Ich habe den Arduino mit 3 Leitungen an dem Com-Port angeschlossen. rx, tx und GND. Egal welche Baudrate ich einstelle, das Problem bleibt, dass andere Bytes gelesen werden als ich sende. Die Anzahl stimmt aber immer... Hat jemand dazu eine Idee? Wenn ich das Problem google tauchen immer nur Problemstellungen auf, wo der Arduino direkt mit dem USB Port angeschlossen ist. das will ich aber nunmal leider nicht...

vielen Dank!

Hi

Versuch doch mal

Schnitstelle.write("60");

Könnte mir vorstellen, dass dann das ankommt, was du erwartest....

Noch was zu deinem "Adapter von USB zu Serielle Schnittstelle".... Was genau ist das für ein Teil? Du solltest darauf achten, dass es einer ist, der dir TTL Pegel auf der Seriellen Schnittstelle ausgibt und nicht die wesentlich höheren RS232 Pegel.

Grüsse Peter

Danke für die rasche Antwort :slight_smile:

Wenn ich nicht Byteweise schreibe sondern Schnittstelle.write(“60”) versuche erhalte ich 2 Bytes (Da ich Byteweise lese) → 178 und 6

Wenn ich Byteweise schreibe

Schnittstelle.write(60); // Zeichen: <
Schnittstelle.write(61); // Zeichen: =

erhalte ich die Bytes 88 und 24.

Der Adapter ist von Digitus:

Ich werd mich mal eben einlesen über RS232. Da steht nämlich tatsächlich etwas von drin…

danielschepers: Der Adapter ist von Digitus:

https://www.reichelt.de/?ARTICLE=99617&PROVID=2788&wt_mc=amc141526782519998&gclid=CJ-bu5Kau80CFYIW0wodiccNBg

Das ist ein RS232-Adapter, der ist nicht zum Anschluss an den TTL-Pegel geeignet.

Da könntest du evtl. auch deinen seriellen Port des Arduino mit killen. Du benötigst solch einen Adapter, oder diesen, o.ä.

Vielen Dank für deine Antwort :slight_smile:

Ich werd mal einen bestellen und es damit ausprobieren.

danielschepers: Vielen Dank für deine Antwort :)

Ich werd mal einen bestellen und es damit ausprobieren.

Ja, gerne.

Ich verwende davon einige und bin sehr zufrieden.

Es wäre auch hilfreich, die gesendeten und empfangenen Daten in HEX anzuzeigen, dann kann man die Bitmuster besser vergleichen.

Stimmt denn die Baudrate?

Und irgendwo habe ich noch im Hinterkopf, daß die Signale bei RS-232 gegenüber den Logikpegeln invertiert sind. Wenn dem so ist, kann natürlich nur Murks rauskommen. Kann man das bei SoftwareSerial einstellen? Ansonsten sollte es möglich sein, einen RS-232 Ausgang (Tx) an einen Arduino Eingang anzuschließen, wenn man einen Widerstand (~10k) dazwischenschaltet. Der Rx sollte keine Gefahr darstellen.

RS-232 arbeitet mit +/- 12V. Die kann man nicht einfach anschließen und was einstellen. Dazu braucht man eben RS-232/TTL Adapter (oder hier gleich USB/TTL).

Die hohe Spannung ist kein Problem, wenn man den Strom auf das begrenzt, was die Schutzdioden dauerhaft vertragen. Allerdings könnte der OP seinen Eingang bereits geschlachtet haben, so ganz ohne Schutzwiderstand.

Die meisten RS-232 Empfänger sind mit TTL Signalen zufrieden, sonst wäre ja bei den bisherigen Versuchen überhaupt nichts angekommen.

Inzwischen bin ich mir ziemlich sicher, daß es nur am inversen Logikpegel liegt, daß falsche Zeichen ankommen. Das läßt sich ja leicht nachprüfen: Wenn am RS-232 Ausgang normalerweise -12V anliegt, und am Arduino Ausgang normalerweise 5V, dann müßte man einen Inverter dazwischenschalten, oder SoftwareSerial auf inverse Pegel einstellen.

RS232 arbeitet gegenüber TTL-Serial mit inversen Pegeln. Ganz schön sieht man das an diesen Diagrammen: http://www.best-microcontroller-projects.com/how-rs232-works.html

Man kann vielleicht mit invertieren und Widerständen ein Lösung hinmurksen, die irgendwie funktioniert, aber sauber ist das nicht bzw. bietet sehr viel Frustpotential. Auch ist nicht sicher, ob nicht ein anderer Empfämger empfindlicher auf die Normeinhaltng reagiert. Zur Konvertierung gibt es günstige Schnittstellen IC oder man nimmt gleich ein Modul.

Da fertige USB-Serial-Wandler ja relativ preiswert sind, würde ich von einer Bastelei mit Invertern usw. abraten.

Zumal solch ein Modul auch zum Flashen (z.B. StandAlone Atmega oder Pro Mini) bestens geeignet ist.

Der OP hat ein neues Modul ja schon bestellt, mein Vorschlag galt eher einer schnellen Fehlerdiagnose.

Wenn man die Wahl hat, dann macht es überhaupt keinen Sinn, die Pegel erst auf hohe RS-232 Pegel zu bringen, die anschließend wieder auf TTL Niveau heruntertransformiert werden müssen. RS-232 macht mehr Sinn bei langen Leitungen, dann aber bitte mit korrekter Wandlung auf beiden Seiten.