基于STM32的homeassistant(采用FreeRTOS操作系统)【第一、二章优化拓展:Wifi、服务器连接验证以及UASRT串口区分】

 

第一、二章优化拓展开发环境:

主控STM32F103C8T6
WIFI模块ESP01S
开发语言C
开发编译器·

KEIL

组网方式WIFI
服务器协议MQTT

硬件连接

STM32ESP01S
3.3V3.3V

GND

GND

GPIO2  (USRAT2-TX)

RX
GPIO3 (USART3-RX)TX

本章要点:

  • 对ESP01S的AT指令的反馈指令进行验证解析
  • 对ESP的USART2通信串口进行printf端口重映射
  • 对调试用的USART1通信串口编写USART_printf函数并且解析%d、%s等可变参数

抽象理解

1、对ESP01S的AT指令的反馈指令进行验证解析

        进入循环函数:在STM32对ESP01S进行USART通信发送完AT指令后,进行串口监听,然后接收AT反馈指令,接着调用strstr()函数对指令进行解析,当解析到AT指令任务实现的反馈指令后,才执行下一步,跳出循环函数

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

2、对ESP的USART2通信串口进行printf端口重映射

#if 1
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ int handle; }; FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
void _sys_exit(int x) 
{ x = x; 
} 
//重定义fputc函数 
int fputc(int ch, FILE *f)
{      
//	while((USART2->SR&0X40)==0);//循环发送,直到发送完毕   
//    USART2->DR = (u8) ch;while((USART2->SR&0X40)==0);//循环发送,直到发送完毕   (若需要使用usart串口通信进行信息验证调试则取消注释,正常使用请关闭,避免printf打印两次)USART2->DR = (u8) ch;  	return ch;
}
#endif 

3、对调试用的USART1通信串口编写USART_printf函数并且解析%d、%s等可变参数

#include <stdarg.h> //C库重写
#include <mystdlib.h> void USART1_printf (char * Data, ... )
{const char *s;int d;   char buf[16];va_list ap;va_start(ap, Data);while ( * Data != 0 )     // 判断是否到达字符串结束符{				                          if ( * Data == 0x5c )  //'\'{									  switch ( *++Data ){case 'r':							          //回车符USART_SendData(USART1, 0x0d);Data ++;break;case 'n':							          //换行符USART_SendData(USART1, 0x0a);	Data ++;break;default:Data ++;break;}			 }else if ( * Data == '%'){									  //switch ( *++Data ){				case 's':										  //字符串s = va_arg(ap, const char *);for ( ; *s; s++) {USART_SendData(USART1,*s);while( USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET );}Data++;break;case 'd':			//十进制d = va_arg(ap, int);myitoa(d, buf, 10);for (s = buf; *s; s++) {USART_SendData(USART1,*s);while( USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET );}Data++;break;default:Data++;break;}		 }else USART_SendData(USART1, *Data++);while ( USART_GetFlagStatus ( USART1, USART_FLAG_TXE ) == RESET );}
}

代码:

由于在stm32内,无法使用stdlib.h的C语言库,因此我们重写编写了stdlib.h库的部分函数

mystdlib.h

#ifndef __MYSTDLIB_H
#define __MYSTDLIB_H/*
将整数转化为字符串:
num,转换对象
str,转换后存储字符串的数组
radix,转换(给于的字符串)的长度
*/
char *myitoa(int num,char *str,int radix) 
{  /* 索引表 */ char index[]="0123456789abcdefghijklmnopqrstuvwxz"; unsigned unum; /* 中间变量 */ int i=0,j,k; /* 确定unum的值 */ if(radix==10&&num<0) /* 十进制负数 */ { unum=(unsigned)-num; str[i++]='-'; } else unum=(unsigned)num; /* 其它情况 */ /* 逆序 */ do  { str[i++]=index[unum%(unsigned)radix]; unum/=radix; }while(unum); str[i]='\0'; /* 转换 */ if(str[0]=='-') k=1; /* 十进制负数 */ else k=0; /* 将原来的“/2”改为“/2.0”,保证当num在16~255之间,radix等于16时,也能得到正确结果 */ char temp; for(j=k;j<=(i-k-1)/2.0;j++) { temp=str[j]; str[j]=str[i-j-1]; str[i-j-1]=temp; } return str; 
} /*
将字符串转换成整数
str,转换的字符串数组目标
返回值:为转换后的整数;
*/
int myatoi(char * str)
{int n=0;//保存整形  char firstChar = *str;//记录str的第一个字符if (firstChar == '+' || firstChar == '-')//+123 -123{++str;}while(*str == '0')//00123  -00123{++str;}while (*str){char temp = *str;if (*str < '0' || *str> '9'){puts("literal does not match format string ") ;return n;//该字符串含有非数字字符,不能转为整数}else{temp -= '0';n = n * 10 + temp;//将字符串转为整形}str++;}if (firstChar == '-'){n = -n;}return n;
}#endif

