www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Serielle Daten untersuchen


Autor: Louis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
ich hätte da 2 Fragen zur seriellen Schnittstelle, wäre nett wenn mir da 
jemand weiterhelfen könnte.

1) Über eine Software ist es mir möglich ein Gerät anzusteuern. Über das 
Hyperterminal habe ich die Strings der einzelnen Befehle abgefangen. Als 
ich allerdings über das Hyperterminal die Befehle an das Gerät senden 
wollte, tat sich nichts. Ich konnte das Gerät nicht wie mit der Software 
bspw. an- oder ausschalten. Was ist da los? Ob Hex oder ASCII ist ja 
egal, übertragen werden ja nur die binären Nullen und Einsen. Kann es 
vielleicht sein, dass die Daten in einer bestimmten zeitlichen 
Reihenfolge verschickt werden? Könnte man ja dann mit dem Oszi 
überprüfen, oder?

2) Wenn ich nun die Daten über den UART eines Mikrocontrollers einlesen 
und bearbeiten will, in welcher Form liegen die Daten dann vor? Binär 
Null und Eins oder in Hex/ASCII? Kann man die Daten durch ein Befehl 
beliebig darstellen (Programmierung in C)?

Viele Grüße
Louis

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Louis schrieb:
> Was ist da los? Ob Hex oder ASCII ist ja egal,
> übertragen werden ja nur die binären Nullen und Einsen.
Ja, aber ob Hex/Binär oder ASCII macht da sehr wohl einen Unterschied...

> Kann es vielleicht sein, dass die Daten in einer bestimmten
> zeitlichen Reihenfolge verschickt werden?
Ich mache bei seriellen Übertragungen zwischen uCs gerne ein Timeout 
rein, das z.B. nach 500ms zuschlägt. Von Hand mußt du da dann schon 
schnell tippen...

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Louis schrieb:
> Hi,
> ich hätte da 2 Fragen zur seriellen Schnittstelle, wäre nett wenn mir da
> jemand weiterhelfen könnte.
>
> 1) Über eine Software ist es mir möglich ein Gerät anzusteuern. Über das
> Hyperterminal habe ich die Strings der einzelnen Befehle abgefangen. Als
> ich allerdings über das Hyperterminal die Befehle an das Gerät senden
> wollte, tat sich nichts. Ich konnte das Gerät nicht wie mit der Software
> bspw. an- oder ausschalten. Was ist da los? Ob Hex oder ASCII ist ja
> egal, übertragen werden ja nur die binären Nullen und Einsen. Kann es
> vielleicht sein, dass die Daten in einer bestimmten zeitlichen
> Reihenfolge verschickt werden? Könnte man ja dann mit dem Oszi
> überprüfen, oder?

Die Daten werden wohl in einer bestimmten zeitlichen Reihenfolge 
verschickt. Wichtig zu wissen wäre aber, ob der Empfänger die Daten in 
einer bestimmten zeitlichen Abfolge erwartet (z.B. maximale Zeit 
zwischen zwei Bytes, maximale Zeit für den ganzen Befehl).
Und das siehst Du mit dem Oszi nicht.
Ausserdem kannst Du mit Hyperterminal nicht alle Zeichen senden (z.B. 
0x00 wird nicht gehen). Ev. Alternative HTerm.

>
> 2) Wenn ich nun die Daten über den UART eines Mikrocontrollers einlesen
> und bearbeiten will, in welcher Form liegen die Daten dann vor? Binär
> Null und Eins oder in Hex/ASCII? Kann man die Daten durch ein Befehl
> beliebig darstellen (Programmierung in C)?

Die liegen in der Regel als char oder als int vor. Diese können als 
Character oder als Zahl (dezimal oder hex, oder auch binär) dargestellt 
werden (z.B. mit printf()).

Autor: Louis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnelle Antwort!
@Lothar:
>> Ja, aber ob Hex/Binär oder ASCII macht da sehr wohl einen Unterschied...<<
Inwieweit spielt das eine Rolle? Übertragen wird ja nur die 1 und 0, 
oder?
Gruß

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Louis schrieb:
> Danke für die schnelle Antwort!
> @Lothar:
>>> Ja, aber ob Hex/Binär oder ASCII macht da sehr wohl einen Unterschied...<<
> Inwieweit spielt das eine Rolle? Übertragen wird ja nur die 1 und 0,
> oder?

Was Lothar meint:
Wenn du vor dem Terminal sitzt machst es einen Unterschied.

