2016-04-13 137 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。 更改波特率为,它会解决您的问题。