Команда strtok() с Serial связью

После того, как я беру переменную char* из последовательной связи, я использую strtok для разделения переменных с помощью " ". Но когда я это делаю, это действует так, как будто есть " " после каждого символа. Я не знаю почему. Как я могу это исправить?

void setup() {
  Serial.begin(9600); // открывает последовательный порт, устанавливает скорость передачи данных 9600 бит/с
  char* a = "The quick brown fox jumped over the lazy dog.";
  char* c = a3;
  char* b;
  b = strtok(c, " ");
  while (b != NULL) {
    Serial.println(b);
    b = strtok(NULL, " ");
  }
}

void loop() {
}

результат:

The
quick
brown
...

Этот код парсинга работает отлично, пока я не беру его из последовательных портов. Серийный код здесь, например:

#include <SoftwareSerial.h>
#define bRSerial 9600
#define bRmY 9600

char vD[45];
int i = 0;

SoftwareSerial mySerial(10, 11); // RX, TX

void setup() {
  Serial.begin(bRSerial);
  while (!Serial) {
    ;
  }
  mySerial.begin(bRmY);
}

void loop() {
  if (mySerial.available()) {
    //Serial.write(mySerial.read());
    vD[i]=mySerial.read();
    i++;
    if (i = 46) {
      char* a = vD;
      char* b;
      
      b = strtok(a, " ");
      while (b != NULL) {
        Serial.println(b);
        b = strtok(NULL, " ");
      }
      i=0;
    }
  }
}

результат:

T
h
e
q
u
i
c
k
b
r
o
w
...

Можно ли это исправить? мне нужно получить его из серийного номера и разделить на " ".

, 👍1

Обсуждение

если ( я == 46 ) {, @Juraj

да, это было. : D просто 1 ошибка, которую я не мог увидеть, спасибо., @corlamlabs uzak

это как вы планируете использовать его или только тест? было бы проще обнаружить разделитель при его чтении, @Juraj

я не знаю, как использовать его проще., @corlamlabs uzak

если это не только тест strtok, то вам не нужен strtok. прочитать в char c, и если c == ' ', вывести vD и сбросить i в 0, иначе vD[i] = c, @Juraj

и я не вижу, где вы установили завершающий 0 для vD, также известного как a, @Juraj


2 ответа


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

3

только синтаксическая опечатка. условие должно быть if ( i == 46 ) {

Если это не только тест strtok, то вам не нужен strtok. прочитать в char c, и если c == ' ', вывести vD и сбросить i до 0

и я не вижу, где вы устанавливаете завершающий 0 для vD, иначе a

,

0

Как упомянул @Juraz, если у вас опечатка. Также у меня были бы предложения как у того, кто потратил некоторое время на процесс чтения кода в терминале. Когда вам нужно прочитать что-то из последовательного порта, хорошо использовать цикл while() вместо if(), поэтому я рекомендую изменить:

while (mySerial.available()) {
  //Serial.write(mySerial.read());
  vD[i]=mySerial.read();
  i++;
  if (i == 46) {
    char* a = vD;
    char* b;

    b = strtok(a, " ");
    while(b != NULL) {
      Serial.println(b);
      b = strtok(NULL, " ");
    }
    i=0;
  }
}
,

if находится в loop(), @Juraj