单片机控制ESP8266连接TCP

ESP8266介绍

官网

资源分类 | 安信可科技 icon-default.png?t=O83Ahttps://docs.ai-thinker.com/

ESP8266简介

MAC是网络设备的唯一标识符,用于在网络中标识和识别设备,MAC地址12位十六进制数字组成;BB负责基带信号处理,它负责数字信号的调制与解调、编码与解码等;RF是无线通信中使用的电磁波频率范围;PA用于放大发射信号;LNA用于放大接收到的微弱信号并保持较低的噪声水平。

工具地址

开发工具清单 | 安信可科技 icon-default.png?t=O83Ahttps://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.0icon-default.png?t=O83Ahttp://tt.ai-thinker.com:8000/ttcloud

用STM32U757控制ESP8266连接TCP服务器

思路梳理

程序编写思路

  1. 打开CubeMX,创建项目
  2. 打开烧录引脚
  3. 配置串口1(打印调试使用),使能---》数据格式---》波特率 115200
  4. 配置串口5(和ESP8266通信)使能接收中断
  5. 配置工程---》导出工程----》先编译一次
  6. 写程序
    1. 使能串口5的接收中断
    2. 使能串口5的空闲中断
    3. 写不定长接收程序(进中断向量表跳转)
    4. 写串口1和串口5的发送函数
      1. 方法一:用HAL库(不能格式化输出,阻塞式发)
      2. 方法二:printf重定向(用C库的函数 只有一个C库,只能用一个串口)
      3. 方法三:自己写格式化输出
  7. 建立连接(发送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库函数 只能用一个串口)

方法三、自己写格式化输出

串口格式化输出程序icon-default.png?t=O83Ahttps://docs.qq.com/doc/DQWVEbnhRSGZFakhX

串口格式化输出使用

USART_printf(&huart1,"ruan_jiayu\n");
功能:格式化输出
参数:串口句柄,格式化输出内容
返回值:无

如果无法打印,请点开魔术棒勾选微库

 WIFI部分程序编写

wifi.c

wifi.h

 加入工程代码

将文件放到工程中

  • main函数中调用(记得添加WIFI的头文件)

  • 烧录验证功能

仿真中可以查看缓冲区,TCP发数据TCP缓冲区会随之变化

优化:将安信可发送的数据显示到串口调试助手

注意:别忘了修改路由器和服务器

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部