C: разделитель strtok () l oop случайный сбой - PullRequest
0 голосов
/ 26 января 2020

Я разбиваю строку (с информацией о погоде):

1:7.34:7.54:87.62:1012.33

Что такое: тип сообщения, температура, внутренняя температура, влажность и барометрия c давление

  if (rf69.available()) {
  uint8_t buf[RH_RF69_MAX_MESSAGE_LEN];
  uint8_t len = sizeof(buf);
  if (rf69.recv(buf, &len)) {

  if (!len) return;
  buf[len] = 0;

  Serial.print("Received [");
  Serial.print(len);
  Serial.print("]: ");
  Serial.println((char*)buf);
  Serial.print("RSSI: ");
  Serial.println(rf69.lastRssi(), DEC);

  char* data;
  data = (char*)buf;
  char separator[] = ":";
  char *array[4]; //4
  int i=0;
  array[i] = strtok(data,separator);
  if( array[i][0] == '1' && array[i][1] == 0 ) {
    while( i < sizeof(array) / sizeof(*array) && array[i] != NULL)  { 
      array[i] = strtok(NULL,separator);
      Serial.println(array[i]);
      i++ ;
    }
  }

  char* t1 = array[0];
  char* t2 = array[1];
  char* h = array[2];
  char* p = array[3];
  Serial.print("Temperature Outside= "); Serial.print(t1);
  Serial.print(" Temperature Enclosure= "); Serial.print(t2);
  Serial.print(" Rel. Humidity =  "); Serial.print(h);
  Serial.print(" Pressure = "); Serial.println(p);
}

}

Правильный результат:

Received [25]: 1:7.33:7.51:87.53:1012.32
RSSI: -60
7.33
7.51
87.53
1012.32 
Temperature Outside= 7.33 Temperature Enclosure= 7.51 Rel. Humidity =  87.53 Pressure = 1012.32

Но иногда мне кажется, что я получаю следующее:

Received [25]: 1:7.33:7.50:87.60:1012.33
RSSI: -60
7.33
Temperature Outside= 7.33 Temperature Enclosure=  Rel. Humidity =   Pressure =  ⸮

Как вы видите, первоначальная дата выглядит хорошо, но она не может быть обработана в случайное время.
Я не вижу ничего очевидного, но я также не C эксперт.

1 Ответ

1 голос
/ 28 января 2020

Я изменил свой l oop на следующее:

  char *array[4];
  char separator[] = ":";
  char *segmentPointer = strtok((char*)buf, separator);
  int i = 0;
  if ((segmentPointer[0] == '1') && (segmentPointer[1] == '\0')) {
    segmentPointer = strtok(NULL, separator);
    while (segmentPointer != NULL) {
      array[i] = segmentPointer;
      i++;
      segmentPointer = strtok(NULL, separator);
    }
  }

Теперь l oop работает надежно, как и ожидалось!

...