HEX Konverter - für XBee

Hallo,

ich versuche seit mehreren Tagen einen HEX-Konverter zu produzieren.

Ich habe auch schon google gemartert, aber das Ding brachte auch keine verwertbaren Ergebnisse raus…

Hintergrund:
Ich möchte meinen eigenen Daten über XBee schicken - und XBee verwendet nun mal HEX (warum auch immer…)

Setting: Controller - verschickt die aktuelle Uhzeit an einen anderen Router.

Beide (Controller und Router) sind im API Modus und hängen mittels XBee-Shield von Sparkfun (also D2 und D3) an einen Arduino UNO.

Ich bau mir also eine eigenes API-Paket, damit ich meine Daten schicken kann, jedoch hab ich das Problem, das ich mit NewSoftSerial zwar die Ausgabe auf HEX umstellen kann, mir das aber nichts bringt, da ich ja mit den ganzen geschickten Paketen eine Checksumme machen muss, die (soweit meine Versuche zeigten) in HEX sein muss:

Beispielcode:

#include <Time.h>
#include <NewSoftSerial.h>

NewSoftSerial myserial(2, 3);


int h1 = 0;
int h2 = 0;
int sec_temp = 0;

void setup(){
  Serial.begin(9600);
  setTime(23,14,0,1,1,11);
  myserial.begin(9600);
  Serial.print(" ");
  Serial.println("Booting done");
}


void loop(){
  if (sec_temp != second()){
    Serial.print("Second in dec: ");
    Serial.println(second());
    Serial.print("Second in hex: ");
    Serial.println(h1, HEX);
    Serial.print("Secon in hex2: ");
    Serial.println(stringone);*/
    Serial.print("0x");
    Serial.print(h2, HEX);
    Serial.println(h1, HEX);
    xsendtime();
    sec_temp = second();
    
  }
  
  
}

byte xtrans(byte value){
  myserial.print(value, BYTE);
  //Serial.print(value, HEX); //Debug-Option
  delay(10);
  return value;
}

void xsendtime(){
  xtrans(0x7E); // - 0
  xtrans(0x00); // MSB - 1
  xtrans(0x14); // LSB = 20 - 2
  long xcsum = 0;
  xcsum += xtrans(0x10); // Frame Type - 3
  xcsum += xtrans(0x01); // Fram ID - 4
  xcsum += xtrans(0x00); // Destionation - 5
  xcsum += xtrans(0x13); // Destionation - 6
  xcsum += xtrans(0xA2); // Destionation - 7
  xcsum += xtrans(0x00); // Destionation - 8
  xcsum += xtrans(0x40); // Destionation - 9
  xcsum += xtrans(0x69); // Destionation - 10
  xcsum += xtrans(0x6C); // Destionation - 11
  xcsum += xtrans(0xEB); // Destionation - 12
  xcsum += xtrans(0x86); // Destionation - 16 Bit - 13
  xcsum += xtrans(0x4E); // Destionation - 16 Bit - 14
  xcsum += xtrans(0x00); // Broadcast Radius - 15
  xcsum += xtrans(0x00); // Options - 16
  
  // Functional
  xcsum += xtrans(0x01); // RF Data - 17
  xcsum += xtrans(0x02); // RF Data - 18
  xcsum += xtrans(0x03); // RF Data - 19
  xcsum += xtrans(0x04); // RF Data - 20
  xcsum += xtrans(0x05); // RF Data - 21
  xcsum += xtrans(0x06); // RF Data - 22
   
  // Checksum
  
  xtrans( 0xFF - (xcsum & 0xFF)); // Checksum - 23
}

Das funktioniert und ich erhalte auf der anderen Seite 1, 2, 3, 4, 5, 6

Jetzt würde ich aber gerne den Wert von second() und month() usw. gerne übertragen, was mir (geistig?) nicht möglich ist…

Meine Versuche:

void hexa_split(int hval){
  if (hval > 15){
    int h2_temp  = hval / 15;
    h2 = hexa(h2_temp);
    int h1_temp = hval - (15 * h2_temp);
    h1 = hexa(h1_temp);
  }
  else{
    h1 = hexa(hval);
  }
}

