Serielle Daten untersuchen

Gast #1925363
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
Moderator (Firma: Titel) Persönliche Seite #1925374
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...
#1925377
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()).
Gast #1925387
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ß
#1925388
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.
Gast #1931856
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ß
Gast #1932011
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?
#1932291
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
Gast #1932313
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ß
Gast #1937524
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ß
Angehängte Dateien:
#1937588
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.
#1938232
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.
Gast #1938247
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
#1938261
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.
Gast #1938263
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?
Gast #1943427
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
Angehängte Dateien:
Gast #1943606
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ß
#1943617
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
#1943705
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren