如何解决在回调函数中获取额外数据的arduino变量?

时间:2019-07-25 13:49:52

标签: arduino mqtt esp32

使用mqtt回调函数时。我每次运行都会得到多余的字符并保留字符。

void callback(char* topic, byte* payload, unsigned int length) {
  unsigned long currentMillis = millis();
  const char* STATE_OPEN = "OPEN";
  const char* STATE_CLOSE = "CLOSE";
  const char* STATE_STOP = "STOP";
  char* msg = (char*)payload;

  if(strcmp(topic, "office/shutter") == 0) {
    Serial.println(msg);
    Serial.print("Message:");

    if(strcmp(msg, STATE_OPEN) == 0) {
      digitalWrite(relay2, LOW);
      digitalWrite(relay1, HIGH);
      shutterRunTime = currentMillis;
    }
    if(strcmp(msg, STATE_CLOSE) == 0) {
      digitalWrite(relay1, LOW);
      digitalWrite(relay2, HIGH);
      shutterRunTime = currentMillis;
    }
    if(strcmp(msg, STATE_STOP) == 0) {
      digitalWrite(relay2, LOW);
      digitalWrite(relay1, LOW);
      shutterRunTime = currentMillis;
    }
  }

  Serial.println();
  Serial.println("-----------------------");
  if((currentMillis - shutterRunTime) >= shutterMaxRun) {
    digitalWrite(relay2, LOW);
    digitalWrite(relay1, LOW);
  }
  /* Clear the strings */
  memset(msg, 0, sizeof(msg));
}

如果我在mqtt CLOSE上发布,则可以正常运行。如果我在mqtt OPEN上发布,则在OPENr之前完成CLOSE,否则在OPENE之后获得msg

我试图使变量memset无效,甚至Serial.print(length)也无效。我如何获得它只是给我有效负载的价值。 当我执行4时,它会为我提供5mydir/mycsv.csv的正确性,因此我对实际发生的事情感到困惑。

1 个答案:

答案 0 :(得分:3)

您不能只将字节数组payload转换为char数组,然后将其视为字符串(以null结尾的char数组)

当您调用Serial.println(msg)时,println不知道字符串有多长,因此它将继续读取,直到它到达在内存中找到的第一个null为止。到目前为止,听起来您很幸运,仅在传入payload字节数组的实际长度之后才增加了1或2个字节。

如果您想要一个仅包含有效负载的字符串,则应该分配一个新的length + 1的char数组,并确保新数组中的最后一个char设置为0(空)。

您可能还应该在const字符串中包含null终止符,这样strcmp也会正常工作。