Разделение Serial.readString на массив строк

Я работаю над проектом, в котором мне нужно разделить входящие данные из последовательных (точнее, по времени, то есть aa:bb:cc) и разделить их на aa, затем на bb и cc, в идеале — на массив. Я знаю, что мог бы использовать readStringUntil и создать три отдельные переменные, но я бы предпочел, чтобы это было в массивах. Вот код, который должен это сделать. Он работает с предопределенной строкой (например, 00:00:00), но при чтении серийного номера сообщает, что инициализатору не удается определить размер «ввода». Заранее благодарим за полезные предложения.

Вот код:

void setup() { 
  FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
  Serial.begin(9600);
  while(!Serial.available()){} //ждём получения последовательных данных
  String vst = Serial.readString();
  char buf[vst.length()+1];
  vst.toCharArray(buf, vst.length());
  char input[] = vst;
  char delic[] = ":";
  char* sub = strtok(input, delic);
  while(sub != NULL){
   Serial.println(ptr);
    sub = strtok(NULL, delic);
  }

, 👍0

Обсуждение

Вместо vst.toCharArray() (который копирует данные) просто используйте vst.c_str(), который уже является массивом символов. Вам не нужен buff, @Majenko


1 ответ


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

0

Ваша главная проблема заключается в следующем:

char buf[vst.length()+1];

Вы не можете инициализировать массив возвращаемым значением функции.

Вместо этого вам нужно будет использовать alloca для выполнения той же функции:

char *buf = alloca(vst.length()+1);

Однако то, как вы это делаете, расточительно. Вам вообще не нужен buf. Вы можете напрямую обращаться к внутреннему буферу char и манипулировать им внутри строки, используя vst.c_str();.

Для удобства вы можете указать на него buf:

char *buf = vst.c_str();

Для полноты картины приведем процедуру, которая принимает строку и выдает три целых числа. Поскольку мы ожидаем определенный формат, состоящий всего из трех разделов, нам действительно не нужен цикл.

// Используйте readStringUntil, чтобы избежать задержки в 1 секунду.
String vst = Serial.readStringUntil('\n');
char *buf = vst.c_str();

char *hourString = strtok(buf, ":");
char *minuteString = strtok(NULL, ":");
char *secondString = strtok(NULL, ":");

if (secondString != NULL) { // Будет истинно, только если у нас есть два двоеточия
    int hours = atoi(hourString);
    int minutes = atoi(minuteString);
    int seconds = atoi(secondString);

    Serial.print("It is ");
    Serial.print(minutes);
    Serial.print(" and ");
    Serial.print(seconds);
    Serial.print(" seconds past ");
    Serial.println(hours);
} else {
    Serial.println("Invalid time format");
} 
,