3

我正在用我的 arduino uno 测试 wifi 模块 esp8266。我使它与直接连接 RX/TX 和通过软件串行一起工作。

这是我的代码:

#include <SoftwareSerial.h>
SoftwareSerial esp8266(3, 2); // RX | TX

#define DEBUG true

int ERROR_PIN = 7;
int OK_PIN = 6;

char serialbuffer[400];//serial buffer for request url
const String ssid = "XXX";
const String pw = "XXX";

int state = 0;

void setup() 
{
    delay(1000);
    /**
    // init leds
    pinMode(ERROR_PIN, OUTPUT);
    pinMode(OK_PIN, OUTPUT);

    state = 0;

    digitalWrite(ERROR_PIN, HIGH);
    digitalWrite(OK_PIN, LOW);
    /**/
    // init ports
    Serial.begin(19200);
    Serial.println("initializing esp8266 port...");
    esp8266.begin(19200);
    delay(400);
    // init WIFI
    /**/
    while(!esp8266.available())
    {
        Serial.print("...");
        delay(300);
    }
    Serial.println();
    Serial.println("FINISH esp8266 initializing!");
    //
    /**
    digitalWrite(ERROR_PIN, LOW);
    digitalWrite(OK_PIN, HIGH);
    state = 1;
    /**/
    /**/
    // Setup connection
    sendData("AT+RST\r\n",2000,DEBUG);
    sendData("AT+CWMODE?\r\n",1000,DEBUG);
    //sendData("AT+CWMODE=1\r\n",2000,DEBUG);
    //sendData("AT+RST\r\n",3000,DEBUG);
    //sendData("AT+CWLAP\r\n",6000,DEBUG);
    sendData("AT+CWJAP=\"" + ssid + "\",\""+ pw +"\"\r\n",12000,DEBUG);
    sendData("AT+CIFSR\r\n",8000,DEBUG);
    sendData("AT+CIPMUX=1\r\n", 6000, DEBUG);
    webRequest("");
    /**/
    /**/
}

void loop() 
{
    if (esp8266.available())
    {
        char c = esp8266.read() ;
        Serial.print(c);
        /**
        if(state == 0)
        {
            state = 1;
            digitalWrite(ERROR_PIN, LOW);
            digitalWrite(OK_PIN, HIGH);
        }
        /**/
    }
    else
    {
        /**
        if(state > 0)
        {
            state = 0;
            digitalWrite(ERROR_PIN, HIGH);
            digitalWrite(OK_PIN, LOW);
        }
        /**/
    }   
    if (Serial.available())
    {  
        char c = Serial.read();
        esp8266.print(c);
    }
}

//////////////////////////////////////////////////////////////////////////////
String sendData(String command, const int timeout, boolean debug)
{
    String response = "";
    esp8266.print(command); // send the read character to the esp8266
    long int time = millis();
    while( (time+timeout) > millis())
    {
        while(esp8266.available())
        {
            // The esp has data so display its output to the serial window
            char c = esp8266.read(); // read the next character.
            response+=c;
        }
    }
    if(debug)
    {
        Serial.print(response);
    }
    return response;
}
//////////////////////////////////////////////////////////////////////////////////
String webRequest(String url)
{
    String response = "";
    url = "www.google.es";
    //String tmpCommand = "AT+CIPSTART=4," + "\"TCP\",\"" + url + "\",80";
    String tmpSTARTCommmand = "AT+CIPSTART=0,\"TCP\",\"retro.hackaday.com\",80\r\n\r\n";
    String tmpGETCommand = "GET / HTTP/1.1\r\nHost: "; 
    tmpGETCommand += "retro.hackaday.com";
    tmpGETCommand += ":80\r\n\r\n";
    String tmpSENDCommand = "AT+CIPSEND=0," + String(tmpGETCommand.length()) + "\r\n";
    sendData(tmpSTARTCommmand, 8000, DEBUG);
    sendData(tmpSENDCommand, 8000, DEBUG);
    sendData(tmpGETCommand, 15000, DEBUG);
}

这一直有效,直到我执行 webrequest。我收到一个错误的请求响应。

initializing esp8266 port...
.........
FINISH esp8266 initializing!
BâÂúØÐPÊþ^X8Â�Ä^Âú[8ÐûÈâ·CâËØè[8Ð{Èâ·GâÃØRÈ蚉5˜‰0
bÕ
ready
AT+CWMODE?
+CWMODE:3

OK
AV®)AB•«Ë—mX·et","XXX"

OK
AT+CIFSR
+CIFSR:APIP,"192.168.4.1"
+CIFSR:APMAC,"1a:fe:34:9b:c3:83"
+CIFSR:STAIP,"192.168.1.89"
+CIFSR:STAMAC,"18:fe:34:9b:c3:83"

OK
AT+CIPMUX=1

OK
AV%AMEÕÕ*$‘²troÐ…�‘½µ‰,80
0,CONNECT

OK
AVCIPSEND=0,47
> GE@/!QQAŠrŠ%åõÑ: ÊÑɽB�……¹½µÂ‚%\n\r\nbusy s...

SEND OK

+IPD,0,323:HTTP/1.1 400 Bad Request
Server: nginx/1.6.2
Date: Sat, 04 Apr 2015 16:17:29 GMT
Content-Type: text/html
Content-Length: 172
Connection: close

<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx/1.6.2</center>
</body>
</html>

OK
"qXÑzÂC!É1âø‚h[•�™cü    ÐQ!}Ñfócú   I]Ø÷ÃBj 1¤(ÑÃÖa”K!~CóbÕ
ready

任何想法?

4

4 回答 4

1
  1. 检查它是否正常工作,如果您使用硬件串行 Rx(pin0)、Tx(pin1) 和串行监视器,ESP8266 响应正确。
  2. 尝试降低波特率。大多数时候 SoftwareSerial 和 Arduino Uno 无法处理快速响应和松散的信息。

如果您仍然收到垃圾响应,很可能您的模块已损坏。

于 2015-04-22T06:24:04.277 回答
1

我使用以下代码分离:

https://github.com/itead/ITEADLIB_Arduino_WeeESP8266/blob/master/ESP8266.cpp

但我有 mega2560 .. 硬件连接: https ://github.com/McOffsky/Arduino_ESP8266_HTTP_Client

于 2015-08-23T10:49:33.967 回答
0

您不应该在 get 命令中包含端口号。已在 cipstart 指定端口。您的 http 请求文本中有问题。其他一切(发送请求和获得响应)都可以。 http://en.m.wikipedia.org/wiki/Hypertext_Transfer_Protocol

于 2015-04-05T11:50:26.600 回答
0

检查你的电源。当我简单地将模块直接连接到 Arduino 电源引脚时,我每隔一段时间就会出现这些随机字符。那些似乎模块正在不断地自我重置并吐出模块信息。

我的解决方案是将另一个 3.3v 稳压器与 Arduino 并联。将接地连接在一起,并从该 3.3v 电源为 ESP8266 供电。问题解决了。

于 2016-07-15T05:58:03.960 回答