Forum: Mikrocontroller und Digitale Elektronik Variablen Splitten


von Max (Gast)


Lesenswert?

Hi Leute,
ich muss bei einer Datenübertragung zwei 12 Bit Messwerte Übertragen, 
hab dazu aber nur drei 8 Bit Variablen zur Verfügung. Heißt ich muss die 
Variablen splitten und der Empfänger muss diese wieder zusammen bauen.

Ich habs jetzt schon etliche male durchgedacht aber ich komm da auf 
keinen Fehler.

Das Problem was auftritt ist dass der erste Messwert (unten ValueOne) 
beim Empfänger als zweiter Messwert (unten ValueTwo) erkannt wird.

Könnt ihr mal drübersehen ob ihr evt. einen Fehler entdeckt?

Das beschreiben des Buffers geschieht wie folgt.
1
unsigned char IC_TxBuffer[8];
2
3
void fillBuffer(void){
4
  unsigned char temp;
5
  unsigned int tempWord;
6
  temp = 0;
7
  tempWord = 0;
8
9
  //Befüllen der ersten zwei Bytes ist OK
10
11
  tempWord = getValueOne() & 0x0FFF; //getValueOne() returned unsigned int 
12
  
13
  temp = (tempWord & 0x0FF0) >> 4;
14
  IC_TxBuffer[2] = temp;
15
16
  temp = (tempWord & 0x000F) << 4;
17
18
  tempWord = getValueTwo() & 0x0FFF;
19
  
20
  temp |= (tempWord & 0x0F00) >> 8;
21
  IC_TxBuffer[3] = temp;
22
23
  temp = (tempWord & 0x00FF);
24
  IC_TxBuffer[4] = temp;
25
26
  //Befüllen der restlichen Bytes funktioniert auch
27
28
}


Das Einlesen der Messwerte folgt sofort...

von Peter D. (peda)


Lesenswert?

Du brauchst ein Protokoll, damit sich der Empfänger auf die Pakete 
synchronisieren kann.

von Max (Gast)


Lesenswert?

Hier noch das Auslesen des Receive-Buffers
1
unsigned char IC_RxBuffer[8];
2
3
unsigned int valueOne;
4
unsigned int valueTwo;
5
6
void checkReceivedData(void){
7
  unsigned int tempWord;
8
  tempWord = 0;
9
10
  tempWord = IC_RxBuffer[2] << 4;
11
  tempWord |= (IC_RxBuffer[3] & 0xF0) >> 4;
12
13
  valueOne = tempWord;
14
  tempWord = 0;
15
16
  tempWord = (IC_RxBuffer[3] & 0x0F) << 8;
17
  tempWord |= IC_RxBuffer[4];
18
  
19
  valueTwo = tempWord;
20
}

mit freundlichen Grüßen
Max

von Peter II (Gast)


Lesenswert?

irgendwie sieht das sehr kompliziert aus
1
unsigned char IC_TxBuffer[8];
2
3
void fillBuffer(void){
4
  unsigned int temp1;
5
  unsigned int temp2;
6
7
  temp1 = getValueOne() & 0x0FFF;
8
  temp2 = getValueTwo() & 0x0FFF;
9
  
10
  IC_TxBuffer[2] = (temp1 >> 4);
11
  IC_TxBuffer[3] = ((temp1 & 0x0F ) << 4)| (temp2 >> 8);
12
  IC_TxBuffer[4] = (temp2 & 0xFF);
13
}

so in der Art, müsste es auch gehen.

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.