我使用esp8266,raspberry和MQTT。我在大学上工作这个项目以便毕业。
uint32_t start = millis();
while (millis() - start < 500) {
if ((char)payload[0]=='m'){
client.connected();
long memory = ESP.getFreeHeap();
char mem[16];
sprintf(mem,"Status memory1 : %d Kb",memory);
client.publish("esp8266",mem);
return;
}
}
if((char)payload[0]=='s'){
client.publish("esp8266", "Hello Raspberry Pi");
client.disconnect();
}
当我运行该代码时,在语句“ m”处,esp8266仅向树莓派发送一次“状态内存”,而不会循环。为什么“ while”在接收到下一条语句之前不会反复连续发送。
对不起,如果我的英语不好,我需要解决方案,请帮助我。谢谢
答案 0 :(得分:0)
我看到更多错误:
return
在第一次运行payload[0] == 'm'
小缓冲区:
文本"Status memory1 : Kb"
(无%d
)长20个字符。
但是char mem[16]
仅定义了一个16个字符长的缓冲区。这意味着将有一个溢出。
无法确定此错误后将发生什么。它可以覆盖start
,
甚至返回的位置都可能导致应用程序崩溃(执行不应执行的代码)。
固定代码:
uint32_t start = millis();
while (millis() - start < 500) {
if ((char)payload[0] == 'm') {
client.connected();
long memory = ESP.getFreeHeap();
char mem[32]; // updated value from 16 to 32
sprintf(mem, "Status memory1 : %d Kb", memory);
client.publish("esp8266", mem);
// removed return
}
}
if ((char)payload[0]=='s')
{
client.publish("esp8266", "Hello Raspberry Pi");
client.disconnect();
}
client.connected();
和client.disconnect();
的位置是否正确。这取决于未知因素,但在此示例中,这些功能可能应放在代码的(连接)之前或之后(断开)。