通過ESP8266連接WIFI,啟動TCP,接受TCP客戶端指令
- **記錄**
- `2025年9月8日11:20:37`
- `2025年9月9日08:45:34`
- `2025年9月11日21:40:22`
- **代碼**
記錄
2025年9月8日11:20:37
【測試情況】
代碼可以跑到正確連接WIFI,也能獲得IP,但是啟動TCP服務失敗了。
【當前問題】
- 啟動TCP服務必現失敗
- 為什么后期連AT都測試不了?
【懷疑待測】
- 懷疑當前ESP有問題,又買一個新的來做對比
2025年9月9日08:45:34
【我的發現】
- 接入3.3V的ESP8266 RST引腳,插入拔下會觸發重啟,但是重啟有幾率成功和失敗,失敗時會一直打印亂碼。
- 如果要啟動TCP服務,需要設置AT+CIPMUX=1
【測試情況】
- 插入拔下接入3.3V的ESP8266 RST引腳,觸發重啟,同時重啟ARDUINO
- 等一段時間后,重啟TCP服務有幾率成功
【當前問題】
- 在ESP8266斷電再上電情況下,看資料說臨時設置會消失,但是為什么我斷電上電后,還會打印WIFI CONNECTED?
- ESP8266重啟所需要花費的時間是多久?
- 為什么啟動TCP服務是有幾率成功?這個和什么有關系?
- ESP8266重啟后為什么有時候一直打印亂碼?
【懷疑測試】
- 懷疑是RST使用不當,嘗試使用代碼重啟,arudino在串口發送命令控制ESP8266的重啟。
接線圖
ESP-01 Arduino/Uno
EN ─────────── D4(GPIO輸出)
RST ─────────── D5(GPIO輸出)
GND ─────────── GND(共地)
TX ─────────── D3(軟件串口RX)
RX ─────────── D2(軟件串口TX)
代碼
#include <SoftwareSerial.h>
SoftwareSerial espSerial(2, 3); // D2=RX, D3=TX(連接ESP-01的TX/RX)#define ESP_EN 4 // EN引腳接D4
#define ESP_RST 5 // RST引腳接D5void setup() {Serial.begin(115200);espSerial.begin(115200);// 初始化EN和RST引腳為輸出,默認高電平(模塊正常工作)pinMode(ESP_EN, OUTPUT);pinMode(ESP_RST, OUTPUT);digitalWrite(ESP_EN, HIGH);digitalWrite(ESP_RST, HIGH);Serial.println("模塊初始化完成");
}void loop() {// 示例1:按下串口輸入'R'觸發復位if (Serial.available() && Serial.read() == 'R') {Serial.println("觸發模塊復位...");digitalWrite(ESP_RST, LOW); // RST拉低復位delay(100);digitalWrite(ESP_RST, HIGH);delay(1000); // 等待重啟}// 示例2:按下串口輸入'S'觸發休眠(關閉模塊)if (Serial.available() && Serial.read() == 'S') {Serial.println("模塊進入休眠...");digitalWrite(ESP_EN, LOW); // EN拉低關閉模塊}// 串口透傳邏輯(省略,參考之前的軟件串口代碼)
}
- 設置esp8266的命令使用永久命令
2025年9月11日21:40:22
【我的發現】
- ESP-01S到貨,經過測試確實比01穩定得多,01S雖然價格多幾塊,這里推薦01S,穩定而且還不用自己在EN和RST上加上拉電阻。
- 根據自己的場景需要,可以永久設置ESP8266的某些參數,比如模式和wifi密碼等參數,這樣在重啟或者斷點esp8266后,就直接設置臨時參數就可以了,比如需要啟動TCP服務的場景中,可以參考如下設置永久和臨時參數:
先后設置永久參數:AT+CWMODE_DEF、AT+CWJAP_DEF
然后臨時設置參數:AT+CIPMUX、AT+CIPSERVER
這樣,即使斷點或者重啟了ESP8266,也可以自動連接WIFI,等連接后只需要臨時設定連接模式和啟動TCP。
【測試情況】
3. 測試了01S,在接線上,EN和RST直接接的公共3.3V
4. 與01S不通,在使用了透傳代碼后,可以直接看到ESP8266打印的信息,并且最后一行字是ready,才表示啟動成功。
5. 又同樣方法測試了01,無反應,估計是壞了。
6. 手動測試了AT指令都成功
7. 使用之前的代碼執行AT指令失敗,經過研究,最后修改sendCommand函數后成功了。
8. 在ES01上測試了上次的重啟ESP的代碼,感覺
沒什么用,也有可能沒有測對,下次再測。
【等待測試】
9. 發送命令到ESP8266中的函數需要優化,因為在執行獲取IP的時候,只能讀取到MAC地址,讀取不了IP
10. 使用JAVA連接TCP服務器發送命令后,獲取ESP8266的返回打印。
待測代碼 https://gitee.com/likexiang/like-code/blob/master/Arduino/ESP-TCP.ino
代碼
通過ESP8266連接WIFI,啟動TCP,接受TCP客戶端指令的代碼:
https://gitee.com/likexiang/like-code/blob/master/Arduino/ESP-TCP.ino