stm32的f103---esp8266模块(一)

1 esp8266作为设备  esp-01s

1.1入网设置

设置工作模式

AT_CWMODE=1 //1. 是station(设备)模式2.是AP(路由器)模式3.是双模

OK

以设备模式接入家中路由器配置

AT+CWJAP="2604","nh26042604"

WIFI CONNECT //如果成功

WIFI GOT IP

设置单路连接模式(透传只能使用此模式)

AT+CIPMUX=0

OK

查询IP地址 没连上WIFI之前只有两条指令

AT+CIFSR

+CIFSR:APIP,  "192.168.1.11"

+CIFSR:APMAC, "4e:75:25:0d:ae:2f"

+CIFSR:STAIP, "192.168.0.148"

+CIFSR:STAMAC,"4c:75:25:0d:ae:2f"

OK

代码实现AT指令

代码实现esp8266连接tcp服务器不能发数据

断网再连就可以了

网络调试助手的TCP client打不开

联系快速的断连

头文件

cpp 复制代码
/* 错误代码 */
#define ESP8266_EOK                     0      /* 没有错误 */
#define ESP8266_ERROR                   1      /* 通用错误 */
#define ESP8266_ETIMEOUT                2      /* 超时错误 */
#define ESP8266_EINVAL                  3      /* 参数错误 */

/* UART收发缓冲大小 */
#define ESP8266_RX_BUF_SIZE            128
#define ESP8266_TX_BUF_SIZE            64


void esp8266_init(uint32_t baudrate);//所以增加新添加一个
void esp8266_receiv_data(void);
void esp8266_test(void);

esp8266串口初始化

cpp 复制代码
uint16_t esp8266_rx_buf[ESP8266_RX_BUF_SIZE]
uint16_t eso8266_cnt = 0,esp8266_cntPre = 0;

UART_HandleTypeDef esp8266_handle = {0};

void esp8266_uart_init(uint32_t baudrate)
{
    esp8266_handle.Instance = ;//选择USART1
    esp8266_handle.Init.Baudrate = baudrate;//波特率设置
    esp8266_handle.Init.WordLength = UART_WORDLENGTH;     /*字长为8位设置模式*/
    esp8266_handle.Init.StopBits   = UART_STOPBITS_1;     /*一个停止位*/
    esp8266_handle.Init.Parity     = UART_PARITY_NONE;    /* 无奇偶校验位 */
    esp8266_handle.Init.HwFlowCtl  = UART_HWCONTROL_NONE;/*无硬件流控制*/
    esp8266_handle.Init.Mode       = UART_MODE_TX_RX;   /设置为收发模式/
    HAL_UART_init(&esp8266_handle);                     /*会使能esp8266*/
}

接收数据清除

cpp 复制代码
void esp8266_rx_clear(void)
{
    memset(esp8266_RX_buf,0,sizeof(esp8266_rx_buf));/* 清空接收缓冲区 */
    eso8266_cnt = 0;                                /* 接收计数器清零 */
}

中断服务函数

cpp 复制代码
void USART2_TRQHandler(void)
{
    uint8_t receive_data = 0;
    /* 获取接收RXNE标志位是否被置位 */
    if(__HAL_UART_GET_FLAG(&esp8266,UART_FLAG_RXNE) != RESET)
    {
        /* 如果接收的字符数大于接收缓冲区大小, */
        if(esp8266_cnt >= sizeof(esp8266_rx_buf))
        esp8266_cnt = 0; /* 则将接收计数器清零 */

        /* 接收一个字符 */
        HAL_UART_Receive(&esp8266_handle, &receive_data,1,1000);
        /* 将接收到的字符保存在接收缓冲区 */
        esp8266_rx_buf[esp8266_cnt++] = receive_data;
}
      /* 获取接收空闲中断标志位是否被置位 */
     if(__HAL_UART_GET_FLAG(&esp8266_handle,UART_FLAG_IDLE) != RESET)
    {
        /* 将接收到的数据打印出来 */
        printf("recv: %s\r\n", esp8266_rx_buf);
        esp8266_rx_clear();
        __HAL_UART_CLEAR_IDLEFLAG(&esp8266_handle);/* 清除UART总线空闲中断 */
}
}

接收等待函数

cpp 复制代码
uint8_t esp8266_wait_receive(void)
{
    if(esp8266_cnt == 0)
        return ESP8266_ERROR;//没传送玩
    if(esp8266_cnt == esp8266_cntPre)
    {
        esp8266_cnt = ;
        return ESP8266_EOK;//接收完成
    }
    esp8266_cntPre = esp8266_cnt;接收未完成
    return ESP8266_ERROR;
}

接收数据函数

cpp 复制代码
void esp8266_receive_data(void)
{
    if(esp8266_wait_receive() == ESP8266_EOK)//判断是否接收完成
    {
       printf("sp8266 recv: %s\r\n", esp8266_rx_bu);
       esp8266_rx_clear();        //接收的数据清除
}
}

esp8266初始化函数

cpp 复制代码
void esp8266_init(int baudrate)
{
    esp8266_uart_init(baudrate);
}

发送一个指令去 在指定时间内返回回来 否则没有接收到一个返回值  等待OK返回

