国内综合精彩aⅤ无码不卡_日本少妇做爰全过程_欧美性爱在线播放免费_午夜?V日韩一区二区_免费a级毛片无码免费播放_成在人线av无码喷水_亚洲精品网站色视频_国产婷婷精品成人_老师撩起裙子让我桶的视频_秋霞影院国产

millis函數(shù)超時(shí)溢出問(wèn)題

作者:Hing | 更新時(shí)間:2020-03-24 | 瀏覽量:2001

在看官方給出的開(kāi)關(guān)例子時(shí),有一個(gè)這樣的疑惑,麻煩各位大佬給解答一下

void loop() {
  //每一定時(shí)間查詢一次設(shè)備在線狀態(tài),同時(shí)替代心跳
  if (millis() - lastCheckStatusTime > postingInterval) {
    checkStatus();
  }
  //checkout 50ms 后 checkin
  if ( checkoutTime != 0 && millis() - checkoutTime > 50 ) {
    checkIn();
    checkoutTime = 0;
  }
  //讀取串口信息
  while (Serial.available()) {
    String inputString = Serial.readStringUntil('\n');
    //檢測(cè)json數(shù)據(jù)是否完整
    int jsonBeginAt = inputString.indexOf("{");
    int jsonEndAt = inputString.lastIndexOf("}");
    if (jsonBeginAt != -1 && jsonEndAt != -1) {
      //凈化json數(shù)據(jù)
      inputString = inputString.substring(jsonBeginAt, jsonEndAt + 1);
      int len = inputString.length() + 1;
      char jsonString[len];
      inputString.toCharArray(jsonString, len);
      aJsonObject *msg = aJson.parse(jsonString);
      processMessage(msg);
      aJson.deleteItem(msg);
    }
  }
}
//查詢?cè)O(shè)備在線狀態(tài)
//{"M":"status"}\n
void checkStatus() {
  Serial.print("{\"M\":\"status\"}\n");
  lastCheckStatusTime = millis();
}

在官方給出的例子中,使用了millis()函數(shù),通過(guò)查閱資料了解到該函數(shù)將在大約50天后溢出,重新歸零。再看一下官方給出的例子,”每一定時(shí)間查詢一次設(shè)備在線狀態(tài),同時(shí)替代心跳“所使用的是一個(gè)if判斷,距離上次發(fā)送查詢信息40秒后再次發(fā)送查詢信息,這里用的是”millis() - lastCheckStatusTime > postingInterval“,”lastCheckStatusTime“是上次查詢的時(shí)間,”postingInterval“是設(shè)定的時(shí)間間隔為40秒,再看一下if里面的函數(shù),查詢函數(shù)checkStatus()里的是先發(fā)送查詢信息,”Serial.print("{\"M\":\"status\"}\n");“,然后將millis()里的的時(shí)間傳遞給”lastCheckStatusTime“,”lastCheckStatusTime = millis();“,那么這里也就會(huì)出現(xiàn)一個(gè)問(wèn)題,假如在一次查詢時(shí)程序的運(yùn)行時(shí)間也就是millis()函數(shù)里面的值為49天23時(shí)59秒(millis()里是毫秒,這里為了好理解這樣表示),前面說(shuō)到在查詢函數(shù)里先發(fā)送查詢信息,然后將millis()里的的時(shí)間傳遞給”lastCheckStatusTime“,那么此時(shí)”lastCheckStatusTime“里存放的也就是49天23時(shí)59秒,那么回過(guò)頭來(lái)再看心跳代碼”millis() - lastCheckStatusTime > postingInterval“,這里的”lastCheckStatusTime“里存放的也就是49天23時(shí)59秒,而四十秒過(guò)后millis()函數(shù)將溢出,里面的值將變?yōu)?9秒,此時(shí)  39秒 - 49天23時(shí)59秒   是小于”postingInterval“里設(shè)定的40秒的,那么if判斷將為假,也就不會(huì)在執(zhí)行查詢函數(shù)了,也就沒(méi)有心跳,兩次后設(shè)備會(huì)掉線。這個(gè)問(wèn)題該怎樣解決,同樣,在設(shè)備登陸是也用到了millis()函數(shù),該如何解決?


評(píng)論:共1條

bunagi 評(píng)論于:2021-08-16 21:29:55
你首先應(yīng)該看一下lastCheckStatusTime的數(shù)據(jù)類型 ,我猜想應(yīng)該是無(wú)符號(hào)整形(unsigned int)。一個(gè)負(fù)數(shù)強(qiáng)制賦值給此類型的變量將變成這個(gè)負(fù)值的反碼
返回頂部