Arduino:如何打印定义常量的值?

时间:2015-12-01 15:50:48

标签: c arduino constants arduino-ide

我在Arduino(1.6.5)环境中编写代码。在我的代码中,我希望能够定义一个字符串值,然后将它和Serial.println()一起使用到串行控制台。

例如:

#define THEVAL 12345      // Define the value
...
v = v + THEVAL;     // Use the value in code.
...
Serial.println("The value is: #THEVAL");      // Show the value to user (for debugging)

但是,编译器不会替换引用字符串中的常量。我还尝试了this(C ++ stringification),它表示你将常量放在引用的字符串

#define THEVAL 12345
...
Serial.println("This is the value: " #THEVAL);

但是会产生一个" Stray#字符"编译器中的错误。

我很感激任何见解!谢谢!

编辑:奇怪的行为

在测试中,我发现了以下内容: (注意:IP地址使用逗号分隔八位字节,因为每个八位字节作为单独的参数传递给字节数组中的EthernetServer.begin(byte ip [] = {a,b,c,d})

#define IP_ADDRESS 192,168,1,1
#define IP_ADDRESS_STRING(a,b,c,d) xstr(a)"."xstr(b)"."xstr(c)"."xstr(d)
#define xstr(a) str(a)
#define str(a) #a

如果我执行以下操作,则会收到错误" IP_ADDRESS_STRING需要4个参数,但只有一个参数"

debug("IP Address is: " IP_ADDRESS_STRING(IP_ADDRESS));

但如果我执行以下操作,则会收到错误" macro' str'传递了4个参数,但只需要1"

debug("IP ADDRESS: " xstr(IP_ADDRESS));

但如果我这样做,它就有效:

String ipAddressString(int a, int b, int c, int d)
{
    return String(a) + "." + String(b) + "." + String(c) + "." + String(d);
}

debug("IP Address is: " + ipAddressString(IP_ADDRESS));

我很困惑 - 为什么一个宏认为IP_ADDRESS是一个参数,另一个宏认为它是4个参数,而函数正常工作:它看到4个参数?

4 个答案:

答案 0 :(得分:1)

#define XSTR(s) STR(s)
#define STR(s) #s
....
#define THEVAL 12345
....
Serial.println("The value of " STR(THEVAL) " is " XSTR(THEVAL));

这将输出:

The value of THEVAL is 12345

答案 1 :(得分:1)

#define XSTR(s) STR(s)
#define STR(s) #s
....
#define THEVAL 12345
....
Serial.println("The value of " STR(THEVAL) " is " XSTR(THEVAL));
     

但如果THEVAL设置为123,456,则会失败。

稍作修改也可以:

#define STR(...) #__VA_ARGS__

答案 2 :(得分:0)

建议

Serial.print("This is the value: ");
Serial.println( THEVAL );

int x = THEVAL;
Serial.print("This is the value: ");
Serial.println( x );

答案 3 :(得分:0)

  

我很困惑 - 为什么一个宏认为IP_ADDRESS是单个的   参数,另一个宏认为它是4个参数,而   函数正常工作:它看到4个参数?

在调用IP_ADDRESS_STRING(IP_ADDRESS)中,显然只有一个参数IP_ADDRESS,无论IP_ADDRESS如何定义,都是如此,因为参数替换发生了 仅在 之后才能识别调用类似函数的宏的参数(ISO / IEC 9899:201x)。

在具有定义xstr(IP_ADDRESS)的调用#define xstr(a) str(a)中,根据上述内容,参数a将替换为之后的一个参数IP_ADDRESS >该宏已已扩展宏已替换),产生str(192,168,1,1),因此str传递了4个参数。

与第一种情况相反,在函数调用ipAddressString(IP_ADDRESS)中,IP_ADDRESS的替换不会发生,而之前发生函数调用的参数。

您可以使用与xstr() / str()一起使用的相同两阶段技术来使用宏:

#define IP_ADDRESS 192,168,1,1
#define XIP_ADDRESS_STRING(abcd) IP_ADDRESS_STRING(abcd)
#define IP_ADDRESS_STRING(a,b,c,d) xstr(a)"."xstr(b)"."xstr(c)"."xstr(d)
#define xstr(a) str(a)
#define str(a) #a
debug("IP Address is: " XIP_ADDRESS_STRING(IP_ADDRESS));