如果要本第一、二章优化拓展的完整工程文件,可以直接到百度网盘提取(解压密码同下)

链接:https://pan.baidu.com/s/1ECxx125pRlKVo366fzyTiw?pwd=1016 
提取码:1016

 本文为作者独立编写 

 本BLOG上所有的原创文章未经本人许可,不得用于商业用途及传统媒体。网络媒体转载请注明出处,否则属于侵权行为。

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

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

相关文章

【Go】实现一个代理Kerberos环境部分组件控制台的Web服务

实现一个代理Kerberos环境部分组件控制台的Web服务 背景安全措施引入的问题SSO单点登录 过程整体设计路由反向代理登录会话组件代理YarnHbase 结果 背景 首先要说明下我们目前有部分集群的环境使用的是HDP-3.1.5.0的大数据集群&#xff0c;除了集成了一些自定义的服务以外&…

vite 引入局部组件 必须带.vue

11:03:47 AM [vite] Internal server error: Failed to resolve import “./components/layoutsHeader” from “src/views/layouts/layouts.vue”. Does the file exist? 在这里插入图片描述

ADC 的初识

ADC介绍 Q: ADC是什么&#xff1f; A: 全称&#xff1a;Analog-to-Digital Converter&#xff0c;指模拟/数字转换器 ADC的性能指标 量程&#xff1a;能测量的电压范围分辨率&#xff1a;ADC能辨别的最小模拟量&#xff0c;通常以输出二进制数的位数表示&#xff0c;比如&am…

ENSP实验一:防火墙基础配置

1、搭建拓扑图 配置client&#xff08;内网&#xff09;、FTP Server&#xff08;外网&#xff09;的IP地址 客户端设置&#xff1a; 服务端设置&#xff1a; 2、配置防火墙命名 进入防火墙&#xff0c;输入密码&#xff1a;默认为admin123 <USG6000V1>system-view /…

计算机网络 day8 动态路由 - NAT - SNAT实验 - VMware的网卡的3种模式

目录 动态路由&#xff1a;IGP 和 EGP 参考网课&#xff1a;4.6.1 路由选择协议概述_哔哩哔哩_bilibili ​编辑 IGP&#xff08;Interior Gateway Protocol&#xff09;内部网关协议&#xff1a; EGP&#xff08;Interior Gateway Protocol&#xff09;外部网关协议&#x…

python标准库模块,json

展示了如何使用json模块进行编码和解码操作的常规示例&#xff1a; Python标准库模块——json&#xff08;编码解码json格式&#xff09; json模块简介 json模块是Python中的一个编码和解码JSON格式的轻量级模块&#xff0c;主要用于将Python对象编码为JSON格式输出或存储&a…

【论文阅读】聚集多个启发式信号作为监督用于无监督作文自动评分

摘要 本文提出一个新的无监督的AES方法ULRA&#xff0c;它不需要真实的作文分数标签进行训练&#xff1b;ULRA的核心思想是使用多个启发式的质量信号作为伪标准答案&#xff0c;然后通过学习这些质量信号的聚合来训练神经自动评分模型。为了将这些不一致的质量信号聚合为一个统…

CPU/内存相关术语

一、IO多路复用 IO多路复用是一种高效的I/O模型&#xff0c;可以监视多个文件描述符&#xff0c;当任何一个文件描述符就绪&#xff08;可读或可写&#xff09;时&#xff0c;就会通知程序进行读写操作。这种方式可以避免使用多线程或多进程的方式进行I/O操作&#xff0c;从而…

vue代码格式化,Prettier - Code formatter格式化规则文件

vue2&#xff0c;vue3格式化代码使用方法&#xff1a; 1、新建文件名&#xff1a; .prettierrc.cjs&#xff0c;里面放上下面的代码片段&#xff0c;直接粘贴即可 2、把 .prettierrc.cjs文件放在项目的根目录中 // prettier的默认配置文件 module.exports {// 一行最多 100 …

