打印
[应用相关]

ESP8266与MQTT协议

[复制链接]
195|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2023-9-11 13:50 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
工作模式:
STA模式        别人创建WIFI网络,ESP8266加入该网络
AP模式          产生WIFI网络
STA+AP     
物理层:
1.VCC 电源(3.3V~5V)

2 GND 电源地

3 TXD(TTL 电平,不能直接接 RS232 电平!),可接 单片机的 RXD

4 RXD(TTL 电平,不能直接接 RS232 电平!),可接 单片机的 TXD

5 RST 复位(低电平有效)

6 IO-0 进入固件烧写模式,低电平是烧写模式,高电平是运行模式(默认)

常用指令

AT指令发送给ESP8266:

电脑上面的串口助手 -- 串口1

首先USART1接收中断,接收上位机发过来的AT指令
将接收的AT指令,写入USART3->DR,就发送给ESP8266.
ESP8266接收指令后,进行响应,响应的数据,使用USART3接收中断接收数据
为了看到esp8266响应的数据,将USART3接收的数据写入USART1->DR。



代码:

#include "esp32.h"
#include "delay.h"
#include "string.h"
#include "stdio.h"

NETDATA netdata={0};

/*************************************************
                函数功能:WIFI模块
                函数参数:   无
                函数返回值: 无
**************************************************/
void esp32Init()
{
                //ESP_RXD ---PA2 --复用推挽输出
                //ESP_TXD ---PA3  --复用浮空输入
       
                //1.使能时钟     --PA   --USART2
                RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
               
                //2.配置GPIOA  工作模式
       
                //PA2复用推挽输出
                GPIO_InitTypeDef WIFI_InitStruct={0};
                WIFI_InitStruct.GPIO_Mode=GPIO_Mode_AF;
                WIFI_InitStruct.GPIO_OType=GPIO_OType_PP;   //配置为复用推挽输出
                WIFI_InitStruct.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3;
                WIFI_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;  //配置为空   输出(不需要配)
                WIFI_InitStruct.GPIO_Speed=GPIO_High_Speed;   //输出速度
                GPIO_Init(GPIOA,&WIFI_InitStruct);
               
                GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2);
                GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2);
               

                //3.配置串口
                USART_InitTypeDef USART_InitStruct={0};
                USART_InitStruct.USART_BaudRate=115200;     //波特率
                USART_InitStruct.USART_Mode =USART_Mode_Rx|USART_Mode_Tx;  //接收模式与发送模式
                USART_InitStruct.USART_Parity =USART_Parity_No;     //禁止校验
                USART_InitStruct.USART_StopBits = USART_StopBits_1;   //停止位1位
                USART_InitStruct.USART_WordLength=USART_WordLength_8b;  //数据位8位
                USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //不使用硬件流控制
                USART_Init(USART2,&USART_InitStruct);
       
                        //4.使能接收中断  串口   接收中断     
                USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
               
                //5.使能空闲中断
                USART_ITConfig(USART2,USART_IT_IDLE,ENABLE);
               
                //4-5配置NVIC
                NVIC_InitTypeDef NVIC_InitStruct={0};
                NVIC_InitStruct.NVIC_IRQChannel=USART2_IRQn;
                NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
                NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
                NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;
                NVIC_Init(&NVIC_InitStruct);
               
                //6使能USART2
                USART_Cmd(USART2,ENABLE);       
}


//编写中断服务函数(在启动文件中)
void USART2_IRQHandler(void)
{
                u8 data=0;
                //先判断终端是否产生
                                        //获取终端状态
                if(USART_GetITStatus(USART2,USART_IT_RXNE)==SET)//接收中断产生
                {
                                USART_ClearITPendingBit(USART2,USART_IT_RXNE);//清中断
                                data = USART_ReceiveData(USART2);//保存串口助手发过来的AT指令集
                                netdata.rxbuff[netdata.rxcount++] = USART_ReceiveData(USART2);//保存串口助手发过来的AT指令集
                                USART_SendData(USART1,data);//转发AT指令到USART1以及串口上面
                }
                                        //获取终端状态
                if(USART_GetITStatus(USART2,USART_IT_IDLE)==SET)//空闲中断产生
                {
                                USART2->DR;
                        /*
                        清中断
                        --对于空闲中断清理   特殊在于:
                        需要先读取 SR     USART_GetITStatus(USART2,USART_IT_IDLE)这个语句相当于读取了 SR
                        在读DR  就可以了
                        */
                }
}


/*———————————————————————————————————————————————————————————————————————————
                函数功能:                                  发送一个字节函数
                函数参数:   要发送的数据
                函数返回值: 无
—————————————————————————————————————————————————————————————————————————————*/


void Usart2SendByte(uint8_t data)
{
                //判断发送寄存器是否有数据-- 判断上次数据是否发送完成
                while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);
                USART_SendData(USART2,data);
}


/*———————————————————————————————————————————————————————————————————————————
                函数功能:                                  发送字符串函数
                函数参数:   要发送的数据
                函数返回值: 无
———————————————————————————————————————————————————————————————————————————*/

void Usart2SendStr(char *data)
{
                while(*data!='\0')
                {
                        Usart2SendByte(*data++);
                }
}

/*———————————————————————————————————————————————————————————————————————————
                函数功能:                                  发送一定长度的函数
                函数参数:   要发送的数据
                函数返回值: 无
———————————————————————————————————————————————————————————————————————————*/
void Usart2Sendbuff(char *buff,u16 len)
{
        u32 i=0;
        for(i=0;i<len;i++)
        {
                Usart2SendByte(buff);
        }
       
}

————————————————
版权声明:本文为CSDN博主「要将爱情进行到底」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_62909771/article/details/132745583

使用特权

评论回复
沙发
Henryko| | 2023-9-11 21:14 | 只看该作者
8266有什么作用啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1536

主题

14520

帖子

9

粉丝