2015-12-01 3 views
1

Я пишу код в среде Arduino (1.6.5). В моем коде я хочу иметь возможность определить строковое значение, а затем использовать его, а также Serial.println() на последовательной консоли.Arduino: Как распечатать значение определенных констант?

Например:

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

но которая дает ошибку «Бродячая # символ» в компиляторе.

Буду признателен за понимание! Благодаря!

РЕДАКТИРОВАТЬ: Странное поведение

На тестировании я обнаружил следующее: (Примечание: IP-адрес использует запятые для разделения октетов, потому что каждый октет передается в виде отдельного параметра к EthernetServer.begin в массив байтов (байт ф [] = {а, б, в, г})

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

, но если я делаю следующее, я получаю ошибку «„ул“макросъемки прошло 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 аргумента?

+0

Я нашел это: http://stackoverflow.com/questions/2653214/stringification-of-a -macro-value, но он не работает, если константа имеет запятую. Например: #define THEVAL 1,2,3 –

+0

[this] (https://gcc.gnu.org/onlinedocs/cpp/Stringification.html) может помочь. –

+0

Привет, Евгений, это была та же ссылка, которую я уже опубликовал в своем оригинальном комментарии ... –

ответ

0

предложить

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

или

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

Что делать, если THEVAL содержит запятые? например: #define THEVAL 123,456 –

+0

, затем введите значение в буфер символов [100], используя что-то вроде sprintf(), затем напишите буфер, используя что-то вроде Serial.println (buffer); – user3629249

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 
+2

Но если значение параметра THEVAL равняется 123 456, это терпит неудачу. –

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