day01(单片机高级)单片机控制ESP8266连接TCP
目录
单片机控制ESP8266连接TCP
ESP8266介绍
官网
ESP8266简介
工具地址
ESP8266开发方式
ESP8266的AT指令
AT命令集(安信可官网)
AT指令练习
用STM32U757控制ESP8266连接TCP服务器
思路梳理
MX配置
串口收发程序编写
串口格式化输出
串口格式化输出使用
WIFI部分程序编写
加入工程代码
优化:将安信可发送的数据显示到串口调试助手
注意:别忘了修改路由器和服务器
单片机控制ESP8266连接TCP
ESP8266介绍
官网
资源分类 | 安信可科技 https://docs.ai-thinker.com/
ESP8266简介
MAC是网络设备的唯一标识符,用于在网络中标识和识别设备,MAC地址12位十六进制数字组成;BB负责基带信号处理,它负责数字信号的调制与解调、编码与解码等;RF是无线通信中使用的电磁波频率范围;PA用于放大发射信号;LNA用于放大接收到的微弱信号并保持较低的噪声水平。
工具地址
开发工具清单 | 安信可科技 https://docs.ai-thinker.com/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B72
ESP8266开发方式
(1)固件开发(二次开发):不需要其他单片机只用8266就可以了,写8266内程序
(2)AT指令方式开发:需要通过串口再接一个单片机,8266和这个单片机进行串口通信,8266内有原本的固件程序,单片机串口发送指令(AT指令)控制8266
ESP8266的AT指令
AT命令集(安信可官网)
AT指令练习
S2,S3在USB(因为需要用串口助手测试);用于调试
S4在运行,正常运行固件
配置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+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测试:使用了安信可透传云
安信可透传云 V1.0http://tt.ai-thinker.com:8000/ttcloud
用STM32U757控制ESP8266连接TCP服务器
思路梳理
程序编写思路
- 打开CubeMX,创建项目
- 打开烧录引脚
- 配置串口1(打印调试使用),使能---》数据格式---》波特率 115200
- 配置串口5(和ESP8266通信)使能接收中断
- 配置工程---》导出工程----》先编译一次
- 写程序
- 使能串口5的接收中断
- 使能串口5的空闲中断
- 写不定长接收程序(进中断向量表跳转)
- 写串口1和串口5的发送函数
- 方法一:用HAL库(不能格式化输出,阻塞式发)
- 方法二:printf重定向(用C库的函数 只有一个C库,只能用一个串口)
- 方法三:自己写格式化输出
- 建立连接(发送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 | 使能透传发送 |
MX配置
配置串口5为异步通信,波特率115200 8位数据 1位停止 奇偶校验不配置
配置串口1 (同串口5)
STM32中的ICACHE是什么有什么用?如何使用?_stm32 icache-CSDN博客文章浏览阅读1.6k次,点赞6次,收藏20次。icache是一种用于缓存指令的存储器,其目的是提高CPU执行指令的效率。在计算机系统中,icache(指令缓存)是处理器核心内部的一个关键组件,它专门用来存储最近使用过的指令。当CPU需要执行一个指令时,会首先检查i-cache中是否已经缓存了该指令。如果所需的指令已在i-cache中(这种情况称为缓存命中),CPU可以直接从i-cache中快速读取指令,无需等待从主内存中获取,这显著提高了指令的访问速度并提升了程序的执行效率。_stm32 icachehttps://blog.csdn.net/qq_33738357/article/details/138669877?spm=1001.2014.3001.5501
串口收发程序编写
mian函数中使能串口空闲中断(记得声明)
uint8_t USART5_RxBuff[1024]; //不定长接收缓冲区
uint8_t USART5_RxCounter; //不定长接受标志位
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; //定义缓冲区
USART5_RxCounter=1;//标识标识数据接收完毕
}
/* USER CODE END UART5_IRQn 1 */
}
串口格式化输出
方法一、用库(不能格式化输出 阻塞式发)
方法二、重定向(用C库函数 只能用一个串口)
方法三、自己写格式化输出
串口格式化输出程序https://docs.qq.com/doc/DQWVEbnhRSGZFakhX
串口格式化输出使用
USART_printf(&huart1,"ruan_jiayu\n");
功能:格式化输出
参数:串口句柄,格式化输出内容
返回值:无
如果无法打印,请点开魔术棒勾选微库
WIFI部分程序编写
wifi.c
wifi.h
加入工程代码
将文件放到工程中
- main函数中调用(记得添加WIFI的头文件)
- 烧录验证功能
仿真中可以查看缓冲区,TCP发数据TCP缓冲区会随之变化