0

我正在拆分一个字符串(带有天气信息):

1:7.34:7.54:87.62:1012.33

即:消息类型、温度、内部温度、湿度和气压

  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 专家。

4

1 回答 1

1

我将循环更改为:

  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);
    }
  }

循环现在可以按预期可靠地工作!

于 2020-01-28T09:44:08.420 回答