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?
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 ); |
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.