String() против char для простого управления потоком

Я новичок в Arduino и пишу программу, в которой я хочу управлять потоком, используя вход последовательного монитора (ПИ-контроллер). Я читал, что с помощью String(), хотя проще, это медленнее, чем использование char. Но для использования char мне понадобилось бы больше строк кода для преобразования ввода в строку для сравнения и больше знаний, чтобы сделать программу надежной. Для управления я буду вводить небольшие строки, такие как Ramp, Увеличение, Уменьшение, Блокировка, Стоп и любые другие входы не будут использоваться. Как правило, вкладов будет не так много. Строки в основном будут помещены в операторы if, ведущие к функциям.

if(Serial.available()){

string = Serial.readString() 
or some function to read out all the bytes of the string and return a char containing it;

if(string="Ramp") {
do_this();
}
else_if(string="Increase"){
do_that()
}
// Если ничего не совпадает, продолжаем код.
}

Поскольку мне нужно закончить этот проект в ближайшее время, мне интересно, значительно ли увеличится время цикла, если я буду использовать String(), или мне не следует беспокоиться об обучении и использовании char прямо сейчас (на более позднем этапе, конечно ).

, 👍0

Обсуждение

Рампа, Увеличение, Уменьшение, Блокировка, Стоп могут быть представлены однобайтовыми командами r, i, d, l, s, @jsotola


2 ответа


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

2

Да, String имеет немного больше накладных расходов, чем обычные c-строки (также известные как массивы char), хотя дополнительное время выполнения будет слишком маленьким, чтобы вы заметили (особенно когда вы вводите команды вручную).

Не будет проблемой использовать String в вашем скетче, хотя вы должны сделать это правильно и использовать String.reserve(), чтобы выделить достаточно места в памяти в String для хранения самой длинной строки, которая у вас есть. Также не просто добавляйте String вместе. Таким образом, вы можете избежать фрагментации памяти (эффективно превращая ОЗУ в швейцарский сыр) и по-прежнему использовать String.

Хотя, когда вы больше не спешите, полезно научиться использовать c-строки.

,

И что произойдет, если я использую char или byte и отправлю команду дольше, чем ожидалось? Остальные байты остаются в последовательном буфере, а затем при дальнейшем чтении я получаю неправильную команду или он очищает буфер после его заполнения?, @Ognyan Petkov

Что произойдет затем, зависит от вашего программирования. Распространенным способом является завершение строки и отбрасывание остальных входящих данных для этого сообщения. Таким образом, вы можете оправиться от этого. Хотя у вас ограниченный список команд, поэтому для вас есть максимальная длина команд, @chrisl


4

Использование Serial.readString() сделает вашу программу очень медленной. Это потому что readString() не знает, когда прекратить чтение. Когда буфер последовательного ввода становится пустым, он будет ждать на всякий случай больше символы могут появиться позже. Только по истечении времени ожидания он возвращает строка, которую он может прочитать. Тайм-аут по умолчанию составляет одну секунду, поэтому ваш программа не будет отвечать целую секунду после получения команды и прежде чем действовать на нем.

Вы можете сократить время ожидания с помощью Serial.setTimeout(), но это может сделать вашу программу более сложной для интерактивного тестирования, вводя команды на эмулятор терминала.

Я рекомендую добавить завершающий символ (скажем, '\n') к каждому из ваши сообщения, затем замените Serial.readString() на Serial.readStringUntil(). Этот метод вернется немедленно, когда он находит завершающий символ. Обратите внимание, что этот символ не появляются в возвращаемом строковом объекте. readStringUntil() также подчиняется тайм-аут, но только если не удается найти завершающий символ.

Или вы можете изучить чистый способ чтения Serial на Ардуино. Да, это немного сложнее, но не страшно.

,