Forum: Mikrocontroller und Digitale Elektronik Serielle Schnittstelle, ASCII Tabelle , Kommunikationsprotokoll


von Nesrine G. (nesrine_g920)


Lesenswert?

Hallo Zusammen,

Ich versuche gerade ein eigenes Protokoll zum Kommunizieren mit einem 
XMC4700 Mikrocontroller zu schreiben ( als totaler newbie).

Ich werde Strom und  Zeit Werten zum µC schicken und entsprechen wuerde 
ich in beiden Richtungen Feedback bekommen.

Ich war gerade beim recherchieren und habe gesehen, dass in der ASCII 
Tabelle die ersten 32 Zeichen Kontrollzeichen sind mit unter anderem 
Gruppen Separatoren.

Da ich nicht sicher bin, dass ich es richtig verstanden habe, frage ich:

könnte ich die Zeichen zum Trennen meiner Daten bekommen ? wenn ja , 
vielleicht ein konkretes Beispiel?

Für mich waren immer STX immer drei unterschiedliche Zeichen daher war 
ich verwirrt, aber könnte ich  dann im µC folgendes schreiben?:
1
 char(oder uint8_t) x;
2
3
      if ( x = "STX"){
4
.....
5
6
}


Versteht mein µC ein Zeichen wie Unit separator ("US", 0x1F) oder 
acknowlage ("ACk", 0x06) als solches oder soll ich die Prozedur dazu 
schreiben?


ich schreibe die PC Seite vom programm in VBA. Schreibe ich dann :
1
serialport.output = "STX"



Mir ist es bewusst, dass es sehr Beginner Fragen sind. Die sind aber 
nicht so Intuitiv, zumindest in meinem Fall:)
Falls jemand so was ( Kommunikationsprotokoll für serielle 
Schnittstelle) mal gemacht hat, wäre ich sehr dankbar für einen 
Beispiel!
Danke!!

: Bearbeitet durch User
von H.Joachim S. (crazyhorse)


Lesenswert?

Der MC erkennt von sich aus überhaupt keine Steuerzeichen, dass muss 
immer die Software machen.
"STX" sind tatsächlich 3 Zeichen
#define STX 0x02
if (x==STX)
   {
  }

von Walter S. (avatar)


Lesenswert?

Nesrine G. schrieb:
> Für mich waren immer STX immer drei unterschiedliche Zeichen daher war

STX ist nur die Bezeichnung des Steuerzeichens und steht für die Zahl 2, 
ebenso wie CR (Carriage return) auch nur eine Bezeichnung ist und für 
die Zahl 0xd steht

von Nesrine G. (nesrine_g920)


Lesenswert?

Danke!

ich werde meine Steuerzeichen entsprechend definieren.

von Georg (Gast)


Lesenswert?

Nesrine G. schrieb:
> ich werde meine Steuerzeichen entsprechend definieren.

Ja, das ist schon mal ein guter Ansatz, du darfst nur keine Daten binär 
senden, denn damit man das Protokoll anhand der Steuerzeichen auswerten 
kann (z.B. Start = STX, Ende = ETX), dürfen diese in den Daten nicht 
vorkommen. Also Daten nur mit lesbaren ASCII-Zeichen, im Klartext: nicht 
ein Byte 0xFF senden, sondern "255". Ist zum Fehlerfinden sowieso besser 
wenn die Übertragung lesbar ist. Dass das etwas mehr Daten sind spielt 
praktisch nie eine Rolle.

Georg

von Werner R. (werner_85)


Lesenswert?

Hallo Nesrine,

habe gerade ein ganz einfaches DFÜ-Programm geschrieben, leider nicht 
für deinen Prozessor sondern für einen uralten 8085 (8Bit-CPU), das 
Prinzip ist aber ähnlich.

wie Georg anmerkte übertrage ich auch nur ASCII-Zeichen in meinem Fall 
als Intel-Hex Format. Der Übertragungsweg ist mit Hardware Handshake 
RTS/CTS abgesichert da der alte Rechner nur mit 3MHz läuft, sonst würde 
er sofort überrannt.

Anschließend müssen die Daten, also die Intel-Hex Zeilen noch 
entsprechend Interpretiert werden. Im Intel-Hex Format ist eine 
Prüfsumme pro Zeile enthalten, so sind Übertragungsfehler weitestgehend 
abgedekt.

Der Bootloader für den ATMEGA macht das so ähnlich, gibt es sicherlich 
auch für deine CPU.

Es gibt natürlich bessere Übertragungsprotokolle X-Z-Modem oder Kermit, 
diese brauchen aber auf beiden Seiten die Protokollunterstützung,
auf dem PC ist das ja kein Problem da die gängigen Terminalprogramme 
alles an Board haben, auf der Mikrokontrollerseite ist das aber schon 
eine größere Herausforderung ...

LG Werner
http://werners-seiten.de/index.html

von Basti (Gast)


