<noscript id="mmkmi"><source id="mmkmi"></source></noscript>
  • <noscript id="mmkmi"><kbd id="mmkmi"></kbd></noscript>
  • <table id="mmkmi"><source id="mmkmi"></source></table>
  • millis函數超時溢出問題

    作者:Hing | 更新時間:2020-03-24 | 瀏覽量:1181

    在看官方給出的開關例子時,有一個這樣的疑惑,麻煩各位大佬給解答一下

    void loop() {
      //每一定時間查詢一次設備在線狀態,同時替代心跳
      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');
        //檢測json數據是否完整
        int jsonBeginAt = inputString.indexOf("{");
        int jsonEndAt = inputString.lastIndexOf("}");
        if (jsonBeginAt != -1 && jsonEndAt != -1) {
          //凈化json數據
          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);
        }
      }
    }
    //查詢設備在線狀態
    //{"M":"status"}\n
    void checkStatus() {
      Serial.print("{\"M\":\"status\"}\n");
      lastCheckStatusTime = millis();
    }

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


    評論:共1條

    bunagi 評論于:2021-08-16 21:29:55
    你首先應該看一下lastCheckStatusTime的數據類型 ,我猜想應該是無符號整形(unsigned int)。一個負數強制賦值給此類型的變量將變成這個負值的反碼
    返回頂部
    <noscript id="mmkmi"><source id="mmkmi"></source></noscript>
  • <noscript id="mmkmi"><kbd id="mmkmi"></kbd></noscript>
  • <table id="mmkmi"><source id="mmkmi"></source></table>
  • 三上悠亚在线观看