cpp 复制代码
uint8_t esp8266_send_command(char *cmd,char *res)
{
    uint8_t timeout_out = 250;
    
    esp8266_rx_clear();
    HAL_UART_Transmit(&esp8266_handle,(uint8_t *)cmd,strlen(cmd),100);//发送命令,期待回复

    等待
    while(timeout_out--)//不停的等待
    {
    if(esp8266_wait_receive() == ES8266_EOK)
    {
    if(strstr((const char*)esp8266_rx_buf, res) != NULL)//判断是否有期待的字符串
    return ESP8266_EOK
}
    delay_ms(10);
}
     return ESP8266_ERROR;//否则接收错误
}

测试函数

cpp 复制代码
void esp8266_test(void)
{
    if(esp8266_send_command("AT","OK") == ESP8266_EOK)
    printf("esp8266_test: %s\r\n",esp8266_rx_buf);
}

AT测试

cpp 复制代码
uint8_t esp8266_at_test(void)
{
    return esp8266_send_command("AT\r\n","OK");
}

四个模式设置

cpp 复制代码
void esp8266_set_mode(uint8_t mode)
{
    switch(mode)
    {
    case ESP8266_STA_MODE:
        return esp8266_send_command("AT+CWMODE=1\r\n","OK");
    case ESP8266_AP_MODE:
        return esp8266_Send_command("AT+CWMODE=2\r\n","OK");
    case ESP8266_STA_AP_MODE:
        return esp8266_send_command("AT+CWMODE=3\r\n","OK");
    default:
        return ESP8266_EINVAL;//指令不存在
    }
}

ap模式输入账号密码

cpp 复制代码
uint8_t esp8266_join_ap(char *ssid,char *pwd)//账号密码
{
    char cmd[64];
    //\"HUAWEIAP-1\",=\"%s\  就指令带引号直接写不行,我们需要如此就不会将""认为是配对的
    sprintf(cmd, "AT+CWJAP=\"%s\",\"%s\"\r\n",ssid,pwd);
    return esp8266_send_command(cmd,"WIFI GOT IP");//调用指令函数期待回复WIFI GOT IP
}

设置单路连接模式

cpp 复制代码
uint8_t esp8266_connect_mode(uint8_t mode)
{
    char cmd[64];
    sprintf(cmd."AT+CIPMUX=%d\r\n",mode);//作为模式传输进入
    return esp8266_send_command(cmd,"OK");
}

esp8266初始化函数pro

cpp 复制代码
void esp8266_init(uint32_t baudrate)
{
    printf("esp8266初始化开始...\r\n");
    esp8266_uart_init(bardrate);

    printf("1测试esp8266是否存在\r\n");
    while(esp8266_at_test())//也是可以的不过一直不成功那就一直等待更为保险
    delay_ms(500);

    printf("2设置工作模式为STA...\r\n");
    while(esp8266_set_mode(ESP8266_STA_MODE))
    delay_ms(500);

    printf("3设置单路连接模式");
    while(esp8266_connect_mode(ESP8266_SINGLE_CONNECTION))
    delay_ms(500);

    printf("4连接WIFI,SSID:%s,PWD: %s\r\n", WIFI_SSID,WIFI_PWD);
    while(esp8266_join_ap(WIFI_SSID,WIFI_PWD))
    delay_ms(1500);//时间长一些更保险

    printf("esp8266初始化完成...\r\n");
}
cpp 复制代码
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "esp8266.h"
int main(void)
{
    HAL_Init();                         /* 初始化HAL库 */
    stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
    led_init();	/* LED初始化 */

		uart1_init(115200);
		esp8266_init(115200);

		printf("helloworld!\r\n");
		
    while(1)
    { 
    }
}
相关推荐
Mortal_hhh1 小时前
VScode的C/C++点击转到定义,不是跳转定义而是跳转声明怎么办?(内附详细做法)
ide·vscode·stm32·编辑器
深圳市青牛科技实业有限公司1 小时前
【青牛科技】应用方案|D2587A高压大电流DC-DC
人工智能·科技·单片机·嵌入式硬件·机器人·安防监控
Mr.谢尔比2 小时前
电赛入门之软件stm32keil+cubemx
stm32·单片机·嵌入式硬件·mcu·信息与通信·信号处理
LightningJie2 小时前
STM32中ARR(自动重装寄存器)为什么要减1
stm32·单片机·嵌入式硬件
鹿屿二向箔2 小时前
STM32外设之SPI的介绍
stm32
西瓜籽@3 小时前
STM32——毕设基于单片机的多功能节能窗控制系统
stm32·单片机·课程设计
远翔调光芯片^138287988725 小时前
远翔升压恒流芯片FP7209X与FP7209M什么区别?做以下应用市场摄影补光灯、便携灯、智能家居(调光)市场、太阳能、车灯、洗墙灯、舞台灯必看!
科技·单片机·智能家居·能源
极客小张6 小时前
基于STM32的智能充电桩:集成RTOS、MQTT与SQLite的先进管理系统设计思路
stm32·单片机·嵌入式硬件·mqtt·sqlite·毕业设计·智能充电桩
m0_739312879 小时前
【STM32】项目实战——OV7725/OV2604摄像头颜色识别检测(开源)
stm32·单片机·嵌入式硬件
嵌入式小章9 小时前
基于STM32的实时时钟(RTC)教学
stm32·嵌入式硬件·实时音视频