Protokoll für Serialle Kommunikation

OP #4546258
Lesenswert?
• ▲
▼
Hallo,
meine Frage ist wie implementiere ich eine Serielle Schnittstelle 
richtig? Ich würde es halt hin bekommen dass, das ganze "funktioniert" 
aber wie macht man es richtig?
Macht es wirklich Sinn ein Protokoll wie HDLC auf einen Mikrocontroller 
komplett zu implementieren?

Die Anforderungen:
- Der Atmega 328 nutzt ein wenig I2C und ließt 4 analoge Werte aus
- PC->µC Sendet ein paar Einstellungen (vielleicht 100 Bytes)
- µC->PC Sendet ca jede Sekunden Sensordaten 4 Bytes und hin und wieder 
die Einstellungen zur Kontrolle (~100Bytes)


Jetzt habe ich schon lauter Fragen wie:
- Sende ich immer 100 Bytes oder teile ich das ganze logisch auf?
- Sollte ich 9 Bits senden und das 9. Bit als Start/Stop Bit nehmen.
- Das senden von ASCII finde ich nicht so schön oder ist es noch die 
beste Wahl?
- Wie sollten Start/Stop Bits aussehen? (Die Daten können von 0-255 
reichen       also ist 0xFF nicht möglich)
- Implementiert man am besten das erkennen von Fehlern beim 
Senden/Empfangen und sendet die Daten dementsprechend neu? Oder doch 
lieber Checksumme prüfen und bei Fehlern eine Sekunde warten bis neue 
Daten kommen.


Hat jemand vielleicht ein Projekt mit ähnliche Anforderungen und kann 
mir den Quellcode als Beispiel zeigen?

mfG
Oliver
OP #4546296
Lesenswert?
• ▲
▼
nemesis... schrieb:
> Ich würde erst mal die Grundlagen verstehen lernen.
> Die müssen hier nicht im Forum nicht neu gepredigt werden.
>
> https://de.wikipedia.org/wiki/RS-232
>
> Wenn dann ein Problem auftaucht, kannst du noch mal gezielt
> nachfragen.

Ich bin mir nicht ganz sicher was ich da nicht verstanden habe. RS232 
legt ja nicht fest was für ein Protokoll man verwendet. Bzw. es hat so 
gar nicht mit Paketen zutun oder habe ich da doch was falsch verstanden?

Kaj schrieb:
> Das kommt drauf an...

Ich hatte ja schon einige Anforderungen aufgezählt welche wären noch 
nötig für eine Sinnvolle Entscheidung? Das ganze Projekt ist nicht super 
Kritisch also es hängt kein Leben davon ab oder so :D Aber sollte schon 
recht zuverlässig funktionieren. Das ganze ist auch mehr ein Hobby 
Projekt und wird nicht in Serie gehen.
Gast #4546311
Lesenswert?
• ▲
▼
Beispiel:

*D12,34,56,129#
*C74,"Hello World",17,9600#

*  Startmarkierung
D  Datensatz folgt
C  Config folgt
,  Trenner zwischen Daten
#  Ende des Datensatzes

Sender und Empfänger können unabhängig voneinander mit einem simplen 
Terminalprogramm entwickelt und getestet werden. Prüfsummen kannst Du 
später problemlos hinzufügen.
OP #4546326
Lesenswert?
• ▲
▼
Dauergast schrieb:
> Beispiel:
>
> *D12,34,56,129#
> *C74,"Hello World",17,9600#
>
> *  Startmarkierung
> D  Datensatz folgt
> C  Config folgt
> ,  Trenner zwischen Daten
> #  Ende des Datensatzes
>
> Sender und Empfänger können unabhängig voneinander mit einem simplen
> Terminalprogramm entwickelt und getestet werden. Prüfsummen kannst Du
> später problemlos hinzufügen.

Ok also die ASCII variante. Wie wendet man das dann richtig beim 
Mikrocontroller an. Einfach mit if-else Abfragen mit strcmp?
#4546335
Lesenswert?
• ▲
▼
Tja Du hast ziemlich viel nicht gesagt.

Bei der Auswahl des Protokolls spielen viele Faktoren eine Rolle.
100 Bytes besagen Garnichts. Ohne ein paar Zusatzinformationen. So z.B.
100 Bytes pro Jahr, pro Woche oder pro Millisekunde?
Wie wichtig ist eine fehlerfreie Übertragung?
Ist Platz für eine Typkennung vorhanden? Mehr Daten.
Ist Platz für eine Prüfsumme vorhanden? Mehr Daten.
Kann der Datensatz wiederholt werden? Übertragungsunterbrechung für 
Wiederholung. Bidirektionales Arbeiten. Quittungsbetrieb.
Ändern sich ein paar oder alle Daten häufig?
Wie gestört ist der Arbeitsplatz? Übertragungsqualität, Wiederholungen.
Wie weit sollen die Daten übertragen werden?

