【问题标题】:How to `Serial.print()` "full" hexadecimal bytes?如何`Serial.print()`“完整”十六进制字节?
【发布时间】:2013-10-08 07:22:07
【问题描述】:

我正在编程Arduino,我正在尝试以“我的方式”以十六进制格式编写Serial.print() 字节(继续阅读以获取更多信息)。

即通过使用下面的代码

byte byte1 = 0xA2;
byte byte2 = 0x05;
byte byte3 = 0x00;

Serial.println(byte1, HEX);
Serial.println(byte2, HEX);
Serial.println(byte3, HEX);

我在串行监视器中得到以下输出:

A2
5
0

但是我想输出以下内容:

A2
05
00

换句话说,我想打印“完整”的十六进制值,包括 0s(05 而不是 000 而不是 0)。

我怎样才能做到这一点?

【问题讨论】:

  • 您可以将它们打印成正确格式的字符串,然后通过串口发送该字符串吗?
  • @Retired Ninja - “将它们打印成正确格式的字符串”是什么意思?我怎样才能做到这一点?
  • sprintf(buffer, "%02x", number); Serial.println(buffer);
  • 我怀疑 Arduino 是否支持sprintf
  • 我不熟悉它支持什么以及如何支持,但是快速谷歌让我相信 sprintf 是可用的,但不适用于浮点数,没有一些麻烦。还有一个可能对你有用:playground.arduino.cc/Main/Printf

标签: arduino hex byte println arduino-c++


【解决方案1】:

简单的暴力破解方法,就是写一个例程为:

void p(char X) {

   if (X < 16) {Serial.print("0");}

   Serial.println(X, HEX);

}

在主代码中:

p(byte1);  // etc.

【讨论】:

  • 使用sprintf 函数(正如@Retired Ninja 在之前的评论中所说)更简单......我为什么要使用你的代码?
  • @Backo,加载模块大小。也就是说,sprintf 为您的嵌入式系统生成了多少代码?如果你的草图变得太大,你将不得不放弃一些奢侈品。但是,对于一个小草图来说,任何作品显然都是可以接受的。
【解决方案2】:

试试这个:

//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';
}

在主代码中:

comand_mod=0xA1; //example variable
Serial.print(btohexa_high(comand_mod));
Serial.print(btohexa_low(comand_mod));

【讨论】:

    【解决方案3】:

    抱歉 - 没有足够的声誉来发表评论,但发现之前的答案并不完全正确。实际上,最好的编码方式应该是:

    void p(字节 X) { if (X 0) {Serial.print("0");} ...

    给出代码:

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

    在主代码中:

    p(byte1);  // etc.
    

    希望对你有帮助

    【讨论】:

    • X &lt; 10 ?可能有 16 个,但不是 10 个;
    • 同意,只需修改它以测试
    【解决方案4】:

    使用 sprintf 打印到缓冲区(每个字节两个字符 + 空终止符):

    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);
    

    在两者之间添加了新行以使每行都在新行上。关于 '%02x',% 表示这里有格式信息,0 表示用 0 填充,2 表示将输入填充到 2 个字符宽,x 表示给我这个十六进制。

    有关其他格式选项,请参阅http://linux.die.net/man/3/sprintf

    【讨论】:

      【解决方案5】:

      内存、代码和运行时占用最少的将是经典位播放

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

      在任何 8 位类型上都可以正常工作。对于任何其他掩码也是第一行

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

      【讨论】:

        【解决方案6】:

        哇! 7 年前,我觉得在这里,我的答案可能对您(希望不再)或其他像我一样寻找答案的人有用。

        使用“Serial.write()”通过串口发送一个十六进制字节。

        所有 Serial.print() 例如。 println、printf、sprint、print 将以 ASCII 格式“打印”您的值。

        【讨论】:

          猜你喜欢
          • 2015-08-08
          • 2013-09-20
          • 2017-08-23
          • 2017-09-13
          • 2020-11-11
          • 2018-03-21
          • 2023-03-14
          • 1970-01-01
          • 2021-04-12
          相关资源
          最近更新 更多