Bei einer Binär-Übertragung musst du dann die Tasten drücken, die das 
gewünschte Bitmuster im ASCII Code haben. Und für so manches Bitmuster 
gibt es dann keine Taste, die du dafür drücken kannst.

Es sei denn natürlich, du benutzt ein Terminal wie zb HTerm, das man in 
einen Modus versetzen kann, dass man gezielt Bitmuster erzeugen kann.


ASCII Übertragung macht die Dinge da ein bischen einfacher. Du drückst 
die Taste '1', dann geht ein Bitmuster über die Leitung, und das 
angeschlossene Gerät versteht dann auch, dass das Zeichen '1' 
eingetrudelt ist und erzeugt für sich selber dann die entsprechende Zahl 
1.
Bei reiner Binärübertragung muss man im Terminal ein wenig tricksen, 
damit bitweise 00000001 über die Leitung geht, und das Gerät die bereits 
fertige Zahl 1 empfängt.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Louis schrieb:
> Inwieweit spielt das eine Rolle? Übertragen wird ja nur die 1 und 0,
> oder?

 HEX     14  = Binär 00010100
 ASCII   14  = Binär 00110001 000110100
 Dezimal 14  = Binär 00001110

Autor: Louis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahhh, OK! Vielen Dank:-)

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Kann es vielleicht sein, dass die Daten in einer bestimmten zeitlichen
> Reihenfolge verschickt werden? Könnte man ja dann mit dem Oszi
> überprüfen, oder?

Wie geht man da ran? Kann man das auch noch irgendwie anders überprüfen, 
als mit einem Oszi. Hab nämlich in etwa das selbe Problem.

Gruß

Autor: asdf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
serielle schnittstelle kann alles sein.
wenn du eia-232 meinst, das ist standardisiert.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich meine wenn die Daten in einer verschiedenen Reihenfolge versandt 
werden. Beim Ansteuern meines Gerätes mit HTerm kann ich mit den 
abgegriffenen Strings, das Gerät nicht ansteuern. Ich denke, dass die 
Daten in einer bestimmten zeitl. Reihenfolge gesendet werden. Kann ich 
das nur mit dem Oszi überprüfen?

Autor: Joachim K. (minifloat)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach das doch so:
Du nimmst drei serielle Schnittstellen.
Eine um das Gerät mit Originalsoftware zu beschicken, die anderen 2 zum 
sniffen.

Dann hängst du die RX-Pins der beiden übrigen Seriellen an das RX und 
das TX der zu beschnüffelnden Verbindung. Ein Programm, was dir parallel 
zu den Empfangsdaten auch einen Zeitstrahl anzeigt, gibt es zuhauf. Oder 
selber schreiben, vllt. kleine C-Progrämmchen die Textfiles generieren 
die z.B. in Excel importierbar sind.
mfg mf

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Jo,
danke für die Antwort, werde ich morgen gleich mal ausprobieren. Hast du 
mir da vielleicht noch ein Tipp zwecks einem geeignetem Programm wo man 
die zeitlichen Reihenfolge/Übertragung erkennen kann? Am besten 
natürlich ne Feeware:-)
Gruß

Autor: Sascha Weber (sascha-w)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

FreeSerialPortMonitor z.B. http://www.serial-port-monitor.com/index.html
In der freien Version geht zwar nicht alles, aber zum mitloggen incl. 
Timestamp reichts alle mal.

Sascha

