
无线通信(WIFI 蓝牙 LORA NB-IOT ZIGBEE等)
课程介绍
单片机控制ESP8266连接TCP
1、ESP8266
官网
简介
ESP8266 系列模组是深圳市安信可科技有限公司开发的一系列基于乐鑫ESP8266EX的低功耗UART-WiFi芯片模组,可以方便地进行二次开发,接入云端服务,实现手机3/4G全球随时随地的控制,加速产品原型设计。
模块核心处理器 ESP8266 在较小尺寸封装中集成了业界领先的 Tensilica L106 超低功耗 32 位微型 MCU,带有 16 位精简模式,主频支持 80 MHz 和 160 MHz,支持 RTOS,集成 Wi-Fi MAC/ BB/RF/PA/LNA,板载天线。支持标准的 IEEE802.11 b/g/n 协议,完整的 TCP/IP 协议栈。用户可以使用该模块为现有的设备添加联网功能,也可以构建独立的网络控制器。
ESP8266 是高性能无线 SoC,以最低成本提供最大实用性,为 Wi-Fi 功能嵌入其他系统提供无限可能。
技术:从设计开始——————》产品完成
产品:专用目的的集成电路
ESP32:WiFi+蓝牙
工具地址
2. ESP8266开发方式
●固件开发(二次开发):不需要其他单片机只用8266就可以了,写8266内程序
●AT指令方式开发:需要通过串口再接一个单片机,8266和这个单片机进行串口通信,8266内有原本的固件程序,单片机串口发送指令(AT指令)控制8266
3. ESP8266的AT指令
AT指令集参考文档
4. AT指令练习
1 AT+RST
配置WiFi模式
AT+CWMODE=1 //station mode
响应:OK
连接AP(路由器)
AT+CWJAP="SSID","password" //SSID and password of router
响应:OK
查询 ESP8266 设备的 IP 地址
AT+CIFSR
响应:
+CIFSR:APIP,"192.168.4.1"
+CIFSR:APMAC,"82:64:6f:a8:75:e0"
+CIFSR:STAIP,"192.168.137.180"
+CIFSR:STAMAC,"80:64:6f:a8:75:e0"
OK
PC与 ESP8266 设备连接同一路由器,在PC端使用网络调试工具,建立一个 TCP 服务器。
假设:PC 创建的服务器IP 地址为 192.168.137.1,端⼝号为 8080
ESP8266 设备作为 TCP client 连接到上述服务器。
AT+CIPSTART="TCP","192.168.137.1",8080 //protocol,server IP and port
响应:OK
ESP8266 设备向服务器发送数据
AT+CIPSEND=16 //set date length which will be sent, such as 16 bytes
1234567890ABCDEF //enter the data, no CR
响应:Recv 16 bytes SEND OK
当 ESP8266 设备接收到服务器发来的数据,将提示如下信息:
+IPD,n:xxxxxxxxxx // received n bytes, data=xxxxxxxxxxx
AT |
测试 |
AT+RST |
复位 |
AT+CWMODE=1 |
设置wifi模式 ap/sta/ap+sta |
AT+CWJAP="rjy","12345678" |
连接WIFI热点 (名称+密码) |
AT+CIPMUX=0 |
设置单连接模式 |
AT+CIPSTART="TCP","192.168.1.1",8080 |
连接TCP服务器 |
AT+CIPSEND=5 |
发送数据 |
AT+CIPMODE=1 |
设置透传模式 |
AT+CIPSEND |
使能透传发送 |
在数据传输过程中,数据在传输链路的起点到终点之间,不经过任何修改或处理地直接传递。换句话说,透传意味着数据在传输过程中保持其原始性。
在串口通信中,透传模式通常意味着数据从串口接收后,会原封不动地通过另一个串口发送出去,不会经过任何中间处理或修改。
在网络传输中,虽然数据包在传输过程中可能会经过多个路由器或交换机,但在透明传输(与透传相似但更广泛的概念)的情况下,这些数据包的内容不会在这些中间设备上被修改或检查,除非有特定的安全或路由需求。(防火墙关掉)
TCP测试:使用了安信可透传云
- 单片机控制ESP8266连接TCP程序编写
5.1 思路梳理
程序编写思路
- 看原理图,找串口(串口5-----》WiFi,串口1-----》串口助手)
- 配置工程------》MX
- 配置串口5(115200——》WiFi使用的是这个) 使能全局中断
- 配置串口1(115200) 使能全局中断
- 配置工程————》生成工程
- 打开工程一定先编译一次
- 写中断程序
- 使能串口5的接收中断(肯定不能使用轮询)
- 使能串口5的串口空闲中断(检查是否有数据传输)
- 找到中断向量表---》中断服务程序
- 在中断服务程序写接收程序
- 判断空闲线是否为空(1)表示完成
- 清除空闲中断标志位(不能自动清除。如果不轻触——》只要有中断就会进入)
- 计算接收数据的长度
- 重新指定接受数据缓冲区的地址
- 重新指定接受数据的最大长度(1024)
- 可以加一个数据标志位,判断数据完成
- 写串口1和串口5的发送数据
- 方法一:HAL用库(不能格式化输出 阻塞形式 指定长度);
- 方法二:重定向(用的是C库,只能重定向一个)
- 方法三:自己写格式化输出
- 实现AT指令并判断返回值
5.2 MX配置
5.3 串口收发程序编写
启动文件说明
【教程】一文搞懂STM32启动文件_eclipse stm32 启动文件-CSDN博客
mian函数中使能串口空闲中断(记得声明)
HAL_UART_Receive_IT(&huart5,USART5_RxBuff,1024);
__HAL_UART_ENABLE_IT(&huart5,UART_IT_IDLE);//空闲中断
去中断向量表->找中断服务程序(目的:判断是否接收数据完毕,完毕了计算接收了多少数据,并标记已经接受完毕)
extern uint8_t USART5_RxBuff[1024];
extern uint8_t USART5_RxCounter;
void UART5_IRQHandler(void)
{
/* USER CODE BEGIN UART5_IRQn 0 */
/* USER CODE END UART5_IRQn 0 */
HAL_UART_IRQHandler(&huart5);//自带的不用管
/* USER CODE BEGIN UART5_IRQn 1 */
//以下的是咱们自己写的
if(__HAL_UART_GET_FLAG(&huart5, UART_FLAG_IDLE) == SET)
//判断是否触发串口空闲中断
{
int datalen = 0;
//用于存储接收数据长度,这里的没有用,如果有需要可以弄全局变量
__HAL_UART_CLEAR_IDLEFLAG(&huart5); //清除空闲中断标志
datalen = 1024 - huart5.RxXferCount; //接收到多少数据
//HAL_UART_Transmit(&huart1,(uint8_t*)USART5_RxBuff,datalen,10);
//验证是否收到,正式功能里注释掉
//memset(USART5_RxBuff,0,1024);
//正式功能可以哪里使用数据,使用完清除
huart5.RxXferCount = 1024;//初始化接收的最大数据量
huart5.pRxBuffPtr = USART5_RxBuff;//定义缓冲区
}
/* USER CODE END UART5_IRQn 1 */
}
<