Protokoll für den Transfer von Daten über I²C

Algorithmen, Sprachunabhängige Diskussionen zu Konzepten, Programmiersprachen-Design
Antworten
Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Protokoll für den Transfer von Daten über I²C

Beitrag von cloidnerux » Do Aug 13, 2009 2:46 pm

Damit das Forum nicht einstaubt, hier mal ein Problem von mir:
Ich habe mehrere ICs(Atmega32) über *I²C/TWI verbunden.
Verbindung klappt, ich kann Bytes senden und Empfangen.
Jezt will ich über RS232 Daten zum Computer senden, die verbindung funktioniert bereits.
Jezt muss ich aber die Daten vom Master zu dem Slave mit der Seriellen Schnittstelle schicken.
Dabei handelt es sich um Floats. Ich muss jezt ein Protokoll aufbauen, das es mir ermöglicht die Datenintegrität sicher zu stellen und den Datentransfer zu regeln.
Bisher hatte ich es so gelöst, das bei jeder verbindung der Master ein Commando geschickt hat, dann hat der Slave auf das Kommando geantwortet, der Master hat daraufhin wieder Daten oder ein Kommando gesendet....
Mein Problem ist jezt, das ich dem Slave/Master auch mitteilen muss was er machen soll(Senden/Empfangen), um welche Daten/Datensatz es sich handelt, und dann die Daten senden.

MfG cloidnerux.

*I²C/TWI: http://de.wikipedia.org/wiki/I%C2%B2C
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Protokoll für den Transfer von Daten über I²C

Beitrag von Xin » Do Aug 13, 2009 3:49 pm

...und was genau ist das Problem bzw. die Frage?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Protokoll für den Transfer von Daten über I²C

Beitrag von cloidnerux » Do Aug 13, 2009 4:25 pm

...und was genau ist das Problem bzw. die Frage?
Wie baue ich jezt geschickt das bestehende Protokoll um, bzw wie sollte ich ein neues protokoll aufsetzten, das es mir ermöglicht, Daten und Komamndos zu senden, und auch der Empfänger erkennt, um wleche Daten und Kommandos es sich handelt.
Das mit den Kommandos ist ja halbwegs gelöst, aber nciht das mit den Daten.
Ich muss 8Byte floats mit erkunnung und Kommandos über eine 100Khz leitung schicken und das möglichst geschickt.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Protokoll für den Transfer von Daten über I²C

Beitrag von Xin » Do Aug 13, 2009 4:32 pm

cloidnerux hat geschrieben:
...und was genau ist das Problem bzw. die Frage?
Wie baue ich jezt geschickt das bestehende Protokoll um, bzw wie sollte ich ein neues protokoll aufsetzten, das es mir ermöglicht, Daten und Komamndos zu senden, und auch der Empfänger erkennt, um wleche Daten und Kommandos es sich handelt.
Das mit den Kommandos ist ja halbwegs gelöst, aber nciht das mit den Daten.
Ich muss 8Byte floats mit erkunnung und Kommandos über eine 100Khz leitung schicken und das möglichst geschickt.
Weder kenne ich Dein bisheriges Protokoll, noch die Probleme, die sich ergeben, wenn Du Deinem Kommando ein 8 Byte Float mitschickst.
Häufig sieht man gleiche Paketgrößen, da man dann die Größe des Pakets nicht mitteilen muss. Also wäre ein einfaches Protokoll, dass Du einen Header hast, indem Du beschreibst was Du mit dem Paket erreichen willst (also der Befehl) und einen Datenbereich, in dem die Daten liegen (also die Argumente).
Eventuell Checksummen.

Ansonsten gibt es halt die Möglichkeit eine Kommunikation aufzubauen, erstmal "Hallo" zu sagen und zu gucken, ob sich wer meldet, dem man Daten schicken könnte...

Das sind die absoluten Grundlagen eines Protokolls. Ist halt die Frage, was Du überhaupt brauchst, was Dein Protkoll leisten muss.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Protokoll für den Transfer von Daten über I²C

Beitrag von cloidnerux » Do Aug 13, 2009 4:56 pm

Das sind die absoluten Grundlagen eines Protokolls. Ist halt die Frage, was Du überhaupt brauchst, was Dein Protkoll leisten muss.
Also, erstmal nochmal zur Verbindung: ich Arbeite echt Lowlevel. Es werden immer 8 Bytes geschickt, das kann belibig oft wiederholt werden und am ende der Transmission wird halt ein Bestimtes zeichen gegeben, das heißt ich habe weder Paketgrößen, noch vorgegebene Daten. Die Verbindung ist halt so konzipiert, das es belibig viele Slaves gibt und einen Master. Jeder Slave hat eine Addresse, die der Master Anpricht. Es können auch mehrere Master an dem Bus sein, das ist aber komplizierter und wird bei mir nicht verwendet.
Der master Spricht jezt also die Addresse eines Slaves an und Authorisiert ihn zu Senden, bzw. zu Empfangen.

Das Protokoll muss also dem Slave, bzw Master, mitteilen, wie groß die Daten sind, um welche Daten es sich handelt und diese letztendes Senden. Dabei sollte
die Bezeichnung für die Daten möglichst Dynamisch sein, sodass ich nicht für jede Variable ein neues define machen muss.

Meine bisherige lösung sieht so aus, das ich ein verschiedenen Enums defines für verschiedene Kommandos und Antworten hatte, z.B Empfange Daten und Sende Daten...
Der Master beginnt also mit dem Senden eines Kommandos, wartet ab bis der Slave Antwortet, wertet dies aus, sendet wieder ein Kommando oder Daten
usw.
Also in etwa so:
M: Empfange Daten.
S: laenge
M: 1
S: Ok
M: 23
S: OK
ENDE
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Protokoll für den Transfer von Daten über I²C

Beitrag von Xin » Do Aug 13, 2009 5:20 pm

cloidnerux hat geschrieben:Das Protokoll muss also dem Slave, bzw Master, mitteilen, wie groß die Daten sind, um welche Daten es sich handelt und diese letztendes Senden. Dabei sollte die Bezeichnung für die Daten möglichst Dynamisch sein, sodass ich nicht für jede Variable ein neues define machen muss.

Meine bisherige lösung sieht so aus, das ich ein verschiedenen Enums defines für verschiedene Kommandos und Antworten hatte, z.B Empfange Daten und Sende Daten...
Der Master beginnt also mit dem Senden eines Kommandos, wartet ab bis der Slave Antwortet, wertet dies aus, sendet wieder ein Kommando oder Daten usw.
Also in etwa so: ...
Was hältst Du von

Code: Alles auswählen

M: |S1|PaketTyp|1|23...Leerdaten bis Paket voll|
S1: Ok
Empfänger, Pakettyp sagt an, dass Daten folgen und zwar ein Datum. Anschließend einen Block mit den Daten. Der Block sollte etwas über durchschnittlich groß sein, so dass die meisten Daten in einen Block passen und wenig Daten in zwei Paketen verschickt werden müssen. Werden mehr Daten übertragen, schickst Du ein zweites Paket. Das Paket wird an Slave 1 adressiert, die restlichen Slaves warten das Paket ab und schauen dann, ob das nächste Paket für sie bestimmt ist?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten