ESP8266 UDP通信踩坑(Arduion core for esp8266)

最近遇到了一个问题:ESP8266开发板(NodeMCU)与普通的ESP8266模块在进行TCP通讯的时候,发送数据会产生堆叠现象,而且模块接收数据很不稳定,数据经常会堆在一块收。

 

于是在社团大佬的指点下采用UDP通讯,应该会收发自如,顺滑如狗。

然后我就一直在踩坑,深坑!!

 

现在给大家看一下正点原子给出的AT指令使用示例里面的UDP通讯。

ESP8266 UDP通信踩坑(Arduion core for esp8266)_第1张图片

巨坑1:

图中红框圈出来的地方就是第一个问题。

这边ESP8266的WIFI模式不能设置成AP+STA。

做AP的一方只能设置成 AT+CWMODE=2(建议使用AT+CWMODE_DEF=2)

做STA的一方只能设置成 AT+CWMODE=1(建议使用AT+CWMODE_DEF=1)

两个模块都不能设置成STA+AP模式,因为会存在IP找不到的情况,具体的原理,我在StackOverflow上看到了国外大佬的回答,豁然开朗,下面贴上连接: https://stackoverflow.com/questions/39064193/esp8266-send-udp-string-to-ap?r=SearchResults

如果说看不懂英文的话,可以再开个网页配一个在线翻译,哈哈哈哈,我也是这么干的,一直看英文太累了。

 

巨坑2:

接收的一方的ESP8266模块,也就是需要外挂MCU的模块,必须使用 AT+CIPSTART 去监听对方的UDP连接。

坑就坑在里面的参数设置,下面给出一个正确示例:

AT+CIPSTART="UDP","192.168.4.4",2500,2500,0

第一个2500是ESP8266-NodeMCU那边的端口号,第二个2500是模块自己端口号,写成一样的方便,不会乱。

注意一点,接收方的IP地址必须自己指定,不能直接使用AP建立之后的192.168.4.1,不然就会出现上面所说的另一方找不到模块的 IP地址。

接收方ESP8266模块还需增加一个命令:AT+CIPAP_DEF="192.168.4.3"

这样就把ESP8266模块的IP改成了 192.168.4.3 ,另一方来连接这个就是连192.168.4.3 端口是2500。这样就能成功建立连接。并且还能接收到数据,无卡顿,非常流畅。

 

下面贴上完整的配置和代码:

一、第一个ESP8266-NodeMCU (Arduion开发)(发送方客户端)

#include 
#include 


const char* ssid = "MyAP1";                 //你的AP的名字
const char* password = "123456789";         //AP的密码
const char* IP = "192.168.4.3";             //创建AP的模块的IP地址
const int PORT = 2500;                      //模块的端口号
WiFiUDP Udp;
unsigned int localUdpPort = 2500;  //本地的端口号,就是ESP8266-NodeMCU的端口号
char incomingPacket[255];  // buffer for incoming packets
char  replyPacket[] = "Hi there! Got the message :-)\r\n";  // a reply string to send back

void setup() {
  
  Serial.begin(115200);
  Serial.println();
  //开始连接
  Serial.printf("Connecting to %s ", ssid);
  WiFi.mode(WIFI_STA);
  WiFi.begin("MyAP1", "123456789");
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" connected");
  //开启本地端口
  Udp.begin(localUdpPort);
  Serial.printf("Now listening at IP %s, UDP port %d\n", WiFi.localIP().toString().c_str(), localUdpPort);

}

void loop() {
    //开始发送数据
    int packetSize = Udp.parsePacket();
    //开始打包
    int mycode = Udp.beginPacket("192.168.4.3",2500);
    //写入数据
    int wirtecode = Udp.write(replyPacket);
    //发送
    int endcode = Udp.endPacket();
    //打印返回值看看是否发送出去了
    Serial.printf("udp package code =  %d, weite code = %d, endcode = %d\n",mycode,wirtecode,endcode);
    Serial.printf("UDP send once \n");
    delay(500);
    
}

二、另一个ESP8266模块的AT指令配置:(接收方服务端)

1、AT+CWMODE=2

2、AT+CWSAP_DEF="MyAP1","123456789",11,4

3、AT+CIPAP_DEF="192.168.4.3"

4、AT+CIPMUX=0

5、AT+CIPMODE=1

至此,已经可以成功连接了

如果需要接收对方发来的数据,再添加一行命令:

6、AT+CIPSTART="UDP","192.168.4.4",2500,2500,0

这样就能接收到数据了。

 

教程完毕!

如有问题,请下方留言!一起探讨吐槽!

 

 

 

 

你可能感兴趣的:(ESP8266模块)