Serial.println() обрезает символы

Я хочу напечатать строку вместе с числом. Мой код

Serial.println("Test " + index++);

setup() я инициализировал переменную index значением 0.) В Java это будет выводить

Test 0
Test 1
Test 2
Test 3
...

Но вместо этого я получаю следующий вывод:

Test
est
st 
t

Кто-нибудь может объяснить мне это, пожалуйста?

, 👍1


2 ответа


Лучший ответ:

6

Serial.println() выводит значение одного выражения. Переданное вами выражение было `("Test " + index++).

В C/C++ символьный литерал, такой как "Test ", вычисляет адрес памяти в качестве первого символа. Добавление 1 к этому адресу дает адрес следующего (или 2-го) символа. Добавление к нему 2 дает адрес третьего символа и т. д.

Чтобы получить то, что вы ожидали, значение литерала И значение индекса, вы должны написать:

Serial.print("Test ");
Serial.println(index++);

Если бы вы создали строковую переменную со значением "Test", то строковое выражение ("Test" + index++) оценивалось бы по-другому: оператор "+" объединил бы Строка "Текст", со строковым эквивалентом текущего значения "индекс"; но это не так, как литерал символа. Среди библиотек Arduino есть библиотека строк C++, но ее использование не рекомендуется, поскольку строки перераспределяются и копируются при объединении, что приводит к чрезмерному использованию памяти, а у Arduino очень мало памяти.

,

2

Дж.Роберт очень хорошо объясняет, почему это не работает.

Вместо Serial.print вы также можете использовать функцию sprintf, если вам нужно построить более сложную строку или если вы хотите смешать два разных типа в одной строке:

char str[100];
int index = 0;
sprintf(str, "Test %d", index++);
Serial.println(str);

Убедитесь, что буфер (100) достаточно велик для хранения всей строки, включая конечный символ ('\0').

В целях безопасности вы также можете использовать:

snprintf(str, 100, "Test %d", index++);

Это обеспечит макс. Заполняется 100 символов (оставшаяся часть обрезается).

,