2016-04-13 200 views
1

我正在開發一個基於Arduino的項目。當我通過串行監視器手動發送AT命令時,我得到正確的響應,但是當我通過代碼嘗試相同的命令時,ESP8266會返回垃圾值。我附上了這兩個響應圖片,並上傳了所用的程序。ESP8266返回垃圾值

enter image description here

enter image description here

#include <SoftwareSerial.h> 
// We'll use a software serial interface to connect to ESP8266 
SoftwareSerial ESP8266 (2,3); 
//rx=2 connected to 3 of arduino. tx=3 connected to 2 of arduino 
const char SSID_ESP[]="xxxxxxxx"; 
const char SSID_KEY[]="xxxxxxxx"; 

void setup() { 
    Serial.begin(115200); 
    ESP8266.begin(115200); 
    // Change this to the baudrate used by ESP8266 
    delay(1000); // Let the module self-initialize 
    ESP8266.println("AT"); 
    delay(1000); 
    while (ESP8266.available()) Serial.write(ESP8266.read()); 
    delay(1000); 
    ESP8266.println("AT+CWJAP"); 
    ESP8266.println(SSID_ESP); 
    ESP8266.println("\",\""); 
    ESP8266.println(SSID_KEY); 
    ESP8266.println("\"\r\n"); 
    delay(1000); 
    while(ESP8266.available()) Serial.write(ESP8266.read()); 
    delay(2000); 
    ESP8266.println("AT+CWMODE=3"); 
    delay(1000); 
    while(ESP8266.available()) Serial.write(ESP8266.read()); 
    delay(1000); 
    ESP8266.println("AT+CIPMUX=0"); 
    delay(1000); 
    while(ESP8266.available()) Serial.write(ESP8266.read()); 
    delay(1000); 
    ESP8266.println("AT+CIPSTART=\"TCP\",\"api.thingspeak.com\",80"); 
    delay(4000); 
    while (ESP8266.available()) { 
    Serial.write(ESP8266.read()); 
    } 
} 

void loop() {} 
+0

如果我的答案幫助解決了您的問題,您可以將它作爲接受的答案@Rohit Rajapure –

回答

2

的修復

1. AT命令期望在命令結束時\ r \ n。在這裏你要在命令的每個部分之後發送一個新行。

ESP8266.println("AT+CWJAP"); 
ESP8266.println(SSID_ESP); 
ESP8266.println("\",\""); 
ESP8266.println(SSID_KEY); 
ESP8266.println("\"\r\n"); 

簡單的解決將是改變所有ESP8266.println()ESP8266.write()

2. 也是因爲這個命令的語法有="AT+CWJAP https://github.com/espressif/ESP8266_AT/wiki/CWJAP

所以ESP8266.println("AT+CWJAP");應該ESP8266.println("AT+CWJAP=\"");

其他解決方案

這些類型的問題可能很難調試。出於這個原因,我儘量避免發送命令的一部分。如果使用字符串,調試會更容易。

這也有能夠將命令發送到兩個串行端口的好處,因此您可以準確查看發送的內容。

String ConnectAPCmd = "AT+CWJAP=\""; 
ConnectAPCmd += SSID_ESP; 
ConnectAPCmd += "\",\""; 
ConnectAPCmd += SSID_KEY; 
ConnectAPCmd += "\""; 
Serial.println("Sent: " + ConnectAPCmd); 
ESP8266.println(ConnectAPCmd); 
+1

順便說一句,用'\ r \ n'終止命令行是不正確的,您應該只使用'\ r' 。有關詳細信息,請參見[此答案](http://stackoverflow.com/a/21503919/23118)。因此,切勿使用'writeln'或'println',使用'write'或'print'並顯式提供'\ r',以確保命令行正確終止。 – hlovdal

0

我認爲這可能是因爲低功耗。嘗試並聯連接電源,例如Arduino UNO電路板3.3v和幾節AA電池以啓動ESP。

這使得我的ESP8266-01停止返回垃圾字符,也停止斷開時不時。

1

如果你還沒有自己改變了它的ESP8266這麼想的,在波特115200運行 默認值是9600 即使ESP8266運行在波特115200,Arduino的這麼想的處理與115200軟件序列非常好。您可能想要更改爲較低的波特率。

除了我同意@hlovdal。使用寫入或打印並在每個命令的末尾提供\ r \ n,例如

ESP8266.write("AT+CWJAP="); 
    ESP8266.write(SSID_ESP); 
    ESP8266.write(","); 
    ESP8266.write(SSID_KEY); 
    ESP8266.write("\r\n"); 
0

你面對的問題是,因爲波特率 - 115200。 更改波特率爲,它會解決您的問題。