自学内容网 自学内容网

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打不开

联系快速的断连

头文件

/* 错误代码 */
#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串口初始化

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*/
}

接收数据清除

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

中断服务函数

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总线空闲中断 */
}
}

接收等待函数

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;
}

接收数据函数

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

esp8266初始化函数

void esp8266_init(int baudrate)
{
    esp8266_uart_init(baudrate);
}

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

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;//否则接收错误
}

测试函数

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

AT测试

uint8_t esp8266_at_test(void)
{
    return esp8266_send_command("AT\r\n","OK");
}

四个模式设置

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模式输入账号密码

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
}

设置单路连接模式

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

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");
}

        1.2 连接到TCP Server

                1.2.1 使用网络助手,设立TCP服务器

                1.2.2 连接服务器

AT+CIPSTART="TCP","192.168.1.18",8080 //指令,注意双引号逗号都要半角(英文)输入 CONNECT //结果:成功 OK //结果:成功
OK

                1.2.3 发送数据

AT+CIPSEND=4 //设置即将发送数据的长度

>abcd        //看到大于号后,输入消息,abcd,不要带回车

Response :SEND OK //结果:成功

//注意,这种情况下,每次发送前都要线发送AT+CIPSEND=长度,的指令,在发数据!

1.3 透传

用AT + CIPSEND = 4,每次发送数据都要进行字符长度设定

今天透传模式

AT+CIPMODE=1 //开启透传模式

Response :OK

AT+CIPSEND //带回车

Response: > //这个时候随意发送接收数据咯

退出透传模式

 在透传发送数据过程中,若识别到单独的⼀包数据 “+++”,则退出透传发送

2. ESP8266作为服务器

USB转TTL插入电脑,TX--RX RX-TX VCC-3.3V GND-GND

查询IP地址:AT+CIFSR

//1 配置成AP模式

AT+CWMODE=2

Response :OK

//2 使能多链接 AT+CIPMUX=1 Response :OK

//3 建立TCPServer AT+CIPSERVER=1 // default port = 333 Response :OK //4 发送数据 AT+CIPSEND=0,4

// 发送4个字节在连接0通道上 >abcd

//输入数据,不带回车 Response :SEND OK

//5 接收数据 +IPD, 0, n: xxxxxxxxxx //+IPD是固定字符串 0是通道,n是数据长度,xxx是数据

//断开连接 AT+CIPCLOSE=0

Response :0, CLOSED OK

 实验案例WIFI控制风扇

项目需求

电脑通过esp8266模块远程遥控风扇。

项目框图


原文地址:https://blog.csdn.net/qq_65524926/article/details/143088124

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!