Autor: Markus Müller (mmvisual)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Louis (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
zunächst mal vielen Dank für die Tipps. Ich habs jetzt mal mit dem hTerm 
probiert. Wenn ich ein Befehl sende und den dann mit Hilfe des Terminals 
abgreife und über "Save Output" speichere, kann ich das Gerät durch 
"Send File" ansteuern. Wenn ich allerdings den Befehl wie im Bild in die 
Eingabeliste eingebe bzw. kopiere, und dann "ASend" verwende, passiert 
gar nichts. Kann mir evtl. hierbei jemand weiterhelfen? Was mache ich 
falsch?
Gruß

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Louis schrieb:
> Hallo zusammen,
> zunächst mal vielen Dank für die Tipps. Ich habs jetzt mal mit dem hTerm
> probiert. Wenn ich ein Befehl sende und den dann mit Hilfe des Terminals
> abgreife und über "Save Output" speichere, kann ich das Gerät durch
> "Send File" ansteuern. Wenn ich allerdings den Befehl wie im Bild in die
> Eingabeliste eingebe bzw. kopiere, und dann "ASend" verwende, passiert
> gar nichts. Kann mir evtl. hierbei jemand weiterhelfen? Was mache ich
> falsch?

Kann man so noch nicht sagen.
Sieh dir dein über "Save Output" abgegriffenes File noch mal in einem 
HEX Editor an. Es wäre möglich, dass da nicht darstellbare Sonderzeichen 
darin enthalten sind, die du an der Anzeige nicht siehst.
Auch fängt deine Mitschritft oben mit einem 'Quadrat' an (deutlicher 
Hinweis auf ein nicht darstellbares Zeichen) das du mit einem ? ersetzt 
hast.

Das Quadrat könnte jetzt daher kommen, dass das erste Zeichen einer 
Übertragung des öfteren mal verstümmelt ist. Wäre möglich, kann so sein, 
muss aber nicht so sein.

Bei der Entschlüsselung eines Protokolls fängt man im ersten Schritt 
immer damit an, sich zunächst die HEX-Bytes anzusehen. Da sieht man dann 
was tatsächlich Bytemässig über die Schnittstelle geht.
Hat man die HEX-Bytes vorliegen, dann vergleicht man mit einer ASCII 
Tabelle und sieht sich an, ab alle Bytes im ASCII Code druckbare Zeichen 
ergeben. Ausnahmen können höchstens noch Sonderzeichen wie ETX oder STX 
bzw. CR LF oder FF sein. Aber ausser diesen sollte nichts weiter 
enthalten sein. Sind Bytes mit gesetzten 7. Bit im Datenstrom, dann ist 
ASCII meistens aus dem Rennen, denn bei Gerätesteuerungen hat man es 
selten mit Kommandostrings mit Umlauten zu tun, sondern da wird ASCII 
verwendet und zwar so, wie Gott sich das so vorgestellt hat: Buchstaben 
A bis Z (auch in Kleinbuchstaben), Ziffern und ab und an einmal ein 
Sonderzeichen.
Das was dein hTerm Dump da suggeriert, deutet nicht besonders auf ASCII 
hin. Die wenigsten Firmen würden ASCII übertragung wählen und dann nur 
Ziffern hin und her schicken. Daher würde ich das ganze über Hex angehen 
und nicht über ASCII, wenn ich das entschlüsseln will.

Autor: Louis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo KH,
Danke für die Antwort. Also ich habs auch mal mit der Hex-Darstellung 
probiert, sprich:
B0 32 37 31 30 37 33 42 46 0D
Allerdings ohne Erfolg. Es will es einfach nicht klappen...
Gruß

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Louis schrieb:
> Hallo KH,
> Danke für die Antwort. Also ich habs auch mal mit der Hex-Darstellung
> probiert, sprich:
> B0 32 37 31 30 37 33 42 46 0D
> Allerdings ohne Erfolg. Es will es einfach nicht klappen...

Und wenn diese Sequenz aus einem File heraus gesendet wird, dann 
funktionierts?

Wenn ja, dann schätze ich mal, das das Gerät sehr enge Timeouts gesetzt 
hat.

Autor: Louis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau,
dann klappts...Allerdings verstehe ich nicht, warum das Senden aus dem 
File funktioniert. Mit den engen Timouts meinst du die zeitliche 
Reihenfolge in der die Bytes gesendet werden,oder?
Grüße

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Genau, dann klappts...Allerdings verstehe ich nicht, warum das
>Senden aus dem File funktioniert.

Zeig das File doch mal.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Louis schrieb:
> Genau,
> dann klappts...Allerdings verstehe ich nicht, warum das Senden aus dem
> File funktioniert. Mit den engen Timouts meinst du die zeitliche
> Reihenfolge in der die Bytes gesendet werden,oder?

Ganz genau.

Sofern natürlich das File 1:1 bytemässig wirklich exakt den gleichen 
Inhalt hat. Aber davon geh ich jetzt mal aus.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Sofern natürlich das File 1:1 bytemässig wirklich exakt den gleichen
>Inhalt hat. Aber davon geh ich jetzt mal aus.

Bei Asend vieleicht mal bei "Type" auf Hex oder Bin umschalten
und die Leerzeichen weglassen?

Autor: Louis (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi zusammen,

also ich hab jetzt den Typ auf Hex umgestellt, und siehe da, es 
funktioniert. Ich kann also nur bei Asend über Hex die Daten versenden. 
Allerdings kann ich den Befehl unter ASCII auch abspeichern (SaveOutput) 
und unter Send file problemlos verschicken.

1)Könnte es sein, dass das Terminal den Befehl dann automatisch in Hex 
umwandelt?

2) Warum klappt das nicht in ASCII oder in Bit? Bei ASCII liegts wohl an 
den nicht druckbaren Zeichen. Also dieses Quadrat am Anfang und das 
Carriage Return am Schluss. Beim Versenden mit  ASCII hab ich also nur 
271073BF verschickt. Mein Endgerät wusste also nicht wann der Befehl 
beginnt und wann er aufhört, so weit richtig?. Mit Hex hab ich nur 
"druckbare" Zeichen, also die komplette Bitfolge der einzelnen Zeichen 
für Befehlanfang und -Ende werden übertragen. Warum geht das aber nicht, 
wenn ich das mit Bit versende? Im Grund werden ja nur die binären Einsen 
und Nullen übertragen...Irgendwie kapier ich das immer noch nicht so 
ganz.

