Главная chevron_right Уроки chevron_right Встроенные примеры chevron_right Строки chevron_right String Addition Operator — конкатенация строк в Arduino

String Addition Operator — конкатенация строк в Arduino

Разбираем оператор + для объектов String в Arduino: как склеивать строки, числа и символы, и каких ошибок при этом избегать.

Строки в Arduino можно соединять самыми разными способами. Такое объединение называется конкатенацией: результирующая строка становится длиннее на величину добавляемого фрагмента. Оператор + позволяет объединить объект String с другим String, с массивом символов (char[]), с ASCII-представлением числовой константы или переменной, а также с отдельным символом (char).

// добавление константного целого числа к строке:
stringThree =  stringOne + 123;
// добавление константного длинного целого числа к строке:
stringThree = stringOne + 123456789;
// добавление константного символа к строке:
stringThree =  stringOne + 'A';
// добавление константной строки к строке:
stringThree =  stringOne +  "abc";
// сложение двух String:
stringThree = stringOne + stringTwo;

Как это работает

Конкатенация — это не просто синтаксический сахар. Каждый раз, когда вы «складываете» строки, Arduino выделяет новую область памяти под результат. Если делать это в цикле без контроля, память фрагментируется и рано или поздно заканчивается. Поэтому конкатенацию лучше применять там, где она действительно нужна — например, для формирования сообщений перед отправкой.

Оператор + также работает с возвращаемыми значениями функций, если тип возвращаемого значения совместим со String. Например:

stringThree = stringOne + millis();

Это допустимо, потому что функция millis() возвращает long, который можно добавить к строке. Аналогично работает и такой вариант:

stringThree = stringOne + analogRead(A0);

здесь analogRead() возвращает int. Конкатенация строк особенно удобна, когда нужно собрать в одну строку несколько значений с описаниями — для вывода через Serial, на LCD-дисплей, через Ethernet или в любом другом месте, где работают строки.

Типичные ошибки и предупреждения

Будьте осторожны при конкатенации нескольких разных типов данных в одной строке — результат может оказаться неожиданным. Например:

int sensorValue = analogRead(A0);
String stringOne = "Sensor value: ";
String stringThree = stringOne + sensorValue;
Serial.println(stringThree);

даёт корректный результат вроде "Sensor Value: 402" (или другое число, которое вернул analogRead()), а вот:

int sensorValue = analogRead(A0);
String stringThree = "Sensor value: " + sensorValue;
Serial.println(stringThree);

даёт непредсказуемый результат, потому что stringThree не получил начального значения до того, как вы начали добавлять к нему разные типы данных.

Вот ещё один пример с неправильной инициализацией:

Serial.println("I want " + analogRead(A0) + " donuts");

Этот код вообще не скомпилируется — компилятор неправильно обработает приоритет операторов. А следующий вариант скомпилируется, но работать будет не так, как ожидается:

int sensorValue = analogRead(A0);
String stringThree = "I want " + sensorValue;
Serial.println(stringThree  + " donuts");

Причина та же: stringThree не имеет начального значения, и добавление к нему разных типов приводит к неопределённому поведению.

Главное правило: всегда инициализируйте объекты String перед конкатенацией. Это избавит вас от трудноуловимых багов.

Где пригодится

  • Формирование сообщений для Serial Monitor с метками и значениями датчиков.
  • Сборка строк для отправки по UART, Bluetooth или Wi-Fi.
  • Вывод составных надписей на LCD или OLED-дисплей.
  • Логирование данных с временными метками.

Необходимое оборудование

Схема подключения

Дополнительные компоненты для этого примера не нужны. Достаточно подключить плату к компьютеру через USB и открыть Serial Monitor в Arduino IDE.

Плата Arduino UNO — дополнительные компоненты для этого примера не требуются.

Код

Ниже приведён рабочий пример с несколькими вариантами конкатенации:

/*

  Сложение строк

Примеры того, как складывать строки вместе

Также можно добавлять к String значения разных типов данных, как показано здесь:

created 27 Jul 2010

modified 2 Apr 2012

by Tom Igoe

Данный пример кода находится в открытом доступе.

https://www.arduino.cc/en/Tutorial/StringAdditionOperator

*/

// объявление трёх String:

String stringOne, stringTwo, stringThree;

void setup() {

  // инициализация serial и ожидание открытия порта:

  Serial.begin(9600);

  while (!Serial) {

    ; // ожидание подключения serial-порта. Нужно только для native USB порта

  }

  stringOne = String("You added ");

  stringTwo = String("this string");

  stringThree = String();

  // отправка вступительного сообщения:

  Serial.println("\n\nAdding Strings together (concatenation):");

  Serial.println();
}

void loop() {

  // добавление константного целого числа к String:

  stringThree =  stringOne + 123;

  Serial.println(stringThree);    // выводит «You added 123»

  // добавление константного длинного целого числа к String:

  stringThree = stringOne + 123456789;

  Serial.println(stringThree);    // выводит «You added 123456789»

  // добавление константного символа к String:

  stringThree =  stringOne + 'A';

  Serial.println(stringThree);    // выводит «You added A»

  // добавление константной строки к String:

  stringThree =  stringOne +  "abc";

  Serial.println(stringThree);    // выводит «You added abc»

  stringThree = stringOne + stringTwo;

  Serial.println(stringThree);    // выводит «You added this string»

  // добавление переменного целого числа к String:

  int sensorValue = analogRead(A0);

  stringOne = "Sensor value: ";

  stringThree = stringOne  + sensorValue;

  Serial.println(stringThree);    // выводит «Sensor Value: 401» или любое другое значение analogRead(A0)

  // добавление переменного длинного целого числа к String:

  stringOne = "millis() value: ";

  stringThree = stringOne + millis();

  Serial.println(stringThree);    // выводит «The millis: 345345» или любое другое значение millis()

  // бесконечное ожидание:

  while (true);
}

Как проверить результат

  1. Загрузите скетч на плату.
  2. Откройте Serial Monitor (Ctrl+Shift+M) и убедитесь, что скорость порта совпадает с той, что задана в Serial.begin().
  3. В мониторе должны появляться строки, собранные из разных типов данных — текста, чисел и символов.
  4. Если строки выглядят «мусорно» или пусты — проверьте инициализацию переменных типа String перед использованием оператора +.

Подробнее

Больше базовых уроков вы найдёте в разделе built-in examples.

Также изучите language reference — подробный справочник языка программирования Arduino.

Последнее обновление: 30.07.2015, SM