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.

Спасибо

, 👍3

Обсуждение

Боже, он использует веревку! Ого! Это зло! Я предлагаю вам научиться делать все правильно и не полагаться на (сломанные) костыли, такие как веревка. 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


2 ответа


5

Да, \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)

,

1

Хотя rchard2scout совершенно прав в том, что обрезка удалит новые строки, почему бы не изменить код так, чтобы это не имело значения?

  char c = (char)Serial.read();
  if (c == '\n')
     Complete = true;
  else
     Command += c;
,