ESP8266 wifi模块代码详解

ESP8266 模块
   github 代码链接在该文章最后

1. 第一步就是要初始化串口
  **注意:** STM32 的 Tx 连 ESP8266模块的 Rx, STM32 的 Rx 连 ESP8266模块的 Tx ,==查询 STM32 手册可以了解==
void Usart2_Init(unsigned int baud)
{
    GPIO_InitTypeDef gpio_initstruct;
    USART_InitTypeDef usart_initstruct;
    NVIC_InitTypeDef nvic_initstruct;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);        //使能GPIOA
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);        //使能 USART2
    
    gpio_initstruct.GPIO_Mode = GPIO_Mode_AF_PP;                //复用推挽输出
    gpio_initstruct.GPIO_Pin = GPIO_Pin_2;                        //PA2    TXD
    gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &gpio_initstruct);
    
    gpio_initstruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;            //浮空输入
    gpio_initstruct.GPIO_Pin = GPIO_Pin_3;                        //PA3    RXD
    gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &gpio_initstruct);
    
    usart_initstruct.USART_BaudRate = baud;                        //设置波特率
    usart_initstruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    //无硬件流控制
    usart_initstruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //设置 串口模式,接受和发送
    usart_initstruct.USART_Parity = USART_Parity_No;                    //无校验位
    usart_initstruct.USART_StopBits = USART_StopBits_1;                    //无停止位
    usart_initstruct.USART_WordLength = USART_WordLength_8b;                            //8位数据位
    USART_Init(USART2, &usart_initstruct);
    
    USART_Cmd(USART2, ENABLE);                                        //使能串口
    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);                        //使能接受中断
    
    nvic_initstruct.NVIC_IRQChannel = USART2_IRQn;
    nvic_initstruct.NVIC_IRQChannelCmd = ENABLE;
    nvic_initstruct.NVIC_IRQChannelPreemptionPriority = 0;
    nvic_initstruct.NVIC_IRQChannelSubPriority = 0;
    NVIC_Init(&nvi```
2.设置串口中断
void USART2_IRQHandler(void)
{
    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断 
    {
        if(esp8266_cnt >= sizeof(esp8266_buf))    esp8266_cnt = 0; //防止串口被刷爆,设置一个 esp8266缓冲区的长度 = esp8266_cnt
        esp8266_buf[esp8266_cnt++] = USART2->DR;        //USART2->DR 表示串口循环发送缓冲区数据
        USART_ClearFlag(USART2, USART_FLAG_RXNE);        //清除 USARTx 的待处理标志位,一定要用
    }
}
3.定义串口发送函数
  原本串口只能发送一个字符,要编写函数发送字符串

void Usart2_SendString(unsigned char *str, unsigned short len)
{
    unsigned short count = 0;
    for(; count < len; count++)
    {
        USART_SendData(USART2, *str++);                                    //发送数据
        while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);        //等待发送完成,每发送一位数据,USART_FLAG_TC = SET,跳出循环
    }

4.ESP8266发送命令数据
_Bool ESP8266_SendCmd(char *cmd, char *res, u16 time)            //_Bool 为自定义数据,可以采取宏定义方式
{    
    Usart2_SendString((unsigned char *)cmd, strlen((const char *)cmd));//串口发送数据
    while(time--)
    {
        if(ESP8266_WaitRecive() == REV_OK)                            //发送是否完成  
        {
            if(strstr((const char *)esp8266_buf, res) != NULL)        //检索到关键词(根据 AT 指令手册可以查询到 输入不同命令,所返回不同的值)
            {
                ESP8266_Clear();                                    //清空ESP8266串口缓存    
                return 0;
            }
        }
        delay_ms(10);
    }
    return 1;
​判断是否发送命令是否成功函数解释

_Bool ESP8266_WaitRecive(void)
{
    if(esp8266_cnt == 0)                             //如果发送命令数据长度为0
        return REV_WAIT;                            //REV_WAIT=1
        
    if(esp8266_cnt == esp8266_cntPre)                //判断上一次命令数据长度和这一次相等,长度赋值为USART2_IRQHandler 串口中断函数中    esp8266_buf[esp8266_cnt++] = USART2->DR; 语句在 esp8266_cnt++ ,自增中完成赋值
    {
        esp8266_cnt = 0;                            //将 esp8266_cnt 置为0    
        return REV_OK;                                //REV_OK = 0
    }        
    esp8266_cntPre = esp8266_cnt;                    //一般使用该函数,都是使用 while 循环语句,第一次收到的命令数据长度,赋值给 esp8266_cntPre,再一次进入该函数,再进行上个 if判断
    return REV_WAIT;                                //返回 1 ,表示循环继续
}
1
2
3

5.发送想要发送的任意字符函数
void ESP8266_SendData(unsigned char *data, unsigned short len)
{
    char cmdBuf[32];
    ESP8266_Clear();                                //清空缓存
    sprintf(cmdBuf, "AT+CIPSEND=%d\r\n", len);        //AT 指令中关于发送字符串的命令
    if(!ESP8266_SendCmd(cmdBuf, ">", 200))            //AT 指令中 ESP8266 收到该命令后应该收到‘>’
    {
        Usart2_SendString(data, len);                //收到该命令后可以 通过串口发送字符串了
    }
}
1
2
3
4
5
6
7
8
9
10
6.ESP8266 模块初始化
void ESP8266_Init(void)
{
    ESP8266_Clear();
    
    printf("AT\r\n");
    while(ESP8266_SendCmd("AT\r\n\r", "OK", 200))            //AT 指令测试 模块是否正常
        delay_ms(500);
    
    printf("CWMODE\r\n");
    while(ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK", 200))    //设置成 STA 模式
    delay_ms(500);
    printf("AT+CWDHCP\r\n");                                //串口调试打印相关信息                        
    while(ESP8266_SendCmd("AT+CWDHCP=1,1\r\n", "OK", 200))    //STA 运行 DHCPC,使得运行 DHCPC  设备具有上网的能力,后面一个 1 ,代表设置成 STA,前面一个 1 代表开启 DHCP,DHCP 是自动给内网机器分配 IP 地址的协议!
    delay_ms(500);
    printf("CWJAP\r\n");                                                                                    
    while(ESP8266_SendCmd(ESP8266_WIFI_INFO, "GOT IP", 200))    //连接热点,#define ESP8266_WIFI_INFO        "AT+CWJAP=\"手机热点名字\",\"手机热点密码\"\r\n",设置更改为自己的
    delay_ms(500);
    printf("CIPSTART\r\n");
    
    while(ESP8266_SendCmd(ESP8266_ONENET_INFO, "CONNECT", 200))    //连接 ONENET,#define ESP8266_ONENET_INFO        "AT+CIPSTART=\"TCP\",\"183.230.40.39\",6002\r\n" 这是 ONE-NET 平台提供的 IP 地址和 端口号,建议更改为自己的 电脑 IP ,和随机端口号,端口号建议为 8000-10000之内的数字
    delay_ms(500);
    printf("ESP8266 Init OK\r\n");                                                    
}
原文链接:https://blog.csdn.net/qq_53981146/article/details/120517502

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值