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)
    { 
    }
}
相关推荐
落雨封海1 小时前
【1】GD32 系统架构、内核、中断系统、存储器系统
单片机·gd32
weixin_462901972 小时前
STM32F103C8T6裸机多任务编程的问题
stm32·单片机·嵌入式硬件
Jumbuck_105 小时前
基于OpenMV+STM32+OLED与YOLOv11+PaddleOCR的嵌入式车牌识别系统开发笔记
笔记·stm32·嵌入式硬件
小智学长 | 嵌入式8 小时前
单片机-89C51部分:4、固件烧录
c语言·单片机·嵌入式硬件
时之彼岸Φ8 小时前
Adruino:传感器及步进电机
单片机·嵌入式硬件
网易独家音乐人Mike Zhou8 小时前
【Linux应用】交叉编译环境配置,以及最简单粗暴的环境移植(直接从目标板上复制)
linux·stm32·mcu·物联网·嵌入式·iot
少年、潜行9 小时前
【开源】基于51单片机的简易智能楼道照明设计
单片机·嵌入式硬件·51单片机
子朔不言9 小时前
MH2103 MH22D3系列的JTAG/SWD复用功能和引脚映射,IO初始化的关键点
单片机·mcu·mh2103·mh22d3·新龙微·兆讯
国科安芯9 小时前
基于先进MCU的机器人运动控制系统设计:理论、实践与前沿技术
人工智能·单片机·机器人
honey ball9 小时前
为啥低速MCU单板辐射测试会有200M-1Ghz的辐射信号
单片机·嵌入式硬件