mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Daten Protokoll selbst erstellen?


Autor: Michi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,
ich bin dabei eine Sender zu bauen und die Daten müssen mit einem 
ganzbestimmten Protokoll (Blockparität) gesendet werden. Um die Daten 
zusenden muss man foldendes machen:

Gesendet wird ein A als Hex dann ein a als Hex dann wird das bit Muster 
mit einem Exklusiv oder verknüpft also:

Anfang

01000001  A
01100001  a
00100000      Prüfsumme1 aus A und a wird nicht gesendet
00110001  1
00010001      Prüfsumme2 aus Prüfsumme1 und 1 wird nicht gesendet
00110001  1
00100000      Prüfsumme3 aus Prüfsumme2 und 1 wird nicht gesendet
01000001  A
01100001      Prüfsumme4 aus Prüfsumme3 und A wird nicht gesendet
00110001  1
01010000      Prüfsumme5 aus Prüfsumme4 und 1 wird nicht gesendet

Datenteil

Im Datenteil wird der Buchstabe den ich senden möchte immer mit der 
forderen Prüfsumme "Exklusiv oder" verknüpft und bildet die nächste 
Prüfsumme des nächsten Buchstaben, es können 11 Buchstaben gesendet 
werden.


Und zum schluss wird dann ....

00001010
01101010
00001010
01100000
00001010
01101010
00001101
01100111
00011000

               gesendet.

Also den Anfang und das Ende kann ich ja einfach in einer Funktion 
ablegen und an den Anfang und an der Ende eine Nachricht anfügen. Aber 
ich komme mit der den Datenteil nicht zurecht, ich möchte einfach 
schreiben "ABC" und mein Programm soll alles automatisch machen.

Kann mir jemand helfen?

Autor: wursti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Kann mir jemand helfen?

Nö ;)

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

Bewertung
0 lesenswert
nicht lesenswert
Michi wrote:

> Also den Anfang und das Ende kann ich ja einfach in einer Funktion
> ablegen

wozu? Verkompliziert das ganze doch nur.
Ausserdem kommt mir das komisch vor, dass du davon sprichst, dass 11 
BUchstaben gesendet werden können. Woher weiß der Empfänger, wieviele 
Buchstaben tatsächlich gesendet wurden. In dem Zusammenhang fällt mir 
dann sofort auf, dass am Anfang vom Sender gesendet wird "Aa11A1". Da 
taucht die 11 wieder auf. Kann es sein, dass der Sender hier hinterlegt, 
wieviele Datenbytes er zu senden gedenkt?

Ansonsten ist das doch simpel:
void SendDaten( unsigned char* Daten, int Len )
{
  int i;
  unsigned char Code;

  // Präambel schicken
  SendByte( 'A' );
  SendByte( 'a' );
  SendByte( '1' );
  SendByte( '1' );
  SendByte( 'A' );
  SendByte( '1' );

  Code = 0b01010000;   // Ist konstant, da ja auch die Praemabel
                       // konstant ist

  // Daten senden
  for( i = 0; i < Len; ++i ) {
    SendByte( Daten[i] ^ Code;
    Code = Code ^ Daten[i];
  }

  // Paketabschluss senden
  SendByte( 0b00001010 );
  SendByte( 0b01101010 );
  SendByte( 0b00001010 );
  SendByte( 0b01100000 );
  SendByte( 0b00001010 );
  SendByte( 0b01101010 );
  SendByte( 0b00001101 );
  SendByte( 0b01100111 );
  SendByte( 0b00011000 );
}

 ....

 SendDaten( "ABC", 3 );

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Michi,

ich habe mir mal sowas zusammengebaut und bin wie folgt vorgegangen ist 
vielleicht nicht perfekt aber es funktioniert.
Als erstes habe ich mir eine Staus Variable bei der Jedes Bit eine 
Bedeutung hat die oberen 4 Bit fürs senden und die unteren fürs 
empfangen.

00000001 --> bedeutet das es wir weder gesendet noch empfangen
00000011 --> erstens Zeichen empfangen
00000010 --> Daten werden empfangen
00000100 --> alle daten empfangen Daten prüfen
00001000 --> ACK senden NCK senden etc.
00000001 --> Schnittstelle wieder frei
00010000 --> erstes Byte senden
00100000 --> weitere Daten senden
01000000 --> Datensatz komplett gesendet
10000000 --> Warten auf ACK
00000001 --> Schnittstelle wieder frei.

Ich habe die Daten immer in ein Array geschrieben und danach immer per 
Interrupt alle Daten automatisch gesendet der Empfang geschieht auch per 
Interrupt und speichern in ein Array.
In main immer darauf prüfen ob etwas im Empfangsarray steht und der 
Status korrekt ist danach die Daten prüfen ..... .
Bei meinem Protokoll hat das 2 Byte immer angegeben wieviele Datenbytes 
übertragen werden somit wüsste ich immer ob alles empfangen wurde.

Wie gesagt ob es eine gute Lösung ist weis ich nicht bin auch nur 
Hobbymässig unterwegs aber immerhin läuft das Protokoll nun schon seit 
einem Jahr ohne Probleme.
Natürlich arbeite ich mit 2 Schnittstellen gleichzeitig.

Gruß

Tom

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.