Serial.println() обрезает символы
Я хочу напечатать строку вместе с числом. Мой код
Serial.println("Test " + index++);
(В setup()
я инициализировал переменную index
значением 0.) В Java это будет выводить
Test 0
Test 1
Test 2
Test 3
...
Но вместо этого я получаю следующий вывод:
Test
est
st
t
Кто-нибудь может объяснить мне это, пожалуйста?
@juice, 👍1
2 ответа
Лучший ответ:
Serial.println()
выводит значение одного выражения. Переданное вами выражение было `("Test " + index++).
В C/C++ символьный литерал, такой как "Test ", вычисляет адрес памяти в качестве первого символа. Добавление 1 к этому адресу дает адрес следующего (или 2-го) символа. Добавление к нему 2 дает адрес третьего символа и т. д.
Чтобы получить то, что вы ожидали, значение литерала И значение индекса, вы должны написать:
Serial.print("Test ");
Serial.println(index++);
Если бы вы создали строковую переменную со значением "Test", то строковое выражение ("Test" + index++)
оценивалось бы по-другому: оператор "+" объединил бы Строка "Текст", со строковым эквивалентом текущего значения "индекс"; но это не так, как литерал символа. Среди библиотек Arduino есть библиотека строк C++, но ее использование не рекомендуется, поскольку строки перераспределяются и копируются при объединении, что приводит к чрезмерному использованию памяти, а у Arduino очень мало памяти.
Дж.Роберт очень хорошо объясняет, почему это не работает.
Вместо 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 символов (оставшаяся часть обрезается).
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Очистить существующий массив при получении новой последовательной команды