int hexa(int hexv){
    if (hexv < 16){
    switch (hexv){
      case 0:
      return 0x00;
      case 1:
      return 0x01;
      break;
      case 2:
      return 0x02;
      break;
      case 3:
      return 0x03;
      break;
      case 4:
      return 0x04;
      break;
      case 5:
      return 0x05;
      break;
      case 6:
      return 0x06;
      break;
      case 7:
      return 0x07;
      break;
      case 8:
      return 0x08;
      break;
      case 9:
      return 0x09;
      break;
      case 10:
      return 0x0A;
      break;
      case 11:
      return 0x0B;
      break;
      case 12:
      return 0x0C;
      break;
      case 13:
      return 0x0D;
      break;
      case 14:
      return 0x0E;
      break;
      case 15:
      return 0x0F;
      break;
    }
  }
  else{
  Serial.println("Out or range!");
  }
}

Hat einen Fehler bei 15 - gibt 15 nicht aus - ausserdem: wie kriege ich h1 und h2 in eine int zusammen? Ausserdem ists bei 15 auch aus (somit hätte eine Stunde, Minute, Sekunde nur max. 15…)

Versuch 2:

int hexbridge(int hval1){
  if (hval1 > 16){
    byte h1 = hexconv(hval1 % 16);
    byte h2 = hexconv(hval1 - (16 - (hval1 / 16)));
  }
  else{
    byte h1 = hexconv(hval1);
  }
}


byte hexconv(byte tohex){
  switch(tohex)
  {
    case 0: return 0;
    case 1: return 1;
    case 2: return 2;
    case 3: return 3;
    case 4: return 4;
    case 5: return 5;
    case 6: return 6;
    case 7: return 7;
    case 8: return 8;
    case 9: return 9;
    case 10: return A;
    case 11: return B;
    case 12: return C;
    case 13: return D;
    case 14: return E;
    case 15: return F;
  }
}

Verweigert das kompilieren…

Ich steh leider echt an…

Hat irgendwer einen Ansatz, Beispiel, funktionierenden Sketch?

Ich bin ratlos und dankbar für jede Art von Hilfe

Björn

Da hast Du mal was prinzipiell falsch verstanden.

Hexadezimal, dezimal, oktal oder binär sind Darstellungverfahren für den Menschen von Zahlen. XBee wird über die serielle Schnittstelle mit 8-Bit Zahlen beliefert und gibt diese am anderen XBee aus. Wie Du die dann ausdruckst oder weiterverarbeitest ist Deine Sache.

Grüße Uwe

Auf die Gefahr hin, das ich mich jetzt komplett blamiere...

Mit 8-Bit Zahlen meinst du: http://de.wikipedia.org/wiki/Byte-Reihenfolge oder bin ich da schon wieder auf eine hölzernen Weg?

so funktionierts jetzt - danke.

void xsendtime(){
  xtrans(0x7E); // - 0
  xtrans(0x00); // MSB - 1
  xtrans(0x14); // LSB = 20 - 2
  long xcsum = 0;
  xcsum += xtrans(0x10); // Frame Type - 3
  xcsum += xtrans(0x01); // Fram ID - 4
  xcsum += xtrans(0x00); // Destionation - 5
  xcsum += xtrans(0x13); // Destionation - 6
  xcsum += xtrans(0xA2); // Destionation - 7
  xcsum += xtrans(0x00); // Destionation - 8
  xcsum += xtrans(0x40); // Destionation - 9
  xcsum += xtrans(0x69); // Destionation - 10
  xcsum += xtrans(0x6C); // Destionation - 11
  xcsum += xtrans(0xEB); // Destionation - 12
  xcsum += xtrans(0x86); // Destionation - 16 Bit - 13
  xcsum += xtrans(0x4E); // Destionation - 16 Bit - 14
  xcsum += xtrans(0x00); // Broadcast Radius - 15
  xcsum += xtrans(0x00); // Options - 16
  
  // 6x RF DATA
  
  xcsum += second();
  xcsum += second();
  xcsum += second();
  xcsum += second();
  xcsum += second();
  xcsum += second();
  myserial.print(second(), BYTE);
  myserial.print(second(), BYTE);
  myserial.print(second(), BYTE);
  myserial.print(second(), BYTE);
  myserial.print(second(), BYTE);
  myserial.print(second(), BYTE);

  // Checksum*/
  xtrans( 0xFF - (xcsum & 0xFF)); // Checksum - 23