Forum: Mikrocontroller und Digitale Elektronik Daten Protokoll selbst erstellen?


von Michi (Gast)


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?

von wursti (Gast)


Lesenswert?

>Kann mir jemand helfen?

Nö ;)

von Karl H. (kbuchegg)


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:
1
void SendDaten( unsigned char* Daten, int Len )
2
{
3
  int i;
4
  unsigned char Code;
5
6
  // Präambel schicken
7
  SendByte( 'A' );
8
  SendByte( 'a' );
9
  SendByte( '1' );
10
  SendByte( '1' );
11
  SendByte( 'A' );
12
  SendByte( '1' );
13
14
  Code = 0b01010000;   // Ist konstant, da ja auch die Praemabel
15
                       // konstant ist
16
17
  // Daten senden
18
  for( i = 0; i < Len; ++i ) {
19
    SendByte( Daten[i] ^ Code;
20
    Code = Code ^ Daten[i];
21
  }
22
23
  // Paketabschluss senden
24
  SendByte( 0b00001010 );
25
  SendByte( 0b01101010 );
26
  SendByte( 0b00001010 );
27
  SendByte( 0b01100000 );
28
  SendByte( 0b00001010 );
29
  SendByte( 0b01101010 );
30
  SendByte( 0b00001101 );
31
  SendByte( 0b01100111 );
32
  SendByte( 0b00011000 );
33
}
34
35
 ....
36
37
 SendDaten( "ABC", 3 );

von Tom (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.