Hallo, ich möchte einen Datenstring von einem Messgerät mit einem Arduino auslesen. Dies soll über serielle Kommunikation laufen. Ich weiß das der serielle Ausgang meines Messgeräts TTL-Logik (0 bis +5V) hat. Daher habe ich meinen Arduino Mega direkt an TX, RX und GND angeschlossen. Für die Datenerfassung und Ausgabe an den seriellen Monitor verwende ich folgenden Sketch: String input; //////////////////////////////////////////////////////////////////////// ///// void setup() { Serial.begin(38400); Serial.println("ttl started"); Serial1.begin(115200); } //////////////////////////////////////////////////////////////////////// ///// void loop(){ if (Serial1.available()) { input = Serial1.readString(); Serial.println(input); } } Mein Problem ist nun, dass die empfangenen Daten nur aus kryptischen Zeichen besteht (siehe Bild). Ich weiß, dass die Baudrate von 115200 stimmt. Könnt ihr mir da weiterhelfen woran das liegt?
Darius schrieb: > Ich weiß das der > serielle Ausgang meines Messgeräts TTL-Logik (0 bis +5V) hat. TTL-Logik wie es der UART ausgibt oder RS232-Logik aber mit TTL-Pegel?
Soll das Messgerät etwas anderes ausgeben oder gibt das die Messugnen einfach nicht als menschenlesbaren Text aus?
Darius schrieb: > Könnt ihr mir da weiterhelfen woran das liegt? Du benutzt Serial1 und Serial, mit unterschiedlichen Baudraten. Entscheide dich für eine
Bevor du mit dem Arduino da rumfummelst, vergewissere dich mal mit einem PC und einem Terminalprogramm für Entwickler (z.B. HTerm), was da aus dem Gerät rauskommt. Wäre auch gar nicht so dumm, uns zu schreiben, um was es sich bei diesem Gerät handelt.
Hi, da der erste String ja noch passt, lass mal das Serial1.begin(115200); weg.
Darius schrieb: > Ich weiß, dass die Baudrate von 115200 stimmt. Wie weiszt du dass ? Mit oscilloscope geprueft ? Versuch mal ob andere baudrates vielleicht eine besser lesbaren text geben.
Anzahl der Stopbits? Anzahl der Datenbits? Parity (odd, even, no)?
Hallo, welcher Arduino? Ist Serial1 hardware oder Softserial? SoftSerial schafft mit einem Mega328 keine 115200Baud. Warum sendest Du mit 38400? Wenn mehr Zeichen mit 115200 reinkommen läuft der Buffer von Serial1 sowieso über weil er die Zeichen nicht los wird. Gruß aus Berlin Michael
Michael U. schrieb: > welcher Arduino? > Ist Serial1 hardware oder Softserial? Arduino Mega mit ATMega2560 drauf. Serial1 ist ein HardwareSerial
Darius schrieb: > Mein Problem ist nun, dass die empfangenen Daten nur aus kryptischen > Zeichen besteht (siehe Bild). Die Daten sehen doch sehr regelmäßig aus, d.h. es handelt sich lediglich um ein Verständnisproblem. Hast du einen Logikanalysator oder ein Oszi - dann zeige mal, was in den µC seriell rein läuft. Wenn das mit der hohen Baudrate beim Empfang und der niedrigen beim Senden klappen soll, muss die Datenquelle regelmäßig Pausen machen und du brauchst einen ausreichend großen Puffer.
Patrick C. schrieb: > Wie weiszt du dass ? Mit oscilloscope geprueft ? Versuch mal ob andere > baudrates vielleicht eine besser lesbaren text geben. Genau! Wolfgang schrieb: > Die Daten sehen doch sehr regelmäßig aus, d.h. es handelt sich lediglich > um ein Verständnisproblem. Genau! Du hast ganz ziemlich sicher eine falsche Baudrate eingestellt! Interessant dass Du anscheinend ein CR/LF hast. Wieviele Zeichen erwartest Du pro Datensatz? So könntest Du etwa die wirkliche Baudrate abschätzen! Die ist warscheinlich VIEL niedriger! Das zeigen schon die vielen Zeichen im Extended-ASCII-Raum. Und überprüfen: Route 6. schrieb: > TTL-Logik wie es der UART ausgibt oder RS232-Logik aber mit TTL-Pegel? Gruss Chregu
Vielen Dank für eure vielen Kommentare. Route 6. schrieb: > TTL-Logik wie es der UART ausgibt oder RS232-Logik aber mit TTL-Pegel? RS232-Logik mit TTL-Pegel Florian schrieb: > Soll das Messgerät etwas anderes ausgeben oder gibt das die Messugnen > einfach nicht als menschenlesbaren Text aus? Es gibt sie nur nicht lesbar aus. Matthias S. schrieb: > Bevor du mit dem Arduino da rumfummelst, vergewissere dich mal mit einem > PC und einem Terminalprogramm für Entwickler (z.B. HTerm), was da aus > dem Gerät rauskommt. > Wäre auch gar nicht so dumm, uns zu schreiben, um was es sich bei diesem > Gerät handelt. Also ich habe es mal direkt an einen PC angeschlossen und über CoolTerm laufen lassen. Siehe Anhang. Es handelt sich um eine Foxbox (sie misst O2 und CO2 Gehalt in der Luft). Ingo D. schrieb: > Hi, > da der erste String ja noch passt, lass mal das > > Serial1.begin(115200); > > weg. Dann geht nix mehr. Ich muss doch auch die zweite serielle Schnittstelle initialisieren, oder? Patrick C. schrieb: > Wie weiszt du dass ? Mit oscilloscope geprueft ? Versuch mal ob andere > baudrates vielleicht eine besser lesbaren text geben. Steht so in der Betriebsanleitung. Und nein dann kommt kein besserer Text raus. Christian M. schrieb: > Du hast ganz ziemlich sicher eine falsche Baudrate eingestellt! > Interessant dass Du anscheinend ein CR/LF hast. Wieviele Zeichen > erwartest Du pro Datensatz? So könntest Du etwa die wirkliche Baudrate > abschätzen! > Die ist warscheinlich VIEL niedriger! Das zeigen schon die vielen > Zeichen im Extended-ASCII-Raum. Ich habe nachgezählt und ich erwarte genau so viele Zeichen wie ankommen bloß halt andere (siehe Anhang).
Hanns-Jürgen M. schrieb: > Anzahl der Stopbits? Anzahl der Datenbits? Parity (odd, even, no)? no parity, 8 Bits und ein Stopbit.
Darius schrieb: > Ich weiß das der serielle Ausgang meines Messgeräts TTL-Logik (0 bis > +5V) hat. Darius schrieb: > Also ich habe es mal direkt an einen PC angeschlossen und über CoolTerm > laufen lassen. Das bedeutet, daß Du da zusätzliche Elektronik verwendet hast. Oder?
Lass mal auf deinem Mikrocontroller eine LED blinken, etwa so:
1 | while (1) |
2 | { |
3 | LED_AN; |
4 | _delay_ms(500); |
5 | LED_AN; |
6 | _delay_ms(500); |
7 | } |
Und dann kontrollierst du mal bitte, ob sie wirklich genau im 1s Takt blinkt.
Stefan U. schrieb: > LED_AN; > _delay_ms(500); > LED_AN; > _delay_ms(500); Na, noch anner als an geht es kaum noch. :)
Doppelt genäht hält besser. Alte Bauernregel.
Danke für eure Beiträge. Ich habe eine Lösung gefunden. Es lag daran, dass das Signal invertiert ankam. Um das zu lösen kann man zum einen über SoftwareSerial direkt angeben, dass das Signal invertiert ist. #include <SoftwareSerial.h>; SoftwareSerial ttl(50, 51, true); Für HardwareSerial habe ich einen Invertierer (HCF4049) verwendet. Mit beiden Lösungen funktioniert es jetzt einwandfrei. Grüße Darius
Darius schrieb: > Ich habe eine Lösung gefunden. Es lag daran, dass das Signal invertiert > ankam. Genau danach hat dich Route 66 im ersten(!) Reply gefragt ... Route 6. schrieb: > TTL-Logik wie es der UART ausgibt oder RS232-Logik aber mit TTL-Pegel?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.