Arduino работа со строками

Строковые функции IndexOf и LastIndexOf [1]

Строковая функция indexOf() дает возможность искать в строке то или иное значение по принципу «самый первый с начала». В то же время, задав определенный «фильтр», можно искать не только первый, но и второй, третий символ и т.д. Функция lastIndexOf() делает то же самое, но по принципу «самый первый с конца».

1 String stringOne = "<HTML><HEAD><BODY>";
2 int firstClosingBracket = stringOne.indexOf('>');

В данном случае значение firstClosingBracket равно 5, поскольку самый первый символ «>», который попадается функции indexOf(), находится именно на пятой позиции (т.е. отсчет идет от 0). Если вам нужно отыскать не первую, а вторую по порядку закрывающую скобку, вам нужно использовать знание о том, где находится первая, а затем воспользоваться построением «firstClosingBracket + 1» – оно будет своего рода «фильтром» для поиска этой второй закрывающей скобки.

1 stringOne = "<HTML><HEAD><BODY>";
2 int secondClosingBracket = stringOne.indexOf('>', firstClosingBracket + 1 );

Теперь результатом будет 11 – это позиция второй закрывающей скобки (она закрывает тег «HEAD»).
Если вам нужно произвести поиск с конца строки, можно воспользоваться функцией lastIndexOf() – она тоже возвращает позицию заданного символа, но теперь поиск начинается с конца строки.

1 stringOne = "<HTML><HEAD><BODY>";
2 int lastOpeningBracket = stringOne.lastIndexOf('<');

В данном случае lastOpeningBracket будет равно 12 – это позиция первого с конца символа «<», т.е. открывающей скобки для тега «BODY». Если вы хотите добраться до открывающей скобки у тега HEAD, в коде нужно будет прописать

1 stringOne.lastIndexOf('<', lastOpeningBracket -1)

, и эта функция вернет вам значение 6.

Объединение строк Arduino

Объединить две строки в одну можно различными способами. Эта операция также называется конкатенацией. В ее результате получается новый объект String, состоящий из двух соединенных строк. Добавить к строке можно различные символы:

  • String3 = string1 + 111; // позволяет прибавить к строке числовую константу. Число должно быть целым.
  • String3 = string1 + 111111111; // добавляет к строке длинное целое число
  • String3 = string1 + ‘А’; // добавляет символ к строке
  • String3 = string1 +  “aaa”;// добавляет строковую постоянную.
  • String3 = string1 + string2; // объединяет две строки вместе.

Важно осторожно объединять две строки из разных типов данных, так как это может привести к ошибке или неправильному результату

Recent Articles

  1. Learn how to use the TP4056 properly. There’s a right way, and a wrong way, to use it to safely charge Lithium Ion batteries.

  2. A tutorial on using the ADS1115 precision 16 bit ADC for low power use.

  3. Arduino Nano ISP: How to program an ATmega328P using an Arduino Nano as the ISP programmmer. One common problem: Programming a sketch into the chip without a reset control — solved here.

  4. I2C tutorial: Learn all about the 2 wire I2C serial protocol. Learn how easy it is to use, how it works and when to use it…

  5. How to test and use an Arduino Joystick including a new library to make it super easy.

  6. How to use the MCP4728, a versatile four channel DAC with built in voltage reference.

    The MCP4728 chip is a four channel 12 bit DAC, with memory that outputs voltage that you can use for calibration, anywhere you want a fixed voltage.

Создание строк в ардуино с помощью String

В ардуино у нас есть несколько способов создать строку, приведем основные:

  • char myCharStr = “Start”; – массив типа char с завершающим пустым символом;
  • String myStr = “Start”; – объявляем переменную, создаем экземпляр класса String и записываем в него константу-строку.
  • String myStr = String(“Start”); – аналогичен предыдущему: создаем строку из константы
  • String myStr(myCharStr); – создаем объект класса String с помощью конструктра, принимающего на вход массив типа char и создающего из char String.
  • String myStr = String(50); – создаем строку из целого числа (преобразование int to string).
  • String myStr = String(30, H); – создаем строку – представление числа в 16-чной системе (HEX to String)
  • String myStr = String(16, B); – создаем строку – представление числа в двоичной системе (Byte to String).

