一、关于指令
参考我AT指令下载那篇文章,下载文档看看,这里用TCP单链接透传讲解
1. 配置 WiFi 模式AT+CWMODE=3 // softAP+station mode响应 :OK
2. 连接路由器AT+CWJAP="SSID","password" // SSID and password of router响应 :OK
3. 查询 ESP8266 设备的 IP 地址
AT+CIFSR
响应 :+CIFSR:APIP,"192.168.4.1"+CIFSR:APMAC,"1a:fe:34:a5:8d:c6"+CIFSR:STAIP,"192.168.3.133"+CIFSR:STAMAC,"18:fe:34:a5:8d:c6"OK
4. PC 与 ESP8266 设备连接同⼀路由器,在 PC 端使⽤⽹络调试⼯具,建⽴⼀个 TCP 服 务器。假设,PC 创建的服务器 IP 地址为 192.168.3.116 ,端⼝为 8080 。5. ESP8266 设备作为 TCP client 连接到上述服务器AT+CIPSTART="TCP","192.168.3.116",8080 //protocol, server IP and port响应 :OK
6. 使能透传模式AT+CIPMODE=1响应 :OK
7. ESP8266 设备向服务器发送数据AT+CIPSEND> //From now on, data received from UART will be transmitted to server automatically
8. 退出发送数据:在透传发送数据过程中,若识别到单独的⼀包数据 “+++” ,则退出透传发送。如果使⽤键盘打字输⼊ “+++” ,可能耗时太⻓,不被认为是连续的三个 “+” ,建议使 ⽤串⼝⼯具⼀次性发送 “+++” ,并请注意不要携带空格或换⾏符等不可⻅字符。之后,请⾄少间隔 1 秒,再发下⼀条 AT 指令。“+++“ 退出透传发送数据,回到正常 AT 指令模式。此时,TCP 连接仍然是保持的,可以再发 AT+CIPSEND指令,重新开始透传。
9. 退出透传模式AT+CIPMODE=0响应 :OK
10. 断开 TCP 连接AT+CIPCLOSE响应 :CLOSEDOK
二、这里我先讲解怎么在 透传模式 退出 发送数据模式
//退出透传模式 void exit_touchuan(void) { uint16_t pt[3] = {'+','+','+'}; unsigned char i=0; for(i=0;i<3;i++) { USART2->DR = (pt[i] & (uint16_t)0x01FF); // 0:数据还没有被转移到移位寄存器;1:数据已经被转移到移位寄存器。 while((USART2->SR & USART_FLAG_TXE) == (uint16_t)RESET); } USART1TxStr("退出透传模式\r\n\n"); is_touchuan = 0; delay_ms(200); }
这里我只是复制了 STM32 库函数的发送函数的 USART2->DR = (pt[i] & (uint16_t)0x01FF); 过来而已
重点是 发送的类型是 uint16_t 两个字节 不然退不出透传
三、我在STM32中初始化ESP8266 的流程
一上电就退出透传的发送数据状态,无论是否处于透传发送数据状态,这个指令可以在任意时候发,没有返回值
exit_touchuan(); // 为防止不正当复位
//重启WiFi模块 USART1TxStr("重启模块...\r\n"); USART2TxStr("AT+RST\r\n"); /* 关于重启的OK 也是代表esp8266 接收到了该指令了 然后 后面的重启信息是重启过程中发送的 */ wait_OK2();//等待接收到OK字符串
我的wait_OK2(); 函数是用来等待 响应OK的,但是有时间限制,在定时器中定时,这里我设置3s等待 ,可看下我的wait_OK2();函数,my_timeout在定时器中累加
void wait_OK2(void) { my_timeout = 0; good = 0; //等待接收到OK字符串 接收完成时 Flag_usart2_receive_OK 在接收中断置 1 while(!Flag_usart2_receive_OK) { if(my_timeout >= 6) { good = 0; USART1TxStr("wait_OK2--NOT-OK...\r\n"); break; } } Flag_usart2_receive_OK = 0; CLR_Buf2(); //清除串口2接收缓存 if(my_timeout < 6) { good = 1; USART1TxStr("wait_OK2--OK...\r\n"); } }
其他就不解释了
//设置工作模式 (8266有三种工作模式:1 单station模式,2 AP模式,3 两者混合模式) USART1TxStr("设置工作模式...\r\n"); USART2TxStr("AT+CWMODE=3\r\n"); wait_OK2();//等待接收到OK字符串 USART1TxStr("混合模式工作模式设置成功!\r\n\n"); //连接路由器 连接WiFi ChinaNet-5NDt USART1TxStr("连接路由器WiFi...\r\n"); USART2TxStr("AT+CWJAP=\"ChinaNet-5NDt-1\",\"123456789\"\r\n"); wait_OK2();//等待接收到OK字符串 if(good == 1) { USART1TxStr("WiFi连接成功!\r\n\n"); } //查询 ESP8266 设备的 IP 地址 USART1TxStr("查询 ESP8266 设备的 IP 地址...\r\n"); USART2TxStr("AT+CIFSR\r\n"); wait_OK2();//等待接收到OK字符串 if(good == 1) { USART1TxStr("请过目!\r\n\n"); } //连接服务器 USART1TxStr("连接服务器...\r\n"); USART2TxStr("AT+CIPSTART=\"TCP\",\"192.168.3.100\",8999\r\n"); wait_OK2();//等待接收到OK字符串 if(good == 1) { USART1TxStr("服务器连接成功!\r\n\n"); } #if 1 // 用透传模式 //使能透传模式 USART1TxStr("使能透传模式...\r\n"); USART2TxStr("AT+CIPMODE=1\r\n"); wait_OK2();//等待接收到OK字符串 if(good == 1) { USART1TxStr("透传模式设置成功!\r\n\n"); } #endif
四、只能这么多了
剩下就靠自己了