Lesenswert?

such doch mal nach "byte stuffing"! Dann kannst du auch Daten binär 
senden und was du möchtest. Ist auch nicht schwer zu implementieren.

VG

Basti

von Nesrine G. (nesrine_g920)


Lesenswert?

Georg schrieb:
> Nesrine G. schrieb:
>> ich werde meine Steuerzeichen entsprechend definieren.
>
> Ja, das ist schon mal ein guter Ansatz, du darfst nur keine Daten binär
> senden, denn damit man das Protokoll anhand der Steuerzeichen auswerten
> kann (z.B. Start = STX, Ende = ETX), dürfen diese in den Daten nicht
> vorkommen. Also Daten nur mit lesbaren ASCII-Zeichen, im Klartext: nicht
> ein Byte 0xFF senden, sondern "255". Ist zum Fehlerfinden sowieso besser
> wenn die Übertragung lesbar ist. Dass das etwas mehr Daten sind spielt
> praktisch nie eine Rolle.
>
> Georg


Danke Georg ,

das genau habe ich mir auch überlegt. Davor hatte ich die Kommunikation 
binär definiert. Ich hatte geplant die einzelnen Werte ( Strom und 
Zeit), die ich senden wollte, mit der getbytes() Methode in VBA zu 
senden. Aber die Kommunikation mit ASCII Zeichen zu gestalten ist 
definitiv besser um die Daten zu erkennen. Dafür wird es aber viel mehr 
Speicher brauchen, ich werde wahrscheinlich einen FIFO implementieren 
müssen.

Danke nochmal!

Danke!

von Nesrine G. (nesrine_g920)


Lesenswert?

Werner R. schrieb:
> Hallo Nesrine,
>

Hallo Werner,

> habe gerade ein ganz einfaches DFÜ-Programm geschrieben, leider nicht
> für deinen Prozessor sondern für einen uralten 8085 (8Bit-CPU), das
> Prinzip ist aber ähnlich.
>
> wie Georg anmerkte übertrage ich auch nur ASCII-Zeichen in meinem Fall
> als Intel-Hex Format. Der Übertragungsweg ist mit Hardware Handshake
> RTS/CTS abgesichert da der alte Rechner nur mit 3MHz läuft, sonst würde
> er sofort überrannt.

Ich habe noch nie mit dem Format gearbeitet, ich schaue nach was es auf 
sich hat, vielleicht ist es für meine Bedürfnisse besser geeignet :)
>
> Anschließend müssen die Daten, also die Intel-Hex Zeilen noch
> entsprechend Interpretiert werden. Im Intel-Hex Format ist eine
> Prüfsumme pro Zeile enthalten, so sind Übertragungsfehler weitestgehend
> abgedekt.
>
> Der Bootloader für den ATMEGA macht das so ähnlich, gibt es sicherlich
> auch für deine CPU.

Sorry was meinst du damit ? (bitte nicht an meinem Unwissen 
verzweifeln!:))
>
> Es gibt natürlich bessere Übertragungsprotokolle X-Z-Modem oder Kermit,
> diese brauchen aber auf beiden Seiten die Protokollunterstützung,
> auf dem PC ist das ja kein Problem da die gängigen Terminalprogramme
> alles an Board haben, auf der Mikrokontrollerseite ist das aber schon
> eine größere Herausforderung ...

Also von der PC Seite werde ich eine Windows Application in vba oder 
vb.net schreiben in VBA 2010 express. In dem XMC werde ich natürlich die 
Funktionen entsprechend den geschickten Nachrichten aufteilen und 
erkennen.  Meinst du das?

Danke! ich schaue mir gleich dein Projekt an.


>
> LG Werner
> http://werners-seiten.de/index.html

von Nesrine G. (nesrine_g920)


Lesenswert?

Basti schrieb:
> such doch mal nach "byte stuffing"! Dann kannst du auch Daten binär
> senden und was du möchtest. Ist auch nicht schwer zu implementieren.
>
> VG
>
> Basti

Danke Basti,

Ich habe dieses Link gefunden:

http://rn-wissen.de/wiki/index.php?title=Bascom_UART_Input

Es hat mir geholfen ein besseres Verstaendnis zu haben.

Das auch fand ich super. Es ist zwar fuer Arduino aber die Denkweise 
hilft eine Beginnerin wie ich ziemlich viel:

http://forum.arduino.cc/index.php?topic=396450

von Amateur (Gast)


Lesenswert?

Viele Protokolle verwenden den ganz normalen Zeilenumbruch, um das Ende 
der aktuellen Sequenz zu signalisieren.

