- 無法同時縮減同時含有 HTML/JavaScript/CSS 的單一網頁內容, 必須自己分開處理。
- 無法正確處理註解, 縮減成單一行後可能因為註解導致原來在註解之後的內容都變成註解了。
- 任意將單引號換成雙引號, 導致 JavaScript 程式碼出錯。
縮減後變成:
要自己手動找出來修改, 這是美中不足的地方。
double _N; //-- Number of samples錯誤訊息如下:
expected unqualified-id before numeric constant想說, 奇怪, 這裡哪來的數值常數?找了一下才發現, 原來 ESP8266 Arduino Core 中 ctype.h 定義了 _N 為 04, 如下:
#define _U 01 #define _L 02 #define _N 04 #define _S 010 #define _P 020 #define _C 040 #define _X 0100 #define _B 0200所以如果你的程式中使用到了 _N, 就會變前處理器取代成 04, 我的那一行程式就變成:
double 04; //-- Number of samples自然無法編譯成功了。要注意的是, 除了我碰到的 _N 外, 還有許多已經被 ctype.h 事先定義的名稱, 如果你遇到的奇怪的編譯結果, 可以到原始碼找看看, 可能你也跟我一樣遇到類似的情況, 解決的方法最簡單的就是更改自己的程式變數名稱, 避免和 ESP8266 Arduino Core 中的名稱衝突。
EEPROM.begin(sizeof(int) * 4);其次, 寫入 EEPROM 的操作必須叫用 EEPROM.commit() 才會真的儲存下來:
EEPROM.commit();這是和 Arduino 不同的地方。如果同一個程式希望在 Arduino 和 ESP8266 上都能編譯,可以使用 ESP8266 Arduino Core 在前處理器上定義的名稱 ESP8266 來做條件式編譯, 例如:
#ifdef ESP8266 EEPROM.commit(); #endif這樣就只會在編譯 ESP8266程式時叫用 commit(), 若式編譯 Arduino 程式時, 這一行就不會生效了。
Soft WDT reset ctx: cont ....原來 ESP8266 有看門狗計時器 (Watch Dog Timer), 程式會在 loop() 結束或是呼叫 delay() 時更新看門狗計時器, 如果很長一段時間沒有更新看門狗計時器, 就會啟動 reset 機制, 警告你程式某些地方有閒置過久的問題。舉例來說, 如果你在 ESP8266 上跑以下這個在 loop() 中閒置 10 秒的程式:
void setup() { Serial.begin(9600); Serial.println("Begin testing"); } unsigned long prevTime; void loop() { prevTime = millis(); while(millis() - prevTime < 10000); }就會在序列埠監控視窗中看到看門狗計時器 reset 的訊息:
void setup() { Serial.begin(9600); Serial.println("Begin testing"); } unsigned long prevTime; void loop() { prevTime = millis(); while(millis() - prevTime < 10000) {yield();} }
return int(word(high,low));遇到負數時會出現超過 32767 的數值, 害我還回頭看感測器的規格書, 以為是自己程式寫錯了。後來才想到, 可能是資料長度的問題, 改成以下這樣就正確了:
return int16_t(word(high,low));