How to `Serial.print()` “full” hexadecimal bytes?

前端 未结 6 1963
猫巷女王i
猫巷女王i 2021-01-18 02:17

I am programming Arduino and I am trying to Serial.print() bytes in hexadecimal format \"the my way\" (keep reading for more information).

That is, by u

相关标签:
6条回答
  • 2021-01-18 02:59

    Use sprintf to print into a buffer (two chars per byte + null terminator):

    byte byte1 = 0xA2;
    byte byte2 = 0x05;
    byte byte3 = 0x00;
    char s[7];
    sprintf(s, "%02x\n%02x\n%02x", byte1, byte2, byte3);
    Serial.println(s);
    

    Added new lines in between to get each on new line. About '%02x', the % means here comes formatting information, 0 means to pad with 0, 2 means pad input until 2 characters wide and x means give me this as hexadecimal.

    For other formatting options see http://linux.die.net/man/3/sprintf

    0 讨论(0)
  • 2021-01-18 03:00

    Try this:

    //Converts the upper nibble of a binary value to a hexadecimal ASCII byte.
    //For example, btohexa_high(0xAE) will return 'A'.
    unsigned char btohexa_high(unsigned char b)
    {
        b >>= 4;
        return (b>0x9u) ? b+'A'-10:b+'0';
    }
    
    
    //Converts the lower nibble of a binary value to a hexadecimal ASCII byte.
    //  For example, btohexa_low(0xAE) will return 'E'.
    
    
    unsigned char btohexa_low(unsigned char b)
    {
        b &= 0x0F;
        return (b>9u) ? b+'A'-10:b+'0';
    }
    

    And in main code:

    comand_mod=0xA1; //example variable
    Serial.print(btohexa_high(comand_mod));
    Serial.print(btohexa_low(comand_mod));
    
    0 讨论(0)
  • 2021-01-18 03:04

    Simple brute force method, is to write a routine as:

    void p(char X) {
    
       if (X < 16) {Serial.print("0");}
    
       Serial.println(X, HEX);
    
    }
    

    And in the main code:

    p(byte1);  // etc.
    
    0 讨论(0)
  • 2021-01-18 03:10

    sorry - not enough reputation to comment but found previous answer is not fully correct. Actually, the nice light way to code it should be :

    void p(byte X) { if (X < 10) {Serial.print("0");} ...

    giving the code:

    void p(byte X) {
    
       if (X < 10) {Serial.print("0");}
    
       Serial.println(X, HEX);
    
    }
    

    And in the main code:

    p(byte1);  // etc.
    

    hope this helps

    0 讨论(0)
  • 2021-01-18 03:12

    wow! 7 years ago and I felt here, my answer might be useful for you (hopefully not anymore) or others looking for the answers like me.

    Use "Serial.write()" to send a hex byte over serial.

    All Serial.print() eg. println, printf, sprint, print will "print" your value in ASCII.

    0 讨论(0)
  • 2021-01-18 03:20

    The lowest footprint in Memory, Code and runtime would be classic bit playing

    byte b;
    Serial.print(b>>4,  HEX);
    Serial.print(b&0x0F,HEX);
    

    Which is working fine on any 8bit type. For any other mask also the first line to

    Serial.print((b>>4)&0x0F,  HEX);
    
    0 讨论(0)
提交回复
热议问题