PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 8 Byte über RS232 | Protokoll?



Goblin
11.07.2006, 21:08
Tagchen!

Ich muss vom PC 4 Word-Variablen (16-bit) auf nen Atmega übertragen und mache mir gerad Gedanken über ein Protokoll. Habe hier im Forum und im Rest des Netzes nicht wirklich was finden können. Also, es ist so dass ich auf meinem Atmega8 ein 4-fach-PWM laufen, deren Duty-Cycle halt vom PC vorgegeben werden soll. Die Zahlen liegen da zwischen 47104 und 65535 für 0% bis 100%. Ich will also immer 4 Zahlen übertragen, die jeweils 2 Bytes benötigen. Dies kann öfter mal vorkommen. Damit ich sehe wo eine Bytekombination anfängt, muss ich nen Header realisieren. Aber: Wie finde ich jetzt eine Header-Bitkombination, die nicht in den Datenbytes vorkommen kann? Ich hab mittlerweile eine ziemliche Denkblockade, also interpretiert diesen Beitrag als Hilferuf! :)

Rage_Empire
11.07.2006, 21:27
Ich wüßte da ein Protokoll:

http://www.hth.com/snap/

...vieleicht hilfts dir. Es gibt auch eine Dll zum download, also dürfte das realisieren kein Problem sein.

Ansonsten kannst du dir ja dein eigenes protokoll schreiben.....(warum auch nicht?)

chr-mt
11.07.2006, 21:28
Hi,
du könntest die Zahlen als String übertragen und an den Anfang einen Buchstaben stellen..
Ich übertrage Werte gerne als Strings, da kann ich mir sie prima zum Test in einem Terminalprogramm anschauen. ;)
Geht natürlich auch als Hexzahlen.
Also zB: H07FD

Ist halt etwas länger..

Gruß
Christopher

E-Fan
11.07.2006, 21:47
Schick doch ein neuntes Byte mit - in dem steht dann welche Byte's geändert werden müssen.
Das ist freilich nicht sonderlich flexibel wenn es mehr werden sollte, bietet aber den Vorteil das minimal nur zwei Bytes gesendet werden müssen.

P.S.: Hat das Gekritzel meiner PN etwas gebracht?

Goblin
11.07.2006, 22:30
@rage-empire:

Ich muss mich nur um das prog auf dem avr kümmern. den rest macht jemand anders. ich kann mir allerdings das protokoll aussuchen.

@chr-mt: was macht dich denn so sicher, dass die der anfangsbuchstabe nicht im rest des strings vorkommt?

@e-fan: ja, hat mir ein wenig gebracht, danke. das mit dem neunten byte ist auch nix, weil dieses imho nicht von den andern bytes unterscheidbar wäre.

E-Fan
11.07.2006, 23:02
Dann musst Du eine Reihenfolge festlegen in der die Bytes kommen müssen.
Beim DMX- oder NRMA-DCC-Signal ist das auch so. ;)

chr-mt
12.07.2006, 05:19
was macht dich denn so sicher, dass die der anfangsbuchstabe nicht im rest des strings vorkommt?
Es geht doch nur um das Übertragen von Werten, oder ?
Naja, wenn ich Dezimalzahlen als string sende, kommt doch logischerweise kein Buchstabe vor ;)
Wie gesagt, Hex geht auch, im Beispiel ist das Startzeichen das "H"
Das kommt nun mal nicht in den Hex Zahlen vor .
Es gibt ja nur 0-F, dann ist Schluss.
Man kann das "H" dann als Startbedingung nehmen und den restlichen String mit hexval wieder zurückwandeln

Dim S As String * 5
Dim O As Word
Dim I As Word

'******* Hin *******
O = 535
S = Hex(o)
S = "H" + S 's = "H0127"

'******* Zurück ********
s = Right(s , 4)
I = Hexval(s) 'I=535

Wenn Du zB. 4 Werte übertragen willst, geht das naürlich auch so.
Mußt dann halt noch ein Zeichen mehr übertragen, zB. so:

"HA23DA"
"HB0342"
"HC677C"
"HDF02A"

und dann die Adresse mit "MID"rausfummeln
Adresse = Mid(s,2,1)
Da gehen als Adresse dann alle Zeichen, bis auf'"H", logischerweise.
Du kannst die Strings natürlich auch aneinanderhängen und jeweils mit Mid
rausziehen.
"H23DA0342677CF02A"

Ist kein "supertolles Protokoll mit allem Schnickschnack",
funzt aber wunderbar und ist einfach.

Viele Digitalmultimeter etc. mit RS232 senden ihre Werte zB. auch einfach als Text an die zugehörige Software.

Gruß
Christopher

Goblin
12.07.2006, 09:35
das problem ist dann natürlich dass ich dann pro datensatz 20 bytes + header brauche, statt 8 bytes pro header. das sind bei 115200 baud immernoch 5485,7 Datensätze pro Sekunde (mit einem Headerbyte). :-k ... Optimal ist das nicht...

chr-mt
12.07.2006, 11:02
Hi,

das sind bei 115200 baud immernoch 5485,7 Datensätze pro Sekunde
Reicht das nicht ??

Klar ist das nicht optimal jedes Byte in zwei Characters zu wandeln. ;)

Gruß
Christopher

PicNick
12.07.2006, 11:25
@Goblin: Schau mal, es gibt da schon auch andere methoden
https://www.roboternetz.de/wissen/index.php/Bascom_UART_Input#Byte-Stuffing

marvin42x
12.07.2006, 11:49
Hier wurde gerade ein Protokoll erarbeitet:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=16297&postdays=0&postorder=asc&start=0
Mit Byte stuffing und Fehlerkorrektur.
Das wäre vermutlich das was Du brauchst.

Hier die Message allgemein:
https://www.roboternetz.de/wissen/index.php/Network_Controller/PC

Hier die Senderoutine:
https://www.roboternetz.de/wissen/index.php/Network_Controller/PC_Spezifikationen.

Der serielle Dialog läuft bereits mit Testclients tadellos und da es ein Open-Source-Projekt für die RN-Gemeinde ist bekommt man auch den Quelltext.

Schau dich mal in dem Projekt um. Ich vermute, dass Du da einige Anregungen findest.




Netter Gruß

marvin42x
12.07.2006, 11:50
Ich sehe schon, ich schreibe zu langsam..

Netter Gruß an die schnellen Wiener

E-Fan
12.07.2006, 19:48
das problem ist dann natürlich dass ich dann pro datensatz 20 bytes + header brauche, statt 8 bytes pro header. das sind bei 115200 baud immernoch 5485,7 Datensätze pro Sekunde ...

Wieso?
Es reicht doch wenn man nur dann Daten überträgt wenn sich ein Wert ändert/ändern muss.