Каждый раз, когда мы объявляем в коде строку с использованием двойных кавычек, мы создаем неявный объект класса String, являющийся константой. При этом обязательно использование именно двойных кавычек: “String” – это строка. Одинарные кавычки нужны для обозначения отдельных символов. ‘S’ – это символ.

Создание строк в ардуино с помощью String

В ардуино у нас есть несколько способов создать строку, приведем основные:

  • char myCharStr = “Start”;  – массив типа char с завершающим пустым символом;
  • String myStr = “Start”; – объявляем переменную, создаем экземпляр класса String и записываем в него константу-строку.
  • String myStr = String(“Start”); – аналогичен предыдущему: создаем строку из константы
  • String myStr(myCharStr); – создаем объект класса String с помощью конструктра, принимающего на вход массив типа char и создающего из char String.
  • String myStr = String(50); – создаем строку из целого числа (преобразование int to string).
  • String myStr = String(30, H); – создаем строку – представление числа в 16-чной системе (HEX to String)
  • String myStr = String(16, B); – создаем строку – представление числа в двоичной системе (Byte to String).

Каждый раз, когда мы объявляем в коде строку с использованием двойных кавычек, мы создаем неявный объект класса String, являющийся константой. При этом обязательно использование именно двойных кавычек: “String” – это строка. Одинарные кавычки нужны для обозначения отдельных символов. ‘S’ – это символ.

Should You Use String?

If you search on the Web, you will find that there can be problems in
using heap based systems and that is due to memory fragmentation.
Fragmentation in the heap is caused when strings of larger length can
not be allocated to a ‘freed’ memory block (since the block that had
been previously ‘freed’ up is too small); they have to be allocated in
new memory. This leaves lots of small blocks of unused memory.

