WIFI模块(esp-01s)获取网络时间代码实现

目录

前言:

一、串口程序的编写

1、串口重定向

2、回调函数

二、WiFi模块发送AT指令

esp01s.c

esp01s.h

三、数据处理

初始化

1、cjson的使用

2、字符串提取有用信息

3、转成标准时间

4.任务处理


前言:

        前面讲解了使用AT指令获取网络时间与cjson的解析数据,本章综合将时间显示到屏幕

一、串口程序的编写

1、串口重定向

int fputc(int ch,FILE *f)
{//采用轮询方式发送1字节数据,超时时间设置为无限等待HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,HAL_MAX_DELAY);return ch;
}
int fgetc(FILE *f)
{uint8_t ch;// 采用轮询方式接收 1字节数据,超时时间设置为无限等待HAL_UART_Receive( &huart1,(uint8_t*)&ch,1, HAL_MAX_DELAY );return ch;
}

2、回调函数

uint8_t rx_dat;
char rxdata[256];
uint8_t rx_p = 0,rx_ppre = 0;
//串口中断接收数据
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart->Instance == USART1){if(rx_p >= sizeof(rxdata))  rx_p = 0;       //防止串口被刷爆rxdata[rx_p ++] = rx_dat;HAL_UART_Receive_IT(&huart1,&rx_dat,1);}
}

二、WiFi模块发送AT指令

esp01s.c

