Int/Hexwerte in Char schreiben



  • Hallo,

    ich habe ein Sendepuffer, der hexadezimal zusammengebaut werden muss. Dabei schaffe ich es einfach nicht, zwei berechnete Dezimalzahlen als int (hex) zu übergeben. Wie macht man das?

    char sendbuf[21] = "";
    

    Dazu habe ich noch vier Werte:

    int highbyte = 4;
    int middlebyte = 0;
    int lowbyte = 0;
    int power = 1350;
    

    Jetzt fülle ich den Sendepuffer:

    /* Header (6 Bytes) */
        sendbuf[0] = 0x06;
        sendbuf[1] = 0x10;
        sendbuf[2] = 0x04;
        sendbuf[3] = 0x20;
        sendbuf[4] = 0x00;
        sendbuf[5] = 0x15;
    
        /* ConnectionHeader (4 Bytes) */
        sendbuf[6] = 0x04;
        sendbuf[7] = 0x02;
        sendbuf[8] = 0x00;
        sendbuf[9] = 0x00;
    
        /* cEMI-Frame (11 Bytes) */
        sendbuf[10] = 0x11;
        sendbuf[11] = 0x00;
        sendbuf[12] = 0x0C;
        sendbuf[13] = 0xE0;
        sendbuf[14] = 0x00;
        sendbuf[15] = 0x00;
        sendbuf[16] = /* hier jetzt an stelle 16 und 17 die beiden berechneten Hexwerte (hex: 20 00) aus: highbyte * 2048 + middlebyte * 256 + lowbyte * 1 */
        sendbuf[17] = 
        sendbuf[18] = 0x01;
        sendbuf[19] = /* hier jetzt an stelle 19 und 20 die beiden berechneten Hexwerte (hex: 05 46) aus der variable power (dezimal 1350) */
        sendbuf[20] =
    

    Kann mir jemand helfen?

    Danke!!!



  • Schau dir mal die binären Operatoren an: | & << >> (oder und links-schieben rechts-schieben)
    Nimm noch ^ und ~ mit dazu.

    sendbuf[19] =  power & 0xff;
    sendbuf[20] = (power >> 8)  & 0xff;
    

    oder umgekehrt. Ich weiß nicht wo das LSB hin soll.

    Das lowbyte kannst du ganz einfach so übernehmen.

    sendbuf[16] = lowbyte;
    sendbuf[17] = highbyte * (2048/256) + middlebyte;
    

    Wo kommt denn die 2048 vom highbyte her?



  • int value = 0x2000;
    sendbuf[16] = value >> 8;
    sendbuf[17] = value;
    

    Wobei ich merkwürdig finde, dass du ein High-, ein Middle- und ein Lowbyte hast und daraus zwei Bytes machst.



  • Vielen Dank für die superschnelle Hilfe. Es ging sofort. Brauchte diesen cEMI String für einen KNX-UDP-Broadcast auf ein IP Router zum KNX Bus. Alle Aktoren empfangen nun dem im haus verfügbaren Strom (power) und reagieren darauf, wenn gewünscht.

    Ich musst es drehen, da die bytes wirklich andersherum ankommen müssen.

    address = highbyte * 2048 + middlebyte * 256 + lowbyte * 1;
    
    .
    .
    .
    sendbuf[16] = (address >> 8)  & 0xff;
    sendbuf[17] = address & 0xff;
    .
    sendbuf[19] = (power >> 8)  & 0xff;     /* data */
    sendbuf[20] = power & 0xff;             /* data */
    

    Das high, middle und lowbyte ist aus einem String extraiert. "4/0/0" und es handelt sich dabei um eine KNX Adresse.

    Brechnung: 4/0/0: (4*2048) + (0*256) + (0*1) = 8192 = 20 00


Log in to reply