mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART DatenProtokoll


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin derzeit am Basteln einer kleinen UART Kommunikationsroutine.
Ich weiß das Thema gibts schon und ich habe auch die Suchfunktion 
bemüht, allerdings hab ich keinen Ansatz gefunden.

Ich nutze zum Senden der Daten von PC zu µC folgendes Protokoll:
STX|CMD|AL|A0|..|An|ETX
wobei AL die Länge des Attributs ist und A0..An die Attributdaten.

Gehandlet werden die Daten in einem struct das ich CtrlInterface genannt 
hab. Darin befindet sich ein State und ein FIFO Buffer für die 
empfangenen Daten.
In der UART ISR setze ich mit STX/ETX den State auf "RECEIVE"/"COMPLETE" 
daneben gibt es noch den "IDLE" state in dem auf den Beginn einer 
Übertragung gewartet wird (wird gesetzt wenn ein Kommando abgearbeitet 
wurde).
Die Daten möchte ich eigentlich binär übertragen und nicht in ASCII. 
Durch die State Machine hab ich keine Probleme mit dem Wert 0x02 (STX). 
0x03 (ETX) bereitet mir jedoch Probleme, da während des Empfangens einer 
Übertragung keine Daten mit dem Wert 0x03 gesendet werden können, sonst 
wird das natürlich als Ende der Übertragung angesehen.
 
ISR(USART_RX_vect)
{
  uint8_t uartRX = UDR0;
  switch(CtrlInterface.state)
  {
    case IDLE:
      // waiting for start of transmission
      if(uartRX == STX)
        CtrlInterface.state = RECEIVE;
      break;
    case COMPLETE:
      // trunk data
      break;
    case RECEIVE:
      // receiving data
      if(uartRX == ETX)
        CtrlInterface.state = COMPLETE;
      else
        fifo_push(CtrlInterface.pUSART_RX_Buf, uartRX);
  }  
}

Eine Möglichkeit wäre natürlich das Zählen der empfangenen Attribut 
Character. Das würde aber zu einem zusätzlichen Member in der 
CtrlInterface Struktur führen und etwas mehr Arbeit in der ISR 
verlangen. STX und ETX als Beginn und Ende einer Übertragung zu nutzen 
erscheint mir daher sauberer, mir fällt nur nicht ein wie ich das oben 
genannte Problem lösten könnte.
Nutzt man ETX nur wenn man Daten als ASCII Zeichen überträgt? Mir fällt 
momentan leider kein anderer Weg ein...

Viele Grüße
Stefan

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan schrieb:
> Die Daten möchte ich eigentlich binär übertragen und nicht in ASCII.
> Durch die State Machine hab ich keine Probleme mit dem Wert 0x02 (STX).
> 0x03 (ETX) bereitet mir jedoch Probleme, da während des Empfangens einer
> Übertragung keine Daten mit dem Wert 0x03 gesendet werden können, sonst
> wird das natürlich als Ende der Übertragung angesehen.
STX und ETX sind ASCII-Zeichen. Aus diesem Grund müssen bei einer mit 
STX-ETX gesteuerten Übertragung für die Nutzdaten auch ASCII-Zeichen 
verwendet werden (und zwar andere). Oder du mußt dir ein anderes 
Protokoll ausdenken. Einfach nur das schönste aus beiden Welten zu 
nehmen (ASCII und Binär) das geht nicht so ohne weiteres... :-o

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In Ordnung,

hätte ja sein können das man das noch irgendwie drehen kann :).
Danke für den Hinweis.. dann werde ich wohl doch ASCII zum Übertragen 
nutzen.

Viele Grüße
Stefan

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan schrieb:

> verlangen. STX und ETX als Beginn und Ende einer Übertragung zu nutzen
> erscheint mir daher sauberer, mir fällt nur nicht ein wie ich das oben
> genannte Problem lösten könnte.
> Nutzt man ETX nur wenn man Daten als ASCII Zeichen überträgt? Mir fällt
> momentan leider kein anderer Weg ein...

ETX darf dann in den Daten nicht vorkommen.
Kommt es trotzdem vor, dann darf man 0x03 eben nicht übertragen, sondern 
ein Ersatzzeichen dafür.

Du könntest zb definieren, das 0x03 nicht als 0x03 übertragen wird, 
sondern als 0xFF 0xFD. Damit der Empfänger das von einem tatsächlichen 
0xFF in den Daten unterscheiden kann, wird 0xFF als 0xFF 0xFE 
übertragen.

bekommt der Empfänger das zu sehen

   0x80 0xFF 0xFE 0x50

dann lauten die Daten, die der Sender übermitteln will 0x80 0xFF 0x50

bekommt der Empfänger zu sehen

  0x80 0xFF 0xFD 0x50

dann wollte der Sender eigentlich übertragen: 0x80 0x03 0x50

Da du eine schöne Statemachine hast, ist es beim Empfänger auch nicht 
weiter schwer, diese Rücksubstitution zu machen.

Autor: Heinzi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zählen dürfte der bei weitem schmerzloseste Ansatz sein,
das Prob zu lösen. Du überträgst ja schon die Länge, warum
dann nicht nutzen. Deine STX und ETX sind prinzipiell sowieso schon 
redundant.
Ansonsten wäre das Prob auch über escape chars zu lösen (z.b.
ETX doppelt zu übertragen, wenn es sich um ein ETX in den Daten handelt
und auf der Empfangsseite wieder entfernen).

h.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für Eure Anregungen.

Ich werde mal schaun wie groß der Aufwand mit ASCII Zeichen wird, hat 
vielleicht auch einen kleinen Vorteil zum Debuggen übers Hyperterminal. 
Ansonsten ist das mit den Ersatzzeichen eine interessante Idee!

Viele Grüße
Stefan

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.