0.字串捕捉與處理
寫在這個系列之前,把ESP8266當作網路卡,必須要略懂序列埠傳資料的方法,
Arduino對ESP8266傳回的資料作判讀,再決定下一步要處理的動作
才能有效率的減少等待時間
AT指令
1.輸入 AT
2.輸入 AT+RST
3. AT+CWMODE=1 //設定成STA模式
4. AT+CWJAP="SSID","PASSWORD" //設定成STA模式
5. AT+CIPMUX=1 //開啟多重連結模式(網站伺服器需要)
6. AT+CIPSERVER=1,80 //開啟SERVER
7. AT+CIFSR //查詢IP
8.瀏覽器向ESP8266發出檢索命令
9.此時應該輸入 AT+CIPSEND=0,3 //其中0代表編號0的連線者,3代表傳送字數
10.輸入兩個字OK
11.輸入 AT+CIPCLOSE=0 //關閉編號0的連結
【第一階段】序列埠簡單處理
本段程式碼基於loop迴圈內可以反覆檢索ESP8266是否從序列埠傳來資料,並顯示在Arduino IDE序列埠視窗中
此程式碼對於測試AT指令有很好的效果,但是若要做一個網站伺服器,這樣的程式碼則需要改進
#include <SoftwareSerial.h>
#define RX 3 //ESP8266 的 TX接3
#define TX 2 //ESP8266 RX接2
SoftwareSerial ESP8266(RX,TX);
void setup()
{
Serial.begin(9600);
ESP8266.begin(9600);
}
void loop(){
if (ESP8266.available()){
Serial.write(ESP8266.read());
}
if (Serial.available()){
ESP8266.write(Serial.read());
}
}
【第二階段】抓取序列埠傳來資料
response則是抓回來回傳的資料
String response = "";
while(esp8266.available()){
char c = esp8266.read();
response += c;
}
Serial.println(response);
【第三階段】從抓回來的資料中辨識關鍵字,並做出回應
m=response.length();
for(int i=0 ; i<=m ;i++){
if(message.charAt(i)=='O'&&message.charAt(i+1)=='K'){
debug=1;
}}
Serial.println(debug);
【第四階段】以抓取IP位址為例
下圖為KEY入 AT+CIFSR 之後的回應
【因應方法】
1.先把整個回應字串抓下來成為IP
2.在IP中尋找IP的I在第幾個字元(head),因為回應的格式是固定的,因此head+4 即為IP的第一個有效字
3.在IP中尋找第二個"在第幾個字元(foot),因此foot-1 即為IP最後一個有效字
4.知道有效字在第幾個到第幾個,那就可以依序顯示出來
void getip(){
int head=0,foot=0;
String ip = "";
esp8266.println(F("AT+CIFSR"));
esp8266.flush();
while(!esp8266.available()){}
while(esp8266.available()){
char c = esp8266.read();
ip += c;
delay(5);}
for(int i=15 ; i<30 ; i++){
if(ip.charAt(i)=='I'&&ip.charAt(i+1)=='P'){head=i;}}
for(int i=28 ; i<45 ; i++){
if(ip.charAt(i)=='"'){foot=i;}}
for(int i=0 ; i<foot-head-4 ; i++){
lcd.setCursor(i,1);
lcd.print(ip.charAt(head+i+4));
}}
【第五階段】網頁伺服器的工作法則
首先要觀察命令是如何往來的
8.瀏覽器向ESP8266發出檢索命令
9.此時應該輸入 AT+CIPSEND=0,3 //其中0代表編號0的連線者,3代表傳送字數
10.輸入兩個字OK
11.輸入 AT+CIPCLOSE=0 //關閉編號0的連結
觀察上圖,發現步驟是這樣的
(1)瀏覽器發出檢索命令
(2) AT+CIPSEND=編號,字數
回應 OK 與 >
(3) 輸入回傳html
回應Recv 字數 byte 與 SEND OK
(4)AT+CIPCLOSE=編號
回應 編號CLOSED 與 OK