Trim Arduino: она также удаляет \n?
Согласно инструкции:
https://www.arduino.cc/en/Reference/StringTrim
Обрежьте полосы одним или несколькими пробелами от начала и до конца. Удаляет ли он также табуляторы и \n ?
У меня есть следующий код, который работает:
while (Serial.available()) { // something came across the serial
char c = (char)Serial.read();
Command += c;
Command.trim();
if (c=='\n')
{
Complete =true;
}
if (Command.length() >0 && Complete) {
if (Command == "LED_ON") {
// Do stuff
}
Хотя я не уверен, что это работает из-за последнего оператора if, в котором говорится: if (Command == "LED_ON") игнорирует окончание \n и говорит, что он соответствует ИЛИ команда.trim() действительно снимает этот \n.
Спасибо
@qlesk, 👍3
Обсуждение2 ответа
Да, \n также удален.
Источник функции trim() находится в WString.cpp.
void String::trim(void)
{
if (!buffer || len == 0) return;
char *begin = buffer;
while (isspace(*begin)) begin++;
char *end = buffer + len - 1;
while (isspace(*end) && end >= begin) end--;
len = end + 1 - begin;
if (begin > buffer) memcpy(buffer, begin, len);
buffer[len] = 0;
}
Мы видим, что он использует функцию isspace ()
, но где определена эта функция? WString.cpp
только #включить
s WString.h
, поэтому мы идем туда.
В WString.h
мы видим, что он включает <code>ctype.h</code>. Пора перейти к ссылке на C++, которая говорит нам, что да, \n
-это "пробел" в соответствии с isspace (), поэтому он обрезан.
(обратите внимание, что на isspace()
влияют настройки локализации. Я не уверен, каковы настройки локализации при компиляции для Arduino)
Хотя rchard2scout совершенно прав в том, что обрезка
удалит новые строки, почему бы не изменить код так, чтобы это не имело значения?
char c = (char)Serial.read();
if (c == '\n')
Complete = true;
else
Command += c;
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Очистить существующий массив при получении новой последовательной команды
Боже, он использует веревку! Ого! Это зло! Я предлагаю вам научиться делать все правильно и не полагаться на (сломанные) костыли, такие как веревка. https://hackingmajenkoblog.wordpress.com/2016/02/01/reading-serial-on-the-arduino/ https://hackingmajenkoblog.wordpress.com/2016/02/04/the-evils-of-arduino-strings/, @Majenko
Я бы сделал общее замечание, сказав, что аналогичные функции в других языках программирования, которые "обрезают", удаляют все пробелы, которые обычно включают в себя новые строки, пробелы, вкладки, возврат каретки и т. Д. и т. Д. Было подтверждено, что эта версия trim делает это, но новые строки и вкладки обычно считаются пробелами на большинстве языков., @crowie