und dabei habe ich wohl noch die Hälfte vergessen...
Gast #4546434
Lesenswert?
• ▲
▼
Sebastian S. schrieb:
> und dabei habe ich wohl noch die Hälfte vergessen...

Naja, aufgrund der Angaben im Ausgangspost wäre er mit ASCII zum 
Auslesen von Sensoren selbst bei 9600 sehr gut unterwegs.

Wenn es dann um Raumschiffsteuerungen oder den Vertrieb nach Nordkorea 
geht, sollte man Deine Überlegungen sicherlich nochmal rekapitulieren :)
Gast #4546531
Lesenswert?
• ▲
▼
Oliver S. schrieb:
> Die Anforderungen:
> ...
> - PC->µC Sendet ein paar Einstellungen (vielleicht 100 Bytes)
> - µC->PC Sendet ca jede Sekunden Sensordaten 4 Bytes und hin und wieder
> die Einstellungen zur Kontrolle (~100Bytes)

Sebastian S. schrieb:
> 100 Bytes besagen Garnichts. Ohne ein paar Zusatzinformationen. So z.B.
> 100 Bytes pro Jahr, pro Woche oder pro Millisekunde?

Was ist an "jede Sekunden Sensordaten 4 Bytes" und "hin und wieder die 
Einstellungen" so schwer zu verstehen?

Wenn die Sensordaten mit 4 Byte/s kommen, kannst du wohl davon ausgehen, 
dass "hin und wieder" von Millisekunden weit entfernt ist. Und relativ 
zur Datenrate ist es dann egal, ob 100 Bytes pro Jahr oder pro Woche.
Gast #4546637
Lesenswert?
• ▲
▼
Oliver S. schrieb:
> Ich hatte ja schon einige Anforderungen aufgezählt welche wären noch
> nötig für eine Sinnvolle Entscheidung? D

Du solltest dir erstmal selbst im klaren werden was du überhaupt mit 
"Protokoll meinst" und welche Anforderungen dies dann erfüllen soll.

Vereinfacht gesagt gibt es da bei einer Datenübertragung durchaus mehrer 
die aufeinander aufbauen:
https://de.wikipedia.org/wiki/OSI-Modell

Die bis jetzt hier gegebenen Antworten springen kreuz und quer von Layer 
eins bis hin zu Tipps für Layer sieben lustig umher ohne das du 
überhaupt definiert hast was du überhaupt genau haben willst.
OP #4546736
Lesenswert?
• ▲
▼
Peter M. schrieb:
> Oliver S. schrieb:
>> Einfach mit if-else Abfragen mit strcmp?
>
> Das macht man mit einem switch() Statement innerhalb einer Statemachine.
Also in etwas so?
1
int state = 0;
2
while(true)
3
{
4
  switch(state)
5
  {
6
    case 0:
7
      if(nextByte == sstart byte) state = 1;
8
    break;
9
    case 1:
10
      if(nextByte == setting pwm1) state = 20;
11
    break;
12
    case 2:
13
      if(nextByte == setting pwm2) state = 21;
14
    break;
15
    ...
16
    ...
17
    ...
18
    case 20:
19
      byte temp = nextByte;
20
      if(checkCRC(nextByte))
21
        changePWM(temp);
22
      else
23
        requestResend(setting pwm1);
24
      state = 0;
25
    break;
26
  }
27
}

Scheint wohl das ASCII die richtig Wahl zu seien scheint bei meinen 
Anforderungen.

PPP schrieb:
> Du kannst dich auch von PPP inspirieren lassen:
> https://technet.microsoft.com/en-us/library/cc957975.aspx

Ok danke. Ist aber HDLC auch sehr ähnlich.

W.A. schrieb:
> Was ist an "jede Sekunden Sensordaten 4 Bytes" und "hin und wieder die
> Einstellungen" so schwer zu verstehen?
>
> Wenn die Sensordaten mit 4 Byte/s kommen, kannst du wohl davon ausgehen,
> dass "hin und wieder" von Millisekunden weit entfernt ist. Und relativ
> zur Datenrate ist es dann egal, ob 100 Bytes pro Jahr oder pro Woche.

Ich hätte mich wohl genau ausdrücken müssen. Wobei ich mir bei vielen 
noch gar nicht so sicher bin. So oder so werde ich wohl keine große 
Bandbreite benötigen.

Irgendwer schrieb:
> Die bis jetzt hier gegebenen Antworten springen kreuz und quer von Layer
> eins bis hin zu Tipps für Layer sieben lustig umher ohne das du
> überhaupt definiert hast was du überhaupt genau haben willst.

Mein Frage bezieht sich wohl eher auf die Schicht 2. Wobei ich mich wohl 
ein paar mal vertan hab und von Paketen gesprochen habe.

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