【Whisper】《OpenAI Whisper 精读【论文精读】》学习笔记

方法 Whisper在论文中表示使用单模型&#xff08;single model&#xff09;来完成多个语音任务&#xff08;multitask&#xff09;&#xff0c;李沐教授认为优点是设计上比较干净&#xff1b; I. 关于单模型效果的疑问 但是他同时也提出了两个疑问&#xff1a; 使用单模型会…

hudi系列-KeyGenerator 分区提取器

record key与hoodie key hudi支持数据更新,在upsert语义下,需要用记录级别的主键来表示每行数据的唯一性。主键是由record key和分区路径共同构成的 record key:记录键,分区下唯一,当为非分区表时等同于主键,虽然在源码中声明了a recordKey that acts as primary key fo…

矩阵AB和BA的特征值相同

手写的&#xff0c;如下图&#xff1a; 即可证明&#xff0c;矩阵AB的特征值和BA的特征值相同。 关于矩阵转置和逆矩阵混合运算&#xff0c;有如下规律&#xff1a;

unity01 界面布局

布局 坐标系 遵循左手定则&#xff0c;中指是y轴、食指是x轴、大拇指是z轴。 可以理解为x轴代表东西方向&#xff0c;z轴代表南北方向&#xff0c;y轴代表上下方向。 常用快捷键 鼠标中键&#xff1a;移动地图 右键&#xff1a;移动视角 shift鼠标左键单击gimo导航器的小方…

c++编写天天酷跑游戏

天天酷跑2.0版本&#xff1a;2.0 游戏背景设置 Start importing material (background picture) #include <graphics.h>Create a graph window and define macros for the window #define WIN_WINDTH 1012#define WIN_HEIGHT 396initgraph(WIN_WINDTH, WIN_HEIGHT);Imp…

Python 算法基础篇之 Python 语言回顾:变量、条件语句、循环语句、函数等

Python 算法基础篇之 Python 语言回顾&#xff1a;变量、条件语句、循环语句、函数等 引言 1. 变量2. 条件语句3. 循环语句 a ) for 循环 b ) while 循环 4. 函数总结 引言 Python 是一种流行的编程语言&#xff0c;具有简洁而易读的语法。在学习算法时&#xff0c;了解 Python…

B070-项目实战-用户模块--手机注册

目录 用户模块需求分析静态网站部署与调试两种前端项目的部署两种前端项目的调试(热部署)创建静态web项目 注册分析与设计分析需求设计 界面设计&#xff08;ui&#xff09;设计表&#xff08;后台&#xff09; 流程设计&#xff08;后台&#xff09;三范式表设计流程设计 相关…

Unity开发规范

代码 控制频繁调用GC 控制高频率的内存分配。控制大块的内存申请&#xff0c;可能会造成内存的碎片化&#xff0c;如果需要申请&#xff0c;尽可能在刚启动时申请。控制容易导致 GC alloc的函数调用[Mono]控制字符串拼接/ToString/ToArray[Mono]Boxing(拆装箱操作)/委托/匿名…

小白入门C#编写MVC登录小案例

一、C#编写MVC登录小案例 &#x1f680;1. 新建MVC项目。 &#x1f680;2. 在Models文件夹下创建一个User类&#xff0c;包含登录所需要的用户名和密码属性。 namespace MvcLogin.Models {public class User{public string UserName{get; set;}public string Password{get;se…

遥感目标检测(1)--R3Det

目录 一、概述 二、三个挑战 三、网络架构​ 1、旋转RetinaNet 2、精细化旋转RetinaNet 3、与RoIAlign&#xff08;感兴趣区域插值&#xff09;进行比较 4、消融实验与对比实验 一、概述 R3Det论文中提到一个端到端的精细化的单级旋转检测器&#xff0c;通过从粗到细的逐…

Maven —— 项目管理工具

前言 在这篇文章中&#xff0c;荔枝会介绍如何在项目工程中借助Maven的力量来开发&#xff0c;主要涉及Maven的下载安装、环境变量的配置、IDEA中的Maven的路径配置和信息修改以及通过Maven来快速构建项目。希望能对需要配置的小伙伴们有帮助哈哈哈哈~~~ 文章目录 前言 一、初…