#include "esp01s.h"
#include "usart.h"uint8_t rx_dat;
char rxdata[256];
uint8_t rx_p = 0,rx_ppre = 0;unsigned char Time_buff[100];int fputc(int ch,FILE *f)
{//采用轮询方式发送1字节数据,超时时间设置为无限等待HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,HAL_MAX_DELAY);return ch;
}
int fgetc(FILE *f)
{uint8_t ch;// 采用轮询方式接收 1字节数据,超时时间设置为无限等待HAL_UART_Receive( &huart1,(uint8_t*)&ch,1, HAL_MAX_DELAY );return ch;
}//串口中断接收数据
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart->Instance == USART1){if(rx_p >= sizeof(rxdata))  rx_p = 0;       //防止串口被刷爆rxdata[rx_p ++] = rx_dat;HAL_UART_Receive_IT(&huart1,&rx_dat,1);}
}//清空缓存
void esp01s_clear(void)
{memset(rxdata,0,sizeof(rxdata));rx_p = 0;
}//esp01s等待接收完成 0成功 1失败
int esp01s_waitrecive(void)
{if(rx_p == 0) 							//如果接收计数为0 则说明没有处于接收数据中,所以直接跳出,结束函数return 1;if(rx_p == rx_ppre)				//如果上一次的值和这次相同,则说明接收完毕{rx_p = 0;							//清0接收计数return 0;								//返回接收完成标志}rx_ppre = rx_p;					//置为相同return 1;								//返回接收未完成标志
}//esp01s发送指令   0成功 1失败
int esp01s_sendcmd(char *cmd,char *res)
{unsigned char timeout = 250;printf(cmd);while(timeout --){if(esp01s_waitrecive() == 0)            //如果收到数据{if(strstr(rxdata,res) != NULL)      //如果检索到关键词{esp01s_clear();return 0;}}HAL_Delay(10);}return 1;
}//esp01s发送数据
void esp01s_senddata(char *data)
{esp01s_clear();								//清空接收缓存if(!esp01s_sendcmd("AT+CIPSEND\r\n",">"))				//收到‘>’时可以发送数据//printf(data);{/*发送请求数据*/printf(data);               	//发送设备连接请求数据HAL_GPIO_WritePin(led_blue_GPIO_Port,led_blue_Pin,GPIO_PIN_SET);}}unsigned char *ESP8266_GetIPD_GET(unsigned short timeOut, uint8_t *buff) //这里我用了一个全局变量将esp8266buf储存到这个全局变量里面
{do{HAL_Delay(5);}while(timeOut--);strcpy((char*)buff, (char*)rxdata);return buff;
}

esp01s.h

#ifndef __ESP01S_H
#define __ESP01S_H#include "main.h"
#include "string.h"
#include "stdio.h"extern uint8_t rx_dat;
extern char rxdata[256];
extern uint8_t rx_p,rx_ppre;
extern unsigned char Time_buff[100];void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
void esp01s_clear(void);
int esp01s_waitrecive(void);
int esp01s_sendcmd(char *cmd,char *res);
void esp01s_senddata(char *data);
unsigned char *ESP8266_GetIPD_GET(unsigned short timeOut, uint8_t *buff);#endif 

三、数据处理

初始化

esp01s_clear();while(esp01s_sendcmd("+++",""));while(esp01s_sendcmd("AT\r\n", "OK"));while(esp01s_sendcmd("AT+RST\r\n", "OK"));while(esp01s_sendcmd("AT+CWMODE=1\r\n", "OK"));while(esp01s_sendcmd("AT+CIPMUX=0\r\n", "OK"));while(esp01s_sendcmd("AT+CWJAP=\"meng\",\"20010131\"\r\n", "WIFI GOT IP"));// while(esp01s_sendcmd("AT+CIPSTART=\"TCP\",\"api.seniverse.com\",80\r\n","CONNECT"));while(esp01s_sendcmd("AT+CIPSTART=\"TCP\",\"api.pinduoduo.com\",80\r\n","CONNECT"));while(esp01s_sendcmd("AT+CIPMODE=1\r\n", "OK"));

1、cjson的使用

void test1_jiexi()
{//解析// char jsondata[] = "{\"name\":\"menglingjun\",\"age\":21}";cJSON *json = NULL,*json_name = NULL,*json_age = NULL;json = cJSON_Parse((char *)te);//解析失败if(!json){}else{json_age = cJSON_GetObjectItem(json,"server_time");char *print1 = cJSON_Print(json_age);// lcd_showstr(5,0,(uint8 *)print1,WHITE);char *timestamp_start = strstr(print1,"17");            //字符串处理char timestamp[11];strncpy(timestamp, timestamp_start, 10);timestamp[10] = '\0'; int timestamp_cnt =atoi(timestamp);// sprintf(text,"%d",timestamp_cnt);// lcd_showstr(5,1,(uint8 *)text,WHITE);struct tm *timeinfo = localtime(&timestamp_cnt);sprintf(text,"%d-%d-%d",timeinfo->tm_year + 1900,timeinfo->tm_mon + 1,timeinfo->tm_mday);lcd_showstr(5,2,(uint8 *)text,WHITE);sprintf(text,"%d:%d:%d",timeinfo->tm_hour+8,timeinfo->tm_min,timeinfo->tm_sec);lcd_showstr(10,3,(uint8 *)text,WHITE);free(print1);// 类型是数字// if(json_age->type == cJSON_Number)// {// 	// printf("age is %d\n",json_age->valueint);//   sprintf(text,"%ld",json_age->valueint);//   lcd_showstr(5,2,(uint8 *)text,WHITE);//   u8g2_DrawStr(&u8g2,20,20,text);// }// json_name = cJSON_GetObjectItem(json,"name");// //类型是字符串// if(json_name->type == cJSON_String)// {// 	//printf("name is %s\n",json_age->valuestring);//   lcd_showstr(0,1,(uint8 *)json_name->valuestring,WHITE);// }//释放内存cJSON_Delete(json);}
}

2、字符串提取有用信息

char *timestamp_start = strstr(print1,"17");            //字符串处理char timestamp[11];strncpy(timestamp, timestamp_start, 10);timestamp[10] = '\0'; int timestamp_cnt =atoi(timestamp);

3、转成标准时间

struct tm *timeinfo = localtime(&timestamp_cnt);sprintf(text,"%d-%d-%d",timeinfo->tm_year + 1900,timeinfo->tm_mon + 1,timeinfo->tm_mday);lcd_showstr(5,2,(uint8 *)text,WHITE);sprintf(text,"%d:%d:%d",timeinfo->tm_hour+8,timeinfo->tm_min,timeinfo->tm_sec);lcd_showstr(10,3,(uint8 *)text,WHITE);

4.任务处理

u8g2_ClearBuffer(&u8g2);if(key[0].single_flag == 1){key[0].single_flag = 0;esp01s_senddata("GET http://api.pinduoduo.com/api/server/_stm\r\n");// esp01s_senddata("GET https://api.seniverse.com/v3/weather/daily.json?key=S6H95GCCwULqmbSE8&location=weifang&language=en&unit=c&start=-1&days=5\r\n");te = ESP8266_GetIPD_GET(200, Time_buff); //将串口数据取出来esp01s_clear();//清除缓存数据while(esp01s_sendcmd("+++", ""));      /*退出透传模式,发送两次*/}// lcd_showstr(0,0,(uint8 *)rxdata,WHITE);test1_jiexi();u8g2_SendBuffer(&u8g2);// lcd_clear(BLACK);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/172547.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

axios初入门

1,axiox的基本使用 <!doctype html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, user-scalableno, initial-scale1.0, maximum-scale1.0, minimum-scale1.…

清分系统对账

流程1的问题&#xff1a; 1、通道一天的数据会有多少&#xff0c;有二三十万条交易数据吗&#xff1f; 2、如果数据过大都存到一个Map里面去&#xff0c;机器不得挂了 步骤1总结&#xff1a; 1、通过channelNo获取通道T的数据&#xff0c;因为通道是一天一个文件给过来。在转…

首届教师案例教学竞赛一等奖作品上线至和鲸社区,快来学习!

细心的朋友可能已经发现&#xff0c;近期和鲸社区的频道页上线了一个新专区——“优秀参赛作品专区”。 图.和鲸社区频道页 迄今为止&#xff0c;和鲸参与/支持了 500 多场专业数据科学竞赛&#xff0c;包括面向气象、金融、医学、海洋等不同领域的&#xff0c;面向从业者、科学…

.net 8 发布了,试下微软最近强推的MAUI

先看下实现的效果&#xff1a; 下面发下XAML文件&#xff1a; <?xml version"1.0" encoding"utf-8" ?> <ContentPage xmlns"http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x"http://schemas.microsoft.com/winfx/2009/…

使用物联网的家庭自动化

物联网家庭自动化&#xff1a;入门 家庭自动化由三个主要部分组成&#xff1a; 硬件 软件/应用程序 通讯协议 对于为客户构建真正的智能家居体验&#xff0c;这些部分都同样重要。拥有合适的硬件可以迭代开发物联网原型并轻松响应技术枢轴。 经过正确测试和仔细考虑后选择的协…

Linux C语言 25-预处理操作

Linux C语言 25-预处理操作 本节关键字&#xff1a;C语言编译过程、预处理、多行宏定义、通过宏判断操作系统、通过宏判断VC版本 相关C库函数&#xff1a;main&#xff0c;printf 什么是预处理&#xff1f; 预处理是C语言源码编译中重要的一步。用C语言编写的代码不能直接被…

案例027:基于微信小程序的校园二手平台的设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

基于springboot实现智慧党建系统项目【项目源码】

基于springboot实现智慧党建系统演示 Java技术 Java是由Sun公司推出的一门跨平台的面向对象的程序设计语言。因为Java 技术具有卓越的通用性、高效性、健壮的安全性和平台移植性的特点&#xff0c;而且Java是开源的&#xff0c;拥有全世界最大的开发者专业社群&#xff0c;所以…

银行测试--------转账

转账 付款账号测试 付款账号是借记卡&#xff0c;也可以是活期存折信用卡&#xff0c;定期存折不能转出。一般在账号选择的时候进行屏蔽转出账户在销户&#xff0c;冻结&#xff0c;挂失等异常状态&#xff0c;不能进行转账付款账号金额不够 转账金额测试 0.01&#xff5e;…

C++ libcxxabi中dynamic_cast 实现

摘要&#xff1a;最近在看一个崩溃的过程中详细看了一遍cxxabi的定义&#xff0c;就想着看一些llvm中cxxabi的一些实现。本文描述了cxxabi中dynamic_cast的实现以及原理。   关键字&#xff1a;cxxabi,dynamic_cast 1 简介 C中&#xff0c;dynamic_cast用于有虚函数的继承链…

【go入门】表单

4.1 处理表单的输入 先来看一个表单递交的例子&#xff0c;我们有如下的表单内容&#xff0c;命名成文件login.gtpl(放入当前新建项目的目录里面) <html> <head> <title></title> </head> <body> <form action"/login" meth…

【Java】循环语句练习

文章目录 1. 计算5的阶乘2. 计算 1! 2! 3! 4! 5!3. 数字9 出现的次数4. 判定素数5. 求1-100之间的素数6. 求2个整数的最大公约数7. 计算分数的值8. 模拟登陆9. 输出乘法口诀表10. 求出0&#xff5e;999之间的所有“水仙花数”并输出11. 猜数字游戏&#x1f648; 1. 计算5的…

Linux系统编程 day05 进程控制

Linux系统编程 day05 进程控制 1. 进程相关概念2. 创建进程3. exec函数族4. 进程回收 1. 进程相关概念 程序就是编译好的二进制文件&#xff0c;在磁盘上&#xff0c;占用磁盘空间。程序是一个静态的概念。进程即使启动了的程序&#xff0c;进程会占用系统资源&#xff0c;如内…

FO-like Transformation

参考文献&#xff1a; [RS91] Rackoff C, Simon D R. Non-interactive zero-knowledge proof of knowledge and chosen ciphertext attack[C]//Annual international cryptology conference. Berlin, Heidelberg: Springer Berlin Heidelberg, 1991: 433-444.[BR93] Bellare M…

造一个float类型二维矩阵,并将二维矩阵存快速储到一个float*中(memcpy)

// 创建并初始化一个二维数组 std::vector<std::vector<float>> createAndInitializeArray(int rows, int cols) {std::vector<std::vector<float>> array(rows, std::vector<float>(cols));float value 0.0f;for (int i 0; i < rows; i) {…

大数据-之LibrA数据库系统告警处理(ALM-37007 Datanode进程异常)

告警解释 当出现如下情况时&#xff0c;产生该告警&#xff1a; DN实例数据目录中的postgresql.conf配置文件不存在或者其中某个配置参数不对。DN实例线程无法监听IP&#xff0c;或者无法绑定监听端口。DN实例进程没有其数据目录读写权限。 告警属性 告警ID 告警级别 可自…

4-Python与设计模式--抽象工厂模式

4-Python与设计模式–抽象工厂模式 一、快餐点餐系统 想必大家一定见过类似于麦当劳自助点餐台一类的点餐系统吧。在一个大的触摸显示屏上&#xff0c; 有三类可以选择的上餐品&#xff1a; 汉堡等主餐、小食、饮料。当我们选择好自己需要的食物&#xff0c;支付完成后&#…

软件介绍01- koodo Reader支持所有电脑平台!

1 软件简介 Koodo Reader软件是一款阅读器&#xff0c;可以阅读各种格式的文档。用来代替kindle。界面简洁&#xff0c;好看&#xff0c;阅读功能强大&#xff0c;而且可以多设备同步。 因为开源&#xff0c;所以免费。而且支持所有电脑平台&#xff01; 支持格式&#xff1a…

Android修行手册-ViewPager定制页面切换以及实现原理剖析

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

kafka的设计原理

文章目录 1 Kafka简介2 Kafka的架构2.1 Kafka 一些重要概念2.2 工作流程2.3 副本原理2.4 分区和主题的关系2.5 生产者2.5.1 分区可以水平扩展2.5.2 分区策略 2.6 消费者2.6.1 消费方式2.6.2 分区分配策略 2.7 数据可靠性保证2.7.1 副本数据同步策略2.7.2 ACK 应答机制2.7.3 可靠…