<em id="ri2my"></em>
  • <em id="ri2my"></em>
    <em id="ri2my"><label id="ri2my"><nav id="ri2my"></nav></label></em>
  • <em id="ri2my"><label id="ri2my"></label></em>
    <div id="ri2my"></div>
    1. <em id="ri2my"><label id="ri2my"></label></em>
    2. <em id="ri2my"><ol id="ri2my"></ol></em>
      <em id="ri2my"></em>

      1. millis函數超時溢出問題

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

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

        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)。一個負數強制賦值給此類型的變量將變成這個負值的反碼
        返回頂部

        <em id="ri2my"></em>
      2. <em id="ri2my"></em>
        <em id="ri2my"><label id="ri2my"><nav id="ri2my"></nav></label></em>
      3. <em id="ri2my"><label id="ri2my"></label></em>
        <div id="ri2my"></div>
        1. <em id="ri2my"><label id="ri2my"></label></em>
        2. <em id="ri2my"><ol id="ri2my"></ol></em>
          <em id="ri2my"></em>

          1. 免费高清视频