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 прямо сейчас (на более позднем этапе, конечно ).
@Ognyan Petkov, 👍0
Обсуждение2 ответа
Лучший ответ:
Да, String
имеет немного больше накладных расходов, чем обычные c-строки (также известные как массивы char
), хотя дополнительное время выполнения будет слишком маленьким, чтобы вы заметили (особенно когда вы вводите команды вручную).
Не будет проблемой использовать String
в вашем скетче, хотя вы должны сделать это правильно и использовать String.reserve()
, чтобы выделить достаточно места в памяти в String
для хранения самой длинной строки, которая у вас есть. Также не просто добавляйте String
вместе. Таким образом, вы можете избежать фрагментации памяти (эффективно превращая ОЗУ в швейцарский сыр) и по-прежнему использовать String
.
Хотя, когда вы больше не спешите, полезно научиться использовать c-строки.
И что произойдет, если я использую char или byte и отправлю команду дольше, чем ожидалось? Остальные байты остаются в последовательном буфере, а затем при дальнейшем чтении я получаю неправильную команду или он очищает буфер после его заполнения?, @Ognyan Petkov
Что произойдет затем, зависит от вашего программирования. Распространенным способом является завершение строки и отбрасывание остальных входящих данных для этого сообщения. Таким образом, вы можете оправиться от этого. Хотя у вас ограниченный список команд, поэтому для вас есть максимальная длина команд, @chrisl
Использование Serial.readString()
сделает вашу программу очень медленной. Это
потому что readString()
не знает, когда прекратить чтение. Когда
буфер последовательного ввода становится пустым, он будет ждать на всякий случай больше
символы могут появиться позже. Только по истечении времени ожидания он возвращает
строка, которую он может прочитать. Тайм-аут по умолчанию составляет одну секунду, поэтому ваш
программа не будет отвечать целую секунду после получения команды
и прежде чем действовать на нем.
Вы можете сократить время ожидания с помощью Serial.setTimeout()
, но это может
сделать вашу программу более сложной для интерактивного тестирования, вводя команды на
эмулятор терминала.
Я рекомендую добавить завершающий символ (скажем, '\n'
) к каждому из
ваши сообщения, затем замените Serial.readString()
на
Serial.readStringUntil()
. Этот метод вернется немедленно, когда он
находит завершающий символ. Обратите внимание, что этот символ не
появляются в возвращаемом строковом объекте. readStringUntil()
также подчиняется
тайм-аут, но только если не удается найти завершающий символ.
Или вы можете изучить чистый способ чтения Serial на Ардуино. Да, это немного сложнее, но не страшно.
- Как анализировать многострочные последовательные данные с неизвестным количеством строк?
- форматирование строк в Arduino для вывода
- Чтение строки, разделенной запятыми
- Arduino Serial.ReadString() проблема
- Создание строк с символами UTF-8 из данных
- Найдите ОК или ОШИБКУ в последовательной строке
- Новичок, изучающий Serial.readString()
- Команда через последовательный монитор не работает должным образом в Arduino
Рампа, Увеличение, Уменьшение, Блокировка, Стоп
могут быть представлены однобайтовыми командамиr, i, d, l, s
, @jsotola