作者: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()函數,該如何解決?