Forum: Compiler & IDEs PMS Protocol


von Oliver S. (tb-killa)


Lesenswert?

Hallo Leute,

zur Zeit beschäftige ich mich mit einem Protocol welches über die 
Serielle Schnittstelle abgewickelt wird.

Ich würde gerne dieses Protocol mehr verstehen:

Informationen dazu findet ihr vom Hersteller hier:
http://www.zyxel.de/upload/download_library/vsg1200_universal_pms_spec.pdf


Nun zu meinen Erkenntnissen:

#Protocol
-Asynchrone Kommunikation
-Ascii
-9600 1 Start | 0 Parity | 1 End Bit


Ich habe mir mal eine Ascii Code Tabelle angeschaut:
z.B. diese 
http://www.theasciicode.com.ar/ascii-control-characters/start-of-text-ascii-code-2.html

# Message
- Protocol-Form: STX - Text - ETX - LCR

Wird hier tatsächlich z.B. als Hex STX [02] Text [..] ETX[02] LCR[..] 
übertragen ?

Wie wird die LCR berechnet und wie könnte man dies z.B. in C nachbilden 
?

Vielleicht hat jemand eine Idee und / oder schonmal sowas Softwareseitig 
umgesetzt ?

Mfg.

von Karl H. (kbuchegg)


Lesenswert?

Oliver S. schrieb:


> # Message
> - Protocol-Form: STX - Text - ETX - LCR
>
> Wird hier tatsächlich z.B. als Hex STX [02] Text [..] ETX[02] LCR[..]
> übertragen ?


Ja, ganz genau.
Jedes Packet beginnt mit einem Byte welches den Hex-Wert 02 (STX) hat 
und endet mit einem Bytes mit dem Hex-Wert 03 (ETX). Da diese Zeichen im 
TEXT selber nicht vorkommen können, ist damit das Ende immer eindeutig 
erkennbar.

> Wie wird die LCR berechnet und wie könnte man dies z.B. in C nachbilden
> ?

Steht doch drinnen. Einfach alle gesendeten Bytes nach dem STX 
miteinander XOR-en (inklusive dem ETX).

> Vielleicht hat jemand eine Idee und / oder schonmal sowas Softwareseitig
> umgesetzt ?

Das ist nicht wirklich schwer. Solltest du eigentlich alleine 
hinkriegen. Einfach das runterprogrammieren, was du gelesen hast. Da ist 
keine Hexerei dabei.

1
void Send( const char* Text )
2
{
3
  unsigned char LCR = 0;
4
5
  SendByte( 0x02 );
6
  while( *Text ) {
7
    SendByte( *Text );
8
    LCR ^= *Text;
9
    Text++;
10
  }
11
  SendByte( 0x03 );
12
  LCR ^= 0x03;
13
  SendByte( LCR );
14
}

von Oliver S. (tb-killa)


Lesenswert?

okay danke dann war mein Ansatz und die Denkweise doch richtig =)

Vielen Dank für die Information, einen ähnlichen Code hatte ich auch 
geschrieben jedoch hatte ich die kompletten Bytes mit Xor verknüpft !

Ich arbeite im Moment die Pdf File durch um einfach einen gesamten 
Überblick zu bekommen:

Nachdem ich also dank deiner Hilfe den eigentlichen "Send" Process 
darstellen kann wollte ich sicherheitshalber fragen ob der Angegeben 
Bereich:

#Timers and Values für das Senden relevant ist ?

Im eigentlichen Sinne, kann ich jetzt auf den Empfang warten und 
dementsprechend Filter um meine Informationen zu bekommen ?

PS: Hast du den Code eben so getippt oder ist das aus einem Project ?

von Karl H. (kbuchegg)


Lesenswert?

Oliver S. schrieb:

> Ich arbeite im Moment die Pdf File durch um einfach einen gesamten
> Überblick zu bekommen:
>
> Nachdem ich also dank deiner Hilfe den eigentlichen "Send" Process
> darstellen kann wollte ich sicherheitshalber fragen ob der Angegeben
> Bereich:
>
> #Timers and Values für das Senden relevant ist ?

Es ist insofern relevant, als du ja wissen musst, nach welcher Zeit 
spätestens du von der Gegenstelle mit einer Antwort rechnen kannst. 
Bleibt die Antwort aus, oder umgekehrt: antwortet dein System nicht 
rechtzeitig, dann wertet die Gegenstelle das als "da stimmt was nicht".

Genauso mit der "TEST" Message.


Wenn du die Dinge verstehen willst, dann ist das Durchlesen zwar 
wunderschön, aber ein wenig Erfahrung mit Kommunikations-Kanälen kann 
nie schaden. Und da stellt sich dann auch immer raus, dass es 
prinzipiell 2 große Themenkreise gibt
* A) wie funktioniert die Kommunikation prinzipiell, wenn alles klappt
* B) was kann alles an Fehlfunktion passieren und wie können wir
     sicherstellen, dass eien Fehlfunktion auch erkannt wird.

Insbesonders bei B) bedeutet "Fehlfunktion" nicht nur Softwarefehler, 
sondern ganz banale Dinge: Das Zimmermädchen steckt den Stecker aus, der 
Hausdiener bohrt beim Bilderaufhängen das Kabel an, etc. etc.
D.h. da gibt es durchaus auch Fälle, in denen dir eine LCR nichts nützt, 
weil du von der Gegenstelle erstmal überhaupt nichts kriegst, weil zb 
das Kabel ab ist oder in der Zentrale die Sicherung geflogen ist. Wie 
detektierst du sowas? Und viel wichtiger: was macht dann dein Gerät?

> Im eigentlichen Sinne, kann ich jetzt auf den Empfang warten und
> dementsprechend Filter um meine Informationen zu bekommen ?


Ob du das kannst, weiß ich nicht. Programmieren musst du das schon 
selber.

> PS: Hast du den Code eben so getippt oder ist das aus einem Project ?

einfach so getippt.

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.