基于stm32的eps8266网络时间的获取

本文介绍了如何在STM32F103ZE开发板上利用eps8266模块通过UART通信获取网络时间,并展示了相关函数如`upload_data`、`mycmd`和`getTime`用于发送AT指令、接收响应以及处理时间数据。还包含了初始化ATK-MW8266D和GPIO设置的部分代码。
摘要由CSDN通过智能技术生成

一、硬件及软件准备

STM32F103ZE开发板,eps8266, st-link驱动 ,串口连接助手,keil5

二、如何获取网络时间

在已经连接到电脑wifi后(在后文),就可以网络时间进行获取。

理解时间数据应该是从uart串口中获得的,

void upload_data(void)
{
    uint8_t *buf;
    
        /* 接收来自ATK-MW8266D UART的一帧数据 */
        buf = atk_mw8266d_uart_rx_get_frame();
        if (buf != NULL)
        {
            printf("%s", buf);
					  strcpy(dataBuff,(const char*)buf);
            /* 重开开始接收来自ATK-MW8266D UART的数据 */
            atk_mw8266d_uart_rx_restart();
        }

}
/**
 * @brief       我的ATK-MW8266D发送AT指令
 * @param       cmd    : 待发送的AT指令
 *              ack    : 等待的响应
 *              timeout: 等待超时时间
 * @retval      ATK_MW8266D_EOK     : 函数执行成功
 *              ATK_MW8266D_ETIMEOUT: 等待期望应答超时,函数执行失败
 */
void mycmd(char *cmd, char *ack, uint32_t timeout)
{
    uint8_t *ret = NULL;
    
    atk_mw8266d_uart_rx_restart();
    atk_mw8266d_uart_printf("%s\r\n", cmd);
    
    if ((ack == NULL) || (timeout == 0))
    {
        //return ATK_MW8266D_EOK;
    }
    else
    {
        while (1)
        {
            ret = atk_mw8266d_uart_rx_get_frame();
            if (ret != NULL)
            {
							  printf("%s",ret);
                if (strstr((const char *)ret, ack) != NULL)
                {
									  
									  //printf("%s",strstr((const char *)ret, ack));
								   	while(1){}
                    //return ATK_MW8266D_EOK;
                }
                else
                {
                    atk_mw8266d_uart_rx_restart();
                }
            }
            timeout--;
            delay_ms(1);
        }
        
        //return ATK_MW8266D_ETIMEOUT;
    }
}
/**
 * @brief       计算时间
 * @param       无
 * @retval      无
 */
void computeTime(char* date)
{
	  int hour_offset=23;
	  int min_offset=26;
    hour=(*(date+hour_offset)-'0')*10+(*(date+hour_offset+1)-'0');
	  min=(*(date+min_offset)-'0')*10+(*(date+min_offset+1)-'0');
	  hour+=8;
	  if(hour>=24)
		{
			hour-=24;
		}
}
/**
 * @brief       时间字符串
 * @param       无
 * @retval      无
 */
void Time(void)
{
    time[0]=hour/10+'0';
	  time[1]=hour%10+'0';
	  time[3]=min/10+'0';
	  time[4]=min%10+'0';
}
/**
 * @brief       刷新时间
 * @param       无
 * @retval      无
 */
void showTime(void)
{
	   	Time();
      lcd_show_string(100, 275, 220, 16, 16, time, BLUE);	
			printf("time:%s",time); 
}
/**
 * @brief       获取时间
 * @param       无
 * @retval      无
 */
void getTime(void)
{
    uint8_t *ret = NULL;
	  char *strr=NULL;
    char cmd[]="1";
	  char ack[]="Date";
    atk_mw8266d_uart_rx_restart();
    atk_mw8266d_uart_printf("%s\r\n", cmd);
	  delay_ms(100);
	  while (ret == NULL)
    {
        ret = atk_mw8266d_uart_rx_get_frame();
        if (ret != NULL)
        {
						//printf("%s",ret);
 			      strr=strstr((const char *)ret, ack) ;
			      if (strr != NULL)
           { 
						    computeTime(strr);
						    showTime();
						    /*Time();
                lcd_show_string(100, 275, 220, 16, 16, time, BLUE);	
					      printf("time:%s",time);  */
								//printf("%s",strstr((const char *)ret, ack));
								//while(1){}
                //return ATK_MW8266D_EOK;
            }
            else
            {
               atk_mw8266d_uart_rx_restart();
            }
        }

          delay_ms(1);
     }
	  /*
	  printf("%s",ret);
	  if(ret!=NULL)
		{
			  strr=strstr((const char *)ret, ack) ;
			  if (strr != NULL)
        {
						computeTime(strr);
            lcd_show_string(10, 155, 220, 32, 32, time, RED);	
					  printf("time:%s",time);					
						//printf("%s",strstr((const char *)ret, ack));
						//while(1){}
            //return ATK_MW8266D_EOK;
         }
         else
         {
            atk_mw8266d_uart_rx_restart();
         }
		}*/
}

初始化内容 

#include "./BSP/ATK_MW8266D/atk_mw8266d.h"
#include "./SYSTEM/delay/delay.h"
#include <string.h>
#include <stdio.h>

/*8266初始化*/
static void atk_mw8266d_hw_init(void)
{
    GPIO_InitTypeDef gpio_init_struct;
    
    ATK_MW8266D_RST_GPIO_CLK_ENABLE();
    
    gpio_init_struct.Pin = ATK_MW8266D_RST_GPIO_PIN;
    gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;
    gpio_init_struct.Pull = GPIO_NOPULL;
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(ATK_MW8266D_RST_GPIO_PORT, &gpio_init_struct);
}

/**
 * @brief       ATK-MW8266D复位
 * @param       ÎÞ
 * @retval      ÎÞ
 */
void atk_mw8266d_hw_reset(void)
{
    ATK_MW8266D_RST(0);
    delay_ms(100);
    ATK_MW8266D_RST(1);
    delay_ms(500);
}

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于STM32ESP8266的自动获取IP地址的示例代码: ```c #include <stdio.h> #include <string.h> #include "stm32f4xx.h" #define ESP8266_USART USART6 void ESP8266_Init(void) { // 初始化ESP8266串口 USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_USART6); GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_USART6); USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(ESP8266_USART, &USART_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = USART6_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_ITConfig(ESP8266_USART, USART_IT_RXNE, ENABLE); USART_Cmd(ESP8266_USART, ENABLE); } void ESP8266_SendCommand(char* command) { while(*command != 0) { USART_SendData(ESP8266_USART, *command++); while(USART_GetFlagStatus(ESP8266_USART, USART_FLAG_TXE) == RESET); } } void ESP8266_GetIP(void) { char buffer[100]; int i = 0; ESP8266_SendCommand("AT+CIFSR\r\n"); while(1) { while(USART_GetFlagStatus(ESP8266_USART, USART_FLAG_RXNE) == RESET); char c = USART_ReceiveData(ESP8266_USART); buffer[i++] = c; if(strstr(buffer, "192.168.1.") != NULL) { printf("IP address: %s\r\n", strstr(buffer, "192.168.1.")); break; } } } int main(void) { ESP8266_Init(); ESP8266_GetIP(); while(1); } ``` 在这个示例中,我们首先初始化ESP8266的串口,并设置为接收和发送模式。然后,我们发送AT+CIFSR命令来获取ESP8266的IP地址。在接收到ESP8266的响应后,我们检查响应是否包含“192.168.1.”字符串,如果包含,则打印IP地址并退出循环。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值