In the extreme case memory fragmentation, caused when you have low
SRAM! and lots of string manipulations, can cause your program to
hang — the solution is to press the reset button! For small programs
with low numbers of Strings, its fine (there won’t be #enough memory
fragmentation to cause the program to hang.

The following statement is from a consortium of car
manufacturers MISRA (Motor Industry Software Reliability Association).
They specifically forbid using heap based memory management because
safety is crucial:

    MISRA C++ rule 18-4-1, dynamic heap memory allocation cannot be used.

This document describes static, dynamic memory fragmentation etc. but its final conclusion is this:

Exhaustion is still
our major impediment to using dynamic memory in real-time embedded
systems. A good failure policy based around std::bad_alloc can
address many of the issues, but in high integrity systems dynamic
memory usage will remain unacceptable.

For programs that do not use many strings the Arduino string class is
fine. However if you have low levels of SRAM and use lots of string
manipulations you could run into fragmentation problems (random
failure).

What exactly is a String?

As noted at the start, a string is a line of text stored in SRAM.

Note: This section applies to both Strings and c-strings.

Both Strings and ‘strings’ are dynamic entities meaning they can be
changed whenever you want since they exist in SRAM. For an embedded
system that typically has very low SRAM available (Arduino Uno 2k Byte)
it means the SRAM will disappear fast unless you put all your constant
strings into Flash.

In fact strings are doubly wasteful in C or C++, because they use
both Flash and SRAM.

The first reason is initialisation. You probably want to start off a
string with some information in it e.g. «Initialising I2C» etc.;
Sometimes you don’t e.g. a receive buffer for a serial input. To do the
initialisation you need somewhere to store the string when the power is
off, and that store is Flash memory.

The second reason is that strings are defined as existing in RAM so
that they can be changed as your program runs.

In some cases you don’t want an
updatable string e.g for a text message that never changes. The problem
is that the compiler won’t know that the string is never going to
change.

Объединение строк Arduino

Объединить две строки в одну можно различными способами. Эта операция также называется конкатенацией. В ее результате получается новый объект String, состоящий из двух соединенных строк. Добавить к строке можно различные символы:

  • String3 = string1 + 111; // позволяет прибавить к строке числовую константу. Число должно быть целым.
  • String3 = string1 + 111111111; // добавляет к строке длинное целое число
  • String3 = string1 + ‘А’; // добавляет символ к строке
  • String3 = string1 + “aaa”;// добавляет строковую постоянную.
  • String3 = string1 + string2; // объединяет две строки вместе.

Важно осторожно объединять две строки из разных типов данных, так как это может привести к ошибке или неправильному результату

Для чего нужен String в ардуино

Стандартным способом работы со строками в языке C является использование массива символов. Это все означало необходимость работы с указателями и понимания адресной арифметики. В ардуино и C++ у программистов появилось гораздо больше возможностей. Все “низкоуровневые” операции по работе со строкой выделены в отдельный класс, а для основных операций даже переопределены операторы. Например, для объединения срок мы просто используем хорошо знакомый знак “+”, а не зубодробильные функции типа malloc и strcpy. С помощью String мы работаем со строкой как с целым объектом, а не рассматриваем его как массив символов. Это позволяет сосредоточиться на логике скетча, а не деталях реализации хранения символов в памяти.

Естественно, у любого “упрощения” всегда есть свои подводные камни. String всегда использует больше оперативной памяти и в некоторых случаях функции класса могут медленнее обрабатываться. Поэтому в реальных больших проектах придется тщательно взвешивать все плюсы и минусы и не забывать, что никто не мешает нам работать со строками в стиле С. Все обычные функции обработки массивов char остаются в нашем арсенале и в arduino.

Строка в C

В языке C строка должна завершаться нулевым символом (‘\0’), поэтому при создании строки нужно указывать на один символ больше. Иногда компилятор может догадаться самостоятельно добавлять нулевой символ, но в некоторых случаях он не поможет.

Существует несколько способов объявить строку в виде символьного массива.

Иногда массив строк записывают как указатель на символ (первый символ в массиве):

Строковые функции языка C

Существуют родные строковые функции самого языка C. Язык C++ также может их использовать в целях совместимости.

Длина строки (без завершающего нулевого символа) вычисляется при помощи функции strlen() (string length).

Функция strcpy (string copy) копирует одну строку в другую.

Похожая функция strncpy() позволяет указать лимит символов, чтобы предотвратить копирование лишних символов в строку, которая не сможет содержать лишнего.

«Кошачья» функция strcat (string concatenate) присоединяет одну строку к другой.

Функция strcmp() осуществляет лексикографическую проверку двух строк, оканчивающихся нулевыми символами, и возвращает целое число со следующим значением: меньше 0 — если первая строка меньше, чем вторая строка, 0 — если обе строки совпадают, больше 0 — если первая строка больше второй строки.

В примере сравним массив символов со строкой C++, так как имеется совместимость между ними, но можно сравнить и два строковых массива или две строки.

Функция sprintf(), выполняет форматирование массивов символов.

Допустим, мы хотим вывести информацию на двух строках ЖК-дисплея:

Массив символов line1 — это строковый буфер, содержащий форматированный
текст, который имеет ёмкость 17 символов, включая завершающий нулевой символ.

В первом параметре функции передаётся массив символов, в который должен быть записан результат. Следующий аргумент — строка формата, содержащая смесь простого текста, такого как «Temp:», и команд форматирования, например %d. В данном случае %d означает «десятичное целое со знаком». Остальные параметры будут подставлены в строку формата в порядке их следования на место команд форматирования.

Чтобы вывести время во вторую строку на жидкокристаллическом дисплее, её
можно сформировать из отдельных значений часов, минут и секунд. В результате на экране мы увидим.

Команда sprintf() не только подставила числа в нужные места, но и добавила ведущий ноль перед цифрой 5. В примере между символами : находятся команды форматирования трёх компонентов времени. Часам соответствует команда %2d, которая выводит двузначное десятичное число. Команды форматирования для минут и секунд немного отличаются (%02d). Эти команды также выводят двузначные десятичные числа, но добавляют ведущий ноль, если это необходимо. Однако имейте в виду, что этот приём предназначен для значений типа int.

На языке C можно воспользоваться функциями atoi() ( ASCII to int) и atol() (ASCII to long) для конвертации массива символов в int и long.

В C++ можно использовать toInt(). В классе Arduino Serial есть функция parseInt().

Для чего нужен String в ардуино

Стандартным способом работы со строками в языке C является использование массива символов. Это все означало необходимость работы с указателями и понимания адресной арифметики. В ардуино и C++ у программистов появилось гораздо больше возможностей. Все “низкоуровневые” операции по работе со строкой выделены в отдельный класс, а для основных операций даже переопределены операторы. Например, для объединения срок мы просто используем хорошо знакомый знак “+”, а не зубодробильные функции типа malloc и strcpy. С помощью String мы работаем со строкой как с целым объектом, а не рассматриваем его как массив символов. Это позволяет сосредоточиться на логике скетча, а не деталях реализации хранения символов в памяти.

Естественно, у любого “упрощения” всегда есть свои подводные камни. String всегда использует больше оперативной памяти и в некоторых случаях функции класса могут медленнее обрабатываться. Поэтому в реальных больших проектах придется тщательно взвешивать все плюсы и минусы и не забывать, что никто не мешает нам работать со строками в стиле С. Все обычные функции обработки массивов char остаются в нашем арсенале и в arduino.

Функции и методы класса String

Для работы со строками в String предусмотрено множество полезных функций. Приведем краткое описание каждой из них:

  • String() – конструктор, создает элемент класса данных string. Возвращаемого значения нет. Есть множество вариантов, позволяющих создавать String из строк, символов, числе разных форматов.
  • charAt() возвращает указанный в строке элемент. Возвращаемое значение – n-ный символ строки.
  • compareTo() – функция нужна для проверки двух строк на равенство и позволяет выявить, какая из них идет раньше по алфавиту. Возвращаемые значения: отрицательное число, если строка 1 идет раньше строки 2 по алфавиту; 0 – при эквивалентности двух строк; положительное число, если вторая строка идет раньше первой в алфавитном порядке.
  • concat() – функция, которая объединяет две строки в одну. Итог сложения строк объединяется в новый объект String.
  • startsWith() – функция показывает, начинается ли строка с символа, указанного во второй строке. Возвращаемое значение: true, если строка начинается с символа из второй строки, в ином случае false.
  • endsWith() – работает так же, как и startsWith(), но проверяет уже окончание строки. Также возвращает значения true и false.
  • equals() – сравнивает две строки с учетом регистра, т.е. строки «start» и «START» не будут считаться эквивалентными. Возвращаемые значения: true при эквивалентности, false в ином случае.
  • equalsIgnoreCase() – похожа на equals, только эта функция не чувствительна к регистру символов.
  • getBytes() – позволяет скопировать символы указанной строки в буфер.
  • indexOf() – выполняет поиск символа в строке с начала. Возвращает значение индекса подстроки val или -1, если подстрока не обнаружена.
  • lastIndexOf() –выполняет поиск символа в строке с конца.
  • length() – указывает длину строки в символах без учета завершающего нулевого символа.
  • replace() – заменяет в строке вхождения определенного символа на другой.
  • setCharAt() – изменяет нужный символ в строке.
  • substring() – возвращает подстроку. Может принимать два значения – начальный и конечный индексы. Первый является включительным, т.е. соответствующий ему элемент будет включаться в строку, второй – не является им.
  • toCharArray() – копирует элементы строки в буфер.
  • toLowerCase() – возвращает строку, которая записана в нижнем регистре.
  • toUpperCase() – возвращает записанную в верхнем регистре строку.
  • toInt() – позволяет преобразовать строку в число (целое). При наличии в строке не целочисленных значений функция прерывает преобразование.
  • trim() – отбрасывает ненужные пробелы в начале и в конце строки.

Когда использовать строковый объект или массив строковых символов

Объект String намного проще в использовании, чем массив строковых символов. Объект имеет встроенные функции, которые могут выполнять ряд операций со строками, которые полностью задокументированы в справочном разделе на веб-сайте Arduino.

Основным недостатком использования объекта String является то, что он использует много памяти и может быстро использовать оперативную память Arduino, что может привести к зависанию, сбою или неожиданному поведению Arduino. Это особенно верно для небольших плат, таких как Arduino Uno.

Если скетч на Arduino небольшой и ограничивает использование объектов, то проблем возникнуть не должно.

Строки символьных массивов сложнее использовать, и вам может потребоваться написать свои собственные функции для работы с этими типами строк. Преимущество состоит в том, что у вас есть контроль над размером создаваемых массивов строк, поэтому вы можете сохранять массивы небольшими для экономии памяти.

Вам нужно убедиться, что вы не пишете через конец границ массива строковыми массивами. У объекта String нет этой проблемы, и он позаботится о границах строки за вас при условии, что у него достаточно памяти. Объект String может попытаться выполнить запись в несуществующую память, когда ему не хватает памяти, но никогда не будет записывать поверх конца строки, с которой он работает.

Проблемы с несколькими аргументами в Serial.print

Проблема при объединении текста и чисел и выводе в print в одной строке

Часто для отладки программы требуется вывести несколько значений, снабдив их каким-то комментарием. Например, такой текст:  «Sensor’s value is:  15». Если вы просто используете такой код:

Serial.print(“Sensor’s value is:  15”);

,то все отобразится правильно. Но если вы попытаетесь вместо подстроки «15» вставить реальное показание датчика, объединив строку и числовое значение, то увидите, что строка выводится некорректно.

Serial.print(“Sensor’s value is:  ” + analogRead (A0));

Этот код даст непредсказуемый результат, в мониторе порта вы не увидите или пустоту или случайный набор символов. Причина ошибки в механизме конвертации типов данных. При объединении строк  «на лету», как в нашем примере, ардуино не знает, как интерпретировать типы данных для аргументов при операторе суммирования. В процессе такой непредсказуемой конвертации и результат может быть непредсказуемым.

Для решения этой проблемы вы можете использовать два способа:

Первый вариант. Объявить предварительно переменную типа String, инициализировать ее константой-строкой и использовать в аргументе print. Такой вот пример будет работать:

String str = “Sensor’s value is:  “;

Serial.println(str + analogRead(A0));

Второй, более предпочтительный и удобный вариант: использование функции print несколько раз:

Serial.print(“Sensor’s value is:  “);

Serial.println(analogRead(A0));

Более подробно прочитать об особенностях  работы со строками при выводе информации в монитор порта можно на официальной странице Ардуино.

Проблема объединения нескольких строк в аргументе функции print

Попробуйте загрузить скетч с таким фрагментом:

Serial.print(“Sensor’s value is:  ” + analogRead (A0) + “15 cm”);

В данном случае ошибка возникнет уже на стадии компиляции программы: оператор «+» не может использовать больше, чем  два аргумента. Вам придется разбить одно действие на несколько составляющих, создав предварительно готовые «заготовки» строк.

Преобразование String в массив char

Тип данных Char позволяет объявлять текстовые строки несколькими способами:

Еще раз напомним, что в типе данных char строковые константы нужно записывать в двойные кавычки «Abcde», а одиночные символы – в одинарные ‘a’.

Конвертировать строку в массив сhar array можно при помощи следующего кода:

String stringVar = «111»;

char charBufVar;

stringVar.toCharArray(charBufVar, 20);

Можно сделать обратное преобразование — char to string .

char[] chArray = «start»;

String str(chArray);

Пример преобразования String to const char* . Указание звездочкой char*означает, что это массив указателей.

String stringVar=string (`start);

Char charVar;

stringVar.toCharArray(charVar, sizeof(charVar));

Программирование Ардуино

Язык программирования устройств Ардуино основан на C/C++. Он прост в освоении, и на данный момент Arduino — это, пожалуй, самый удобный способ программирования устройств на микроконтроллерах.

Базовые и полезные знания, необходимые для успешного программирования под платформу Arduino:

  • Начало работы с Arduino в Windows
  • Работа с Arduino Mini
  • Цифровые выводы
  • Аналоговые входы
  • Широтно-импульсная модуляция
  • Память в Arduino
  • Использование аппаратных прерываний в Arduino
  • Переменные
  • Функции
  • Создание библиотек для Arduino
  • Использование сдвигового регистра 74HC595 для увеличения количества выходов
  • Прямое управления выходами через регистры микроконтроллера Atmega

Справочник языка Ардуино

Язык Arduino можно разделить на три раздела:

Операторы

  • setup()
  • loop()
Управляющие операторы
  • if
  • if…else
  • for
  • switch case
  • while
  • do… while
  • break
  • continue
  • return
  • goto
Синтаксис
  • ; (semicolon)
  • {} (curly braces)
  • // (single line comment)
  • /* */ (multi-line comment)
Арифметические операторы
  • = (assignment)
  • + (addition)
  • — (subtraction)
  • * (multiplication)
  • / (division)
  • % (modulo)
Операторы сравнения
  • == (equal to)
  • != (not equal to)
  • < (less than)
  • > (greater than)
  • <= (less than or equal to)
  • >= (greater than or equal to)
Логические операторы
  • && (И)
  • || (ИЛИ)
  • ! (Отрицание)
Унарные операторы
  • ++ (increment)
  • — (decrement)
  • += (compound addition)
  • -= (compound subtraction)
  • *= (compound multiplication)
  • /= (compound division)

Данные

Константы
  • HIGH | LOW
  • INPUT | OUTPUT
  • true | false
  • Целочисленные константы
  • Константы с плавающей запятой
Типы данных
  • boolean
  • char
  • byte
  • int
  • unsigned int
  • word
  • long
  • unsigned long
  • float
  • double
  • string — массив символов
  • String — объект класса
  • массив (array)
  • void
Преобразование типов данных
  • char()
  • byte()
  • int()
  • long()
  • float()
Область видимости переменных и квалификаторы
  • Область видимости
  • static
  • volatile
  • const

Функции

Цифровой ввод/вывод
  • pinMode()
  • digitalWrite()
  • digitalRead()
Аналоговый ввод/вывод
  • analogRead()
  • analogReference()
  • analogWrite()
Дополнительные фунции ввода/вывода
  • tone()
  • noTone()
  • shiftOut()
  • pulseIn()
Работа со временем
  • millis()
  • micros()
  • delay()
  • delayMicroseconds()
Математические функции
  • min()
  • max()
  • abs()
  • constrain()
  • map()
  • pow()
  • sq()
  • sqrt()
Тригонометрические функции
  • sin()
  • cos()
  • tan()
Генераторы случайных значений
  • randomSeed()
  • random()
Внешние прерывания
  • attachInterrupt()
  • detachInterrupt()
Функции передачи данных

Serial

Библиотеки Arduino

Servo — библиотека управления сервоприводами.EEPROM — чтение и запись энергонезависимой памяти микроконтроллера.SPI — библиотека, реализующая передачу данных через интерфейс SPI.Stepper — библиотека управления шаговыми двигателями.

String Character Arrays

The first type of string that we will learn is the string that is a series of characters of the type char. In the previous chapter, we learned what an array is; a consecutive series of the same type of variable stored in memory. A string is an array of char variables.

A string is a special array that has one extra element at the end of the string, which always has the value of 0 (zero). This is known as a «null terminated string».

String Character Array Example

This example will show how to make a string and print it to the serial monitor window.

Example

void setup() {
   char my_str; // an array big enough for a 5 character string
   Serial.begin(9600);
   my_str = 'H'; // the string consists of 5 characters
   my_str = 'e';
   my_str = 'l';
   my_str = 'l';
   my_str = 'o';
   my_str = 0; // 6th array element is a null terminator
   Serial.println(my_str);
}

void loop() { 

}

The following example shows what a string is made up of; a character array with printable characters and 0 as the last element of the array to show that this is where the string ends. The string can be printed out to the Arduino IDE Serial Monitor window by using Serial.println() and passing the name of the string.

This same example can be written in a more convenient way as shown below −

Example

void setup() {
   char my_str[] = "Hello";
   Serial.begin(9600);
   Serial.println(my_str);
}

void loop() {

}

In this sketch, the compiler calculates the size of the string array and also automatically null terminates the string with a zero. An array that is six elements long and consists of five characters followed by a zero is created exactly the same way as in the previous sketch.

Преобразование String в массив char

Тип данных Char позволяет объявлять текстовые строки несколькими способами:

  • char myStr1; – в данном случае объявлен массив определенного размера.
  • char myStr2 = <‘a’, b, ‘c’, ‘d’, ‘e’>; – объявлен сам массив. Конечный символ не записанявно, его прибавит сам компилятор.
  • char myStr3 = <‘a’, b, ‘c’, ‘d’, ‘e’’/0’>; – объявлен массив, при этом в конце прописан признак окончания строки.
  • char myStr4 = “abcde”; – инициализация массива строковой постоянной. Размер и завершающий символ добавляются автоматически компилятором.
  • char myStr5 = “abcde”; – инициализация массива с точным указанием его размера.
  • char myStr 6 = “abcde”; – аналогично, но размер указан больше для возможности использования строк большей длины.

Еще раз напомним, что в типе данных char строковые константы нужно записывать в двойные кавычки «Abcde», а одиночные символы – в одинарные ‘a’.

Конвертировать строку в массив сhar array можно при помощи следующего кода:

String stringVar = “111”;

Можно сделать обратное преобразование – char to string.

char[] chArray = “start”;

Пример преобразования String to const char*. Указание звездочкой char*означает, что это массив указателей.

String stringVar=string (`start);

Char charVar;

Array Bounds

When working with strings and arrays, it is very important to work within the bounds of strings or arrays. In the example sketch, an array was created, which was 40 characters long, in order to allocate the memory that could be used to manipulate strings.

If the array was made too small and we tried to copy a string that is bigger than the array to it, the string would be copied over the end of the array. The memory beyond the end of the array could contain other important data used in the sketch, which would then be overwritten by our string. If the memory beyond the end of the string is overrun, it could crash the sketch or cause unexpected behavior.

Previous Page
Print Page

Next Page  

Строка в C++

Строка как отдельный тип относится уже к языку C++. Вам не нужно указывать массив отдельных символов, достаточно просто окружить строку двойными кавычками. У класса String есть несколько удобных функций для работы со строками.

Только помните, что класс String требует больше ресурсов, чем при работе с массивами символов. Проведём эксперимент. Напишем первый скетч с использованием String.

При компиляции вывелось следующее: Sketch uses 3212 bytes (9%) of program storage space. Maximum is 32256 bytes. Global variables use 216 bytes (10%) of dynamic memory, leaving 1832 bytes for local variables. Maximum is 2048 bytes.

Перепишем пример.

На этот раз выводится Sketch uses 1618 bytes (5%) of program storage space. Maximum is 32256 bytes.
Global variables use 210 bytes (10%) of dynamic memory, leaving 1838 bytes for local variables. Maximum is 2048 bytes.

Второй скетч использует 5% памяти вместо 9%, т.е. почти в два раза меньше. Для сложных проектов подобное использование строк может стать решающим фактором.

Функции из C могут работать со строками C++. Например, определим длину строки.

Функция println и отличия от print

Если вы попробовали использовать функцию print(), то уже обратили внимание, что вся информация в мониторе порта выводится в одной строке. Если же мы хотим вывести текст в новых строках, то должны использовать близкого родственника функции – println()

Метод println () класса Serial выполняет ту же функцию, что и print() – он выводит в последовательный порт ASCII-текст.  Аргументы у методов тоже совпадают – мы передаем текст или число с возможным вторым аргументом, определяющим формат. Отличие же println заключается в принудительном добавлении в конце передающейся строки символа новой строки “\r” (ASCII код 13). Суффикс ln обозначает сокращенное слово line (строка). Используя println, мы можем быть уверены, что следующая (но не текущая) строка будет выведена с новой строки.

Например, следующие команды выведут три строки текста, каждое предложение в новой строке.

Serial.println(“Line number  1”);
Serial.println(“Line number  2”);
Serial.println(“Line number  3”);

При формировании строки мы также можем использовать следующие специальные символы: “\0”, “\r”, “\t” (символ табуляции). Табулирование позволяет печатать на экране что-то типа таблицы значений:

Serial.print("Column1\t\t");
Serial.println("Column2");
Serial.print("Cell 11\t\t");
Serial.println("Cel l2");
Serial.print("Cell 21\t\t");
Serial.println("Cel 22");

Строковый объект Arduino

Второй тип строки, используемый в программировании Arduino, — это объект String.

Что такое объект?

Объект — это конструкция, которая содержит как данные, так и функции. Объект String можно создать так же, как переменную, и присвоить ему значение или строку. Объект String содержит функции (которые в объектно-ориентированном программировании (ООП) называются «методами»), которые работают со строковыми данными, содержащимися в объекте String.

Следующий скетч и пояснит, что такое объект и как используется объект String:

void setup() {
String my_str = «This is my string.»;

Serial.begin(9600);

// (1) выводим строку
Serial.println(my_str);

// (2) переводим строку в верхний регистр
my_str.toUpperCase();
Serial.println(my_str);

// (3) перезаписываем строку
my_str = «My new string.»;
Serial.println(my_str);

// (4) заменить слово в строке
my_str.replace(«string», «Arduino sketch»);
Serial.println(my_str);

// (5) получаем длину строки
Serial.print(«String length is: «);
Serial.println(my_str.length());
}

void loop() {
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

voidsetup(){

Stringmy_str=»This is my string.»;

Serial.begin(9600);

// (1) выводим строку

Serial.println(my_str);

// (2) переводим строку в верхний регистр

my_str.toUpperCase();

Serial.println(my_str);

// (3) перезаписываем строку

my_str=»My new string.»;

Serial.println(my_str);

// (4) заменить слово в строке

my_str.replace(«string»,»Arduino sketch»);

Serial.println(my_str);

// (5) получаем длину строки

Serial.print(«String length is: «);

Serial.println(my_str.length());

}
 

voidloop(){

}

Создается строковый объект, которому в верхней части скетча присваивается значение (или строка).

String my_str = «This is my string.»;

1 Stringmy_str=»This is my string.»;

Это создает объект String с именем my_str и присваивает ему значение «This is my string.».

Это можно сравнить с созданием переменной и присвоением ей значения, например целого числа:

int my_var = 102;

1 intmy_var=102;
(2) Преобразование строки в верхний регистр

Созданный строковый объект my_str имеет ряд функций или методов, которые могут работать с ним. Эти методы вызываются с использованием имени объекта, за которым следует оператор точки (.), а затем имя используемой функции.

my_str.toUpperCase ();

1 my_str.toUpperCase();

Функция toUpperCase () работает со строкой, содержащейся в объекте my_str, который имеет тип String, и преобразует строковые данные (или текст), содержащиеся в объекте, в символы верхнего регистра.

Список функций, которые содержит класс String, можно найти в справочнике Arduino String.

Технически String называется классом и используется для создания объектов String.

(3) Перезаписать строку

Оператор присваивания используется для присвоения новой строки объекту my_str, который заменяет старую строку.

my_str = «My new string.»;

1 my_str=»My new string.»;

Оператор присваивания не может использоваться для строк символьного массива, но работает только с объектами String.

(4) Замена слова в строке

Функция replace () используется для замены первой переданной ей строки второй переданной ей строкой. replace () — еще одна функция, которая встроена в класс String и поэтому доступна для использования в объекте String my_str.

(5) Получение длины строки

Получить длину строки легко, используя length (). В примере скетча результат, возвращаемый функцией length (), передается непосредственно в Serial.println () без использования промежуточной переменной.

Заключение о String и ардуино

В этой статье мы рассмотрели основные вопросы использования String для работы со строками arduino. Как показывают примеры, ничего страшного и сложного в этом классе нет. Более того, зачастую мы можем даже не догадываться, что работаем с классом String: мы просто создаем переменную нужного типа, присваиваем ей строку в двойных кавычках. Создав строку, мы используем все возможности библиотеки String: можем без проблем модифицировать строку, объединять строки, преобразовывать string в int и обратно, а также делать множество других операций с помощью методов класса.

В ситуациях, когда скетч большой и перед нами встает дефицит памяти, использовать String нужно осторожно, по возможности заменяя на char*. Впрочем, в большинстве первых проектов начинающего ардуинщика таких ситуаций не много, поэтому рекомендуем использовать String без опаски – это предотвратит появление ошибок адресной арифметики, возникающих при работе с массивами char

  • Уроки
  • Программирование
  • Строки и массивы символов