使用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
时,它会为我提供5
或mydir/mycsv.csv
的正确性,因此我对实际发生的事情感到困惑。
答案 0 :(得分:3)
您不能只将字节数组payload
转换为char数组,然后将其视为字符串(以null结尾的char数组)
当您调用Serial.println(msg)
时,println不知道字符串有多长,因此它将继续读取,直到它到达在内存中找到的第一个null为止。到目前为止,听起来您很幸运,仅在传入payload
字节数组的实际长度之后才增加了1或2个字节。
如果您想要一个仅包含有效负载的字符串,则应该分配一个新的length
+ 1的char数组,并确保新数组中的最后一个char设置为0(空)。
您可能还应该在const字符串中包含null终止符,这样strcmp也会正常工作。