OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5102|回复: 1

[求助]串口(USART2)无法与esp8266通信

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2023-2-6
在线时间
1 小时
发表于 2023-2-6 01:11:09 | 显示全部楼层 |阅读模式
1金钱
1. 单独使用转接器时 esp8266通信正常2. 单独使用USART2时可以与电脑通信(RXD接PA2、TXD接PA3)
3. 目的是串口2与esp8266通信,串口1将情况反馈给pc
代码如下:
//单片机头文件
#include "stm32f10x.h"

//网络设备驱动
#include "esp8266.h"

//硬件驱动
#include "delay.h"
#include "usart.h"

//C库
#include <string.h>
#include <stdio.h>


#define ESP8266_WIFI_INFO                "AT+CWJAP=\"test\",\"123456789\"\r\n"

#define ESP8266_ONENET_INFO                "AT+CIPSTART=\"TCP\",\"101.42.42.90\",1883\r\n"


unsigned char esp8266_buf[128];
unsigned short esp8266_cnt = 0, esp8266_cntPre = 0;


//==========================================================
//        函数名称:        ESP8266_Clear
//
//        函数功能:        清空缓存
//
//        入口参数:        无
//
//        返回参数:        无
//
//        说明:               
//==========================================================
void ESP8266_Clear(void)
{

        memset(esp8266_buf, 0, sizeof(esp8266_buf));
        esp8266_cnt = 0;

}

//==========================================================
//        函数名称:        ESP8266_WaitRecive
//
//        函数功能:        等待接收完成
//
//        入口参数:        无
//
//        返回参数:        REV_OK-接收完成                REV_WAIT-接收超时未完成
//
//        说明:                循环调用检测是否接收完成
//==========================================================
_Bool ESP8266_WaitRecive(void)
{

        if(esp8266_cnt == 0)                                                         //如果接收计数为0 则说明没有处于接收数据中,所以直接跳出,结束函数
                return REV_WAIT;
               
        if(esp8266_cnt == esp8266_cntPre)                                //如果上一次的值和这次相同,则说明接收完毕
        {
                esp8266_cnt = 0;                                                        //清0接收计数
                       
                return REV_OK;                                                                //返回接收完成标志
        }
               
        esp8266_cntPre = esp8266_cnt;                                        //置为相同
       
        return REV_WAIT;                                                                //返回接收未完成标志

}

//==========================================================
//        函数名称:        ESP8266_SendCmd
//
//        函数功能:        发送命令
//
//        入口参数:        cmd:命令
//                                res:需要检查的返回指令
//
//        返回参数:        0-成功        1-失败
//
//        说明:               
//==========================================================
_Bool ESP8266_SendCmd(char *cmd, char *res)
{
       
        unsigned char timeOut = 200;

        Usart_SendString(USART2, (unsigned char *)cmd, strlen((const char *)cmd));
       
        while(timeOut--)
        {
                if(ESP8266_WaitRecive() == REV_OK)                                                        //如果收到数据
                {
                        if(strstr((const char *)esp8266_buf, res) != NULL)                //如果检索到关键词
                        {
                                ESP8266_Clear();                                                                        //清空缓存
                               
                                return 0;
                        }
                }
               
                delay_ms(10);
        }
       
        return 1;

}


//==========================================================
//        函数名称:        ESP8266_Init
//
//        函数功能:        初始化ESP8266
//
//        入口参数:        无
//
//        返回参数:        无
//
//        说明:               
//==========================================================
void  ESP8266_Init(void)
{
       
        GPIO_InitTypeDef GPIO_Initure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

        //ESP8266复位引脚
        GPIO_Initure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Initure.GPIO_Pin = GPIO_Pin_14;                                        //GPIOC14-复位
        GPIO_Initure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_Initure);
       
        GPIO_WriteBit(GPIOB, GPIO_Pin_14, Bit_RESET);
        delay_ms(250);
        GPIO_WriteBit(GPIOB, GPIO_Pin_14, Bit_SET);
        delay_ms(500);
       
        ESP8266_Clear();
       
        UsartPrintf(USART_DEBUG, "0. AT\r\n");
        while(ESP8266_SendCmd("AT\r\n", "OK"))
                delay_ms(500);
       
        UsartPrintf(USART_DEBUG, "1. RST\r\n");
        ESP8266_SendCmd("AT+RST\r\n", "");
        delay_ms(500);
       
        ESP8266_SendCmd("AT+CIPCLOSE\r\n", "");
        delay_ms(500);
       
        UsartPrintf(USART_DEBUG, "2. CWMODE\r\n");
        while(ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK"))
                delay_ms(500);
       
        UsartPrintf(USART_DEBUG, "3. AT+CWDHCP\r\n");
        while(ESP8266_SendCmd("AT+CWDHCP=1,1\r\n", "OK"))
                delay_ms(500);
       
        UsartPrintf(USART_DEBUG, "4. CWJAP\r\n");
        while(ESP8266_SendCmd(ESP8266_WIFI_INFO, "GOT IP"))
                delay_ms(500);
       
        UsartPrintf(USART_DEBUG, "5. CIPSTART\r\n");
        while(ESP8266_SendCmd(ESP8266_ONENET_INFO, "CONNECT"))
                delay_ms(500);
       
        UsartPrintf(USART_DEBUG, "6. ESP8266 Init OK\r\n");

}

//==========================================================
//        函数名称:        USART2_IRQHandler
//
//        函数功能:        串口3收发中断
//
//        入口参数:        无
//
//        返回参数:        无
//
//        说明:               
//==========================================================
void USART2_IRQHandler(void)
{

        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断
        {
                if(esp8266_cnt >= sizeof(esp8266_buf))        esp8266_cnt = 0; //防止串口被刷爆
                esp8266_buf[esp8266_cnt++] = USART2->DR;
               
                USART_ClearFlag(USART2, USART_FLAG_RXNE);
        }

}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2023-2-7 00:56:17 | 显示全部楼层
仿真看看MCU和8266通信的时候, 串口收到的数据是否正常? 或者用ttl串口模块,监控一下总线上的数据看看。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 19:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表