虽然C Arduino无法循环执行(With陈述式),但使用MQTT

时间:2018-09-23 06:46:12

标签: c

我使用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”在接收到下一条语句之前不会反复连续发送。

对不起,如果我的英语不好,我需要解决方案,请帮助我。谢谢

1 个答案:

答案 0 :(得分:0)

我看到更多错误:

  1. return在第一次运行payload[0] == 'm'

  2. 后终止代码
  3. 小缓冲区:

文本"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();
}
  1. 我不确定client.connected();client.disconnect();的位置是否正确。这取决于未知因素,但在此示例中,这些功能可能应放在代码的(连接)之前或之后(断开)。