Arduino: как распечатать значение определенных констант?

Я пишу код в среде 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)

Однако компилятор не заменяет константы внутри строк в кавычках. Я также попробовал это (строковое преобразование C++), которое указывает, что вы помещаете константу вне строки в кавычках

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

но это приводит к ошибке "Stray # character" в компиляторе.

Буду признателен за любую информацию! Спасибо!

РЕДАКТИРОВАТЬ: СТРАННОЕ ПОВЕДЕНИЕ

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

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

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


person Ryan Griggs    schedule 01.12.2015    source источник
comment
Я нашел это: stackoverflow.com/questions/2653214/ но это не работает, если в константе есть запятые. Например: #define THEVAL 1,2,3   -  person Ryan Griggs    schedule 01.12.2015
comment
это может помочь.   -  person Eugene Sh.    schedule 01.12.2015
comment
Привет, Евгений, это была та же ссылка, которую я уже разместил в своем первоначальном комментарии...   -  person Ryan Griggs    schedule 01.12.2015


Ответы (4)


#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
person Ian Abbott    schedule 01.12.2015
comment
Но если для THEVAL установлено значение 123 456, это не удастся. - person Ryan Griggs; 01.12.2015

#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__
person Armali    schedule 23.06.2017

предложить

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

or

int x = THEVAL;
Serial.print("This is the value: ");
Serial.println( x );
person user3629249    schedule 01.12.2015
comment
Что делать, если в THEVAL есть запятые? например: #define THEVAL 123,456 - person Ryan Griggs; 01.12.2015
comment
затем запишите значение в буфер символов [100], используя что-то вроде sprintf(), затем запишите буфер, используя что-то вроде Serial.println(buffer); - person user3629249; 01.12.2015

Я запутался - почему один макрос считает 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));
person Armali    schedule 26.06.2017