Sehr sinnvoll wenn diese in "lesbarer" Form übertragen werden.
Sehr sinnvoll, wenn die Längen der Sequenzen unterschiedlich sind. So 
können z.B. 0 (1 Zeichen) gefolgt von einem Zeilenumbruch und 0.2 (3 
Zeichen) ebenfalls gefolgt von einem Zeilenumbruch, jederzeit separiert 
werden. Auch wenn die tatsächliche Sequenz: '0' '\n' '0' '.' '2' '\n' 
ist.
Sehr sinnvoll, wenn man so nebenher überprüfen will, ob das System 
funktioniert. Dann ist eine lesbare Zeile, ein Datensatz.

Werden "echte" Binärdaten (0 dez ... 255 dez) übertragen, so sieht die 
Sache schon ganz anders aus.

von Werner R. (werner_85)


Lesenswert?

Hallo Nesrine,

OK, mein Lösungsansatz ist schon etwas "speziell".

Wie auch Georg anmerkte, erster Weg nur ASCII-Zeichen also Text 
übertragen.
Auf der PC-Seite reicht dafür ein einfaches Terminalprogramm.

Im Microcontroller würde ich erstmal das empfangene Zeichen als Echo 
wieder zum PC zurücksenden. Hier zeigt sich ob die V24-Schnittstelle 
mitspielt, normalerweise reicht eine Dreidrahtverbindung 
PC<-->Controller, also Sende- (TX) / Empfangsleitung (RX) und Masse aus. 
Bei meinem lahmen 8085 waren die Handshakeleitungen RTS/CTS erforderlich 
also Hardwarehandshake.

Beim Softwarehandshake XON/XOFF muss der Controller zuerst XON senden
(11h bzw ASCII DC1). Der PC startet nun die Datenübertragung. Nach dem 
Empfang bzw. zur Weiterverarbeitung muss der Controller mit XOFF (13h 
bzw. ASCII DC3) den Sender (PC) anhalten.

Alle anderen Protokolle bauen darauf auf...

Mit der Anregung von Basti gehen auch Binärdaten, dort wird jedes Byte
in zwei ASCII-Zeichen zerlegt, übertragen und beim Empfänger wieder 
zusammengebaut.

So ähnlich ist das mit dem Intel-Hex Code auch.
Hier wird eine Startmarke, erzeugt, Adressdaten (wo das Programm später 
ausgeführt wird), Anzahl der Datenbytes, die eigendlichen Binärdaten 
(als ASCII) dazu Prüfsumme und schließlich mit RETURN und LineFeed 
abgeschlossen. Das macht der Assembler aber alles automatisch, nur im 
Empfänger muss wieder auseinandergedröselt und ein Programm daraus 
werden...

Hoffe das ich mich einigermaßen verständlich ausgedrückt habe.


LG Werner

von Nesrine G. (nesrine_g920)


Lesenswert?

Amateur schrieb:
> Viele Protokolle verwenden den ganz normalen Zeilenumbruch, um das Ende
> der aktuellen Sequenz zu signalisieren.
>
> Sehr sinnvoll wenn diese in "lesbarer" Form übertragen werden.
> Sehr sinnvoll, wenn die Längen der Sequenzen unterschiedlich sind. So
> können z.B. 0 (1 Zeichen) gefolgt von einem Zeilenumbruch und 0.2 (3
> Zeichen) ebenfalls gefolgt von einem Zeilenumbruch, jederzeit separiert
> werden. Auch wenn die tatsächliche Sequenz: '0' '\n' '0' '.' '2' '\n'
> ist.
> Sehr sinnvoll, wenn man so nebenher überprüfen will, ob das System
> funktioniert. Dann ist eine lesbare Zeile, ein Datensatz.
>
> Werden "echte" Binärdaten (0 dez ... 255 dez) übertragen, so sieht die
> Sache schon ganz anders aus.

Ja Das ist für mich gerade auch der Hauptgrund warum ich auf lesbare 
Zeichen umstelle.

Meine längsten Nachrichten werden ungefähr so sein :
1
<Command><Board Nbr><Anzahl Werte> dann wiederholt :<Stromwert>Zeitwert><Index in der Sequenz>

Ich werde also mehrere "Trennzeichen" (TZ) benutzen" :
    - Anfang/Ende Kommunukation
    - Trennung Strom, Zeit, und Indexwerte.
1
<START KOM><Command><Board Nbr><Anzahl Werte> <TZ_I> <I> <TZ_T> <T> <TZ_Idx> <Index>.......<ENDE KOM>


Weiter in der Entwickelung werden sehr viele Werte geschickt also werde 
ich von der Seit von µC einen FIFO einbauen.

Macht es so Sinn?

Danke

: Bearbeitet durch User
von Amateur (Gast)


Lesenswert?

Ein FIFO ist eine sehr einfache Struktur, zu der es auch genügend, 
praktisch fehlerfreie Implementationen gibt.

... aber. Wenn Input und Abholung nicht übereinstimmen, läuft dieser 
auch irgendwann über. Meist nicht während der Testphase!

Viele Stapel fragen dies erst gar nicht ab und viele Anwender machen das 
Gleiche.

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
Noch kein Account? Hier anmelden.