打印
[STM32G4]

esp8266作为wifi与手机互传数据

[复制链接]
472|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sj8zw8|  楼主 | 2024-6-30 21:27 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式


esp8266.c代码,另外需要配置usart3与定时器
#include "esp8266.h"
#include "string.h"
#include "usart.h"
#include "usart3.h"
#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"

void esp8266_start_ap(void)//esp8266作为wifi
{
       
        //设置工作模式 1:station模式   2:AP模式  3:兼容 AP+station模式
        esp8266_send_cmd("AT+CWMODE=2","OK",50);
        //Wifi模块重启
        esp8266_send_cmd("AT+RST","OK",20);
        delay_ms(1000);         //延时3S等待重启成功
        delay_ms(1000);
        delay_ms(1000);       
        esp8266_send_cmd("AT+CWSAP=\"ESP8266\",\"12345678\",4,4","OK",200);
       
    //AP模式
        esp8266_send_cmd("AT+CIPMUX=1","OK",20);
        esp8266_send_cmd("AT+CIPSERVER=1,8000","OK",20);      
        esp8266_send_cmd("AT+CIPSEND","OK",50);
}


//ESP8266退出透传模式   返回值:0,退出成功;1,退出失败
//配置wifi模块,通过想wifi模块连续发送3个+(每个+号之间 超过10ms,这样认为是连续三次发送+)
u8 esp8266_quit_trans(void)
{
        u8 result=1;
        u3_printf("+++");
        delay_ms(1000);                                        //等待500ms太少 要1000ms才可以退出
        result=esp8266_send_cmd("AT","OK",20);//退出透传判断.
        if(result)
                printf("quit_trans failed!");
        else
                printf("quit_trans success!");
        return result;
}


//向ESP8266发送命令
//cmd:发送的命令字符串;ack:期待的应答结果,如果为空,则表示不需要等待应答;waittime:等待时间(单位:10ms)
//返回值:0,发送成功(得到了期待的应答结果);1,发送失败
u8 esp8266_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
        u8 res=0;
        USART3_RX_STA=0;
       
        u3_printf("%s\r\n",cmd);        //发送命令
        if(ack&&waittime)                //需要等待应答
        {
                while(--waittime)        //等待倒计时
                {
                        delay_ms(10);
                        if(USART3_RX_STA&0X8000)//接收到期待的应答结果
                        {
                                if(esp8266_check_cmd(ack))
                                {
                                        printf("ack:%s\r\n",(u8*)ack);
                                        break;//得到有效数据
                                }
                                        USART3_RX_STA=0;
                        }
                }
                if(waittime==0)res=1;//未完成 1
        }
        return res;//完成0
}


//ESP8266发送命令后,检测接收到的应答
//str:期待的应答结果
//返回值:0,没有得到期待的应答结果;其他,期待应答结果的位置(str的位置)
u8* esp8266_check_cmd(u8 *str)
{
        char *strx=0;
        if(USART3_RX_STA&0X8000)                //接收到一次数据了
        {
                USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符
                strx=strstr((const char*)USART3_RX_BUF,(const char*)str);
        }
        return (u8*)strx;
}


//向ESP8266发送数据
//cmd:发送的命令字符串;waittime:等待时间(单位:10ms)
//返回值:发送数据后,服务器的返回验证码

void esp8266_send_data(int t,u16 waittime)
{
        char temp[5];
        char *ack=temp;
        USART3_RX_STA=0;
        u3_printf("AT+CIPSEND=0,9\r\n");//0号通道9个字符
        delay_ms(20);
        u3_printf("报告%3d%\r\n",t);        //发送
        if(waittime)                //需要等待应答
        {
                while(--waittime)        //等待倒计时
                {
                        delay_ms(10);
                        if(USART3_RX_STA&0X8000)//接收到期待的应答结果
                        {
                                USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符
                                ack=(char*)USART3_RX_BUF;
                                printf("ack:%s\r\n",(u8*)ack);
                                USART3_RX_STA=0;
                                break;//得到有效数据
                        }
                }
        }
       
}


使用特权

评论回复
沙发
sj8zw8|  楼主 | 2024-6-30 21:27 | 只看该作者
esp8266.h代码
#ifndef __ESP8266_H
#define __ESP8266_H
#include "sys.h"
#include "stdio.h"       

//用户配置AT指令
extern char restart[];
extern char cwmode[];
extern char cwlap[];
extern char cwjap[];
extern char cifsr[];
extern char cipmux[];
extern char cipstart[];
extern char cipsend[];
extern char cipserver[];
extern char cwlif[];
extern char cipstatus[];
extern char cipsto[];
extern char cipmode[];
extern char test[];


//函数

u8 esp8266_send_cmd(u8 *cmd,u8 *ack,u16 waittime);
void esp8266_send_data(int t,u16 waittime);
u8* esp8266_check_cmd(u8 *str);
u8 esp8266_quit_trans(void);       
void esp8266_start_ap(void);
#endif

使用特权

评论回复
板凳
sj8zw8|  楼主 | 2024-6-30 21:28 | 只看该作者
main.c
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "system_stm32f10x.h"
#include "usart.h"         
#include "usart3.h"
#include "esp8266.h"
int main(void)
{         
        int humidity=111,LEN;
        delay_init();                     
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
        uart_init(115200);                 //串口初始化为115200
        usart3_init(115200);
        esp8266_start_ap();//开启ap模式
  
        LED_Init();                             //LED端口初始化
        while(1)
        {
                  LEN=USART3_RX_STA&0x3fff;
               
                        esp8266_send_data(humidity,50);//发送数据
       
                 if(USART3_RX_BUF[LEN-1]=='1')//检测手机端传出的数据
                 {
                          USART3_RX_BUF[LEN-1]='0';
                                 LED0=!LED0;
                                 USART3_RX_STA=0;
                 }
        }
}

使用特权

评论回复
地板
sj8zw8|  楼主 | 2024-6-30 21:28 | 只看该作者
手机端的连接
连接wifi

使用特权

评论回复
5
sj8zw8|  楼主 | 2024-6-30 21:28 | 只看该作者
连接端口,子网掩码192.168.4.1 端口8000

使用特权

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

本版积分规则

35

主题

306

帖子

1

粉丝