Grüße

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Louis schrieb:

>

Poste doch bitte einmal das gesicherte File.
Dann sieht man mal, was da wirklich über die Leitung geht.

Autor: Louis (Gast)
Datum:
Angehängte Dateien:
  • 10000 (10 Bytes, 82 Downloads)

Bewertung
0 lesenswert
nicht lesenswert
Hi KH,
also hier das File, dass ich über "Save Output" gespeichert habe...evtl 
mit Notepad öffnen.
Gruß

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zur Abkürzung: da steht drin
°271073BF + CR

Autor: Louis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau, ist 10 Bytes (-->10 Zeichen jew. 1 Byte) groß, wie aus dem 
Screenshot zu sehen ist, da ist es schön zu sehen. Die Frage ist jetzt 
nur, warum es mit HEX geht und mit ASCII nicht. Wird das nicht druckbare 
Zeichen "°" nicht von hterm gesendet, sodass mein Endgerät nicht weiß 
wann der Befehl kommt? Gruß

Autor: Sascha Weber (sascha_w)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Louis schrieb:
> Die Frage ist jetzt
> nur, warum es mit HEX geht und mit ASCII nicht.
> Wird das nicht druckbare
> Zeichen "°" nicht von hterm gesendet, sodass mein Endgerät nicht weiß
> wann der Befehl kommt? Gruß
das Platzhalterzeichen, das in der ASCII Anzeige erscheint ist ja meist 
für alle "nichtdruckbaren" Zeichen das selbe, deshalb wird beim senden 
als ACSII entweder nicht's gesendet, oder eben dieses 
Platzhalterzeichen.
Deshalb kannst du hier nur mit HEX-Werten arbeiten, was bei einer 
Bearbeitung mit einem µC aber auch keine Rolle spielt.


Sascha

Autor: Louis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Sascha,

> Deshalb kannst du hier nur mit HEX-Werten arbeiten, was bei einer
> Bearbeitung mit einem µC aber auch keine Rolle spielt.

Weil sie beim uC als char oder int vorliegen?

Gruß

Autor: Sascha Weber (sascha_w)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
genau, und wenn du die Daten auf dem µC als String verarbeiten willst 
kannst du ja auch mit HEX-Werten arbeiten, solange du für die 
Kommunikation kein NULL-Byte brauchst.

Sascha

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Louis schrieb:
> Genau, ist 10 Bytes (-->10 Zeichen jew. 1 Byte) groß, wie aus dem
> Screenshot zu sehen ist, da ist es schön zu sehen. Die Frage ist jetzt
> nur, warum es mit HEX geht und mit ASCII nicht. Wird das nicht druckbare
> Zeichen "°" nicht von hterm gesendet, sodass mein Endgerät nicht weiß
> wann der Befehl kommt? Gruß

Wenn du hTerm auf ASCII eingestellt hast und in die Zeile das hier 
eingibst:

B0 32 37 31 30 37 33 42 46 0D


dann sendet hTerm (weil ja auf ASCII eingestellt) das hier weg. (alle 
Zahlen sind Hexzahlen)

42 30 20 33 32 20 33 31 20 33 30 33 37 20 33 33 20 34 32 20 34 36 20 30 
44

also die ASCII Codes der einzelnen Zeichen, die den Text
B0 32 37 31 30 37 33 42 46 0D
bilden


Das ist aber genau das was du nicht brauchen kannst, du willst, dass 
über die Leitung die Bytes

B0 32 37 31 30 37 33 42 46 0D

gehen. Daher musst du hTerm mitteilen, dass du schon die Bytewerte hast 
und es nicht mehr für jedes Zeichen (zb 'B' zb '0' zb '3' zb 
Leerzeichen... ) die entsprechenden ASCII Codes heraussuchen soll.
Und genau das hast du mit der Umschaltung auf HEX gemacht.

Autor: Louis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute,
danke für eure Tipps! Habt mir echt weiter geholfen!
Grüße Louis

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.