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

news2024/10/6 2:23:54

 

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

主控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.coloradmin.cn/o/768191.html

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

相关文章

集合面试题--HashMap

目录 HashMap实现原理 HashMap的jdk1.7和jdk1.8有什么区别 总结 HashMap的put方法的具体流程 常见属性 添加数据的流程图 ​编辑 具体实现源码 总结 HashMap的扩容机制 总结 hashMap的寻址算法 总结 hashmap在1.7情况下的多线程死循环问题 HashMap实现原理 HashMap的…

MyBatis的多表操作

1 MyBatis的多表操作 1.1 多表模型介绍 我们之前学习的都是基于单表操作的&#xff0c;而实际开发中&#xff0c;随着业务难度的加深&#xff0c;肯定需要多表操作的。 多表模型分类 一对一&#xff1a;在任意一方建立外键&#xff0c;关联对方的主键。 一对多&#xff1a;在…

IDEA 工具- Java - Tomcat 9.x - 无法使用外部 tomcat 服务器的断点测试功能

问题&#xff1a;使用外部 Tomcat 运行项目&#xff0c;却无法使用断点功能测试 Java 项目 解决方法&#xff1a; 在 IDEA 工具的tomcat Edit configurations&#xff0c;进行修改 具体配置位置&#xff1a; Environment Variables 配置选项添加内容&#xff1a; NameValueJ…

Unity游戏源码分享-线条圆圈游戏Line and Circle Game Template

Unity游戏源码分享-线条圆圈游戏Line and Circle Game Template 圆圈穿过线条就通关 工程地址&#xff1a; https://download.csdn.net/download/Highning0007/88061484

java学习路程之篇十、知识点、数组介绍、二维数组介绍、静态初始化、访问元素、遍历元素、动态初始化、内存图、数组常见问题

文章目录 01、数组介绍02、数组静态初始化03、数组元素访问04、数组遍历操作05、数组动态初始化06、数组内存图07、数组常见问题08、二维数组介绍09、二维数组静态初始化10、二维数组遍历11、二维数组动态初始化12、二维数组内存图 01、数组介绍 02、数组静态初始化 03、数组元…

封装 视频以及监控组件

1.引入插件。 文件Git 地址&#xff1a; https://gitee.com/wang-xiaowang123/liveplayer.html 文件中 <script src"/assets/js/liveplayer-lib.min.js" exclude></script> // liveplayer-lib.min.js 文件在Git仓库中2.封装组件 LivePlayerDemo.vue …

php做网页版剪刀石头布的功能

实例讲述了php实现的网页版剪刀石头布攻略在玩游网上的设计。分享给大家供大家参考&#xff0c;具体如下&#xff1a; <?php /* * Created on 2016-11-25 * */ if (isset($_POST[sub])) { $what $_POST[what]; //需要输入的数组 $my_array array("剪刀","…

算法通关村第一关-链表青铜挑战笔记

文章目录 前言一、Java的链表是怎么构造的&#xff1f;单链表的构造简介&#xff1a; 构造链表&#xff1a; 链表增加元素&#xff0c;首部&#xff0c;中间和尾部分别会有什么问题&#xff0c;需要怎么处理&#xff1f;链表的新增在头部添加元素&#xff1a;在中间添加元素&am…

IP库新增多种颜色转换空间IP

颜色空间转换是图像及视频中常用的解决方案&#xff0c;涉及hsv-rgb、rgb-ycrcb等一些常见的颜色空间互相转换&#xff0c;今天带来几种常见的颜色空间转换IP&#xff0c;主要如下&#xff1a; IP库简介 一直想做一个可以供大家学习、使用的开源IP库&#xff0c;类似OpenCores&…

美化图表——LiveCharts中的时序图的制作,相对问题的解决

美化图表——LiveCharts中的时序图的制作&#xff0c;相应问题的解决 前言一、效果展示二、基本的一些实现的代码1.X,Y坐标的相关设置2.新增波形对象3.实时更新数据 三、修改的点总结 前言 在项目中&#xff0c;需要用到图表来展示波形的实时变化&#xff0c;故找到了这个Live…

优维低代码实践:统计视图

优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。 优维…

35.Vue自定义指令-总结

目录 1.自定义指令容易踩的坑 1.1 指令名如果是多个单词&#xff0c;要使用kebab-case命名方式&#xff0c;不要用camelCase命名 1.2 指令回调函数中的this问题 1.3 局部指令与全局指令 2.自定义指令总结 2.1 定义语法&#xff1a; (1).局部指令 (2).全局指令 2.2 配置…

3.14 Bootstrap 缩略图

文章目录 Bootstrap 缩略图添加自定义的内容 Bootstrap 缩略图 本章将讲解 Bootstrap 缩略图。大多数站点都需要在网格中布局图像、视频、文本等。Bootstrap 通过缩略图为此提供了一种简便的方式。使用 Bootstrap 创建缩略图的步骤如下&#xff1a; 在图像周围添加带有 class …

ChatGPT | 修改RetrievalQA推荐答案的数量

知识库经常遇到一个问题会在一个文件的多处或者多个文件出现&#xff0c;这时候如果只回答一个结果就欠佳&#xff0c;最理想的做法是模仿推荐功能&#xff0c;把合适的多个答案及其出处汇总给用户。 如图&#xff0c;一个接口文档里面提到多处“http请求URL”&#xff1a; 使…

vue项目如何部署?有遇到布署服务器后刷新404问题吗?

一、如何部署 前后端分离开发模式下,前后端是独立布署的,前端只需要将最后的构建物上传至目标服务器的web容器指定的静态目录下即可 我们知道vue项目在构建后,是生成一系列的静态文件

Minecraft 1.20.x Forge模组开发 01.Idea开发环境配置

我们本次来进行Minecraft 1.20.x 模组开发环境配置教程的介绍。 效果演示 效果演示 效果演示 1.首先我们需要下载Java17和1.20模组开发包: Java17下载官网

csdn新星计划vue3+ts+antd赛道——利用inscode搭建vue3(ts)+antd前端模板

文章目录 ⭐前言⭐利用inscode免费开放资源&#x1f496; 在inscode搭建vue3tsant项目&#x1f496; 调整配置&#x1f496; antd 国际化配置&#x1f496; 用户store&#x1f496; 路由权限&#x1f496; 预览 ⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享…

【字节流】读数据(一次读一个字节数组数据)

字节流读数据&#xff08;一次读一个字节数组数据&#xff09; 1.需求&#xff1a; 把文件fos.txt中的内容读取出来在控制台输出 2.思路&#xff1a; 创建字节输入流对象调用字节输入流对象的读数据方法释放资源 package com.bytestream; import java.io.FileInputStream; …

TCP/IP网络编程 第十五章:套接字和标准I/O

标准I/O函数的优点 标准I/O函数的两个优点 将标准I/O函数用于数据通信并非难事。但仅掌握函数使用方法并没有太大意义&#xff0c;至少应该 了解这些函数具有的优点。下面列出的是标准I/O函数的两大优点: □标准I/O函数具有良好的移植性(Portability) □标准I/O函数可以利用缓…

stable diffusion windows本地搭建的坑

刚刚2小时前&#xff0c;我搭好了&#xff0c;欣喜若狂&#xff0c;开放端口&#xff0c;同事也尝试了。我的配置 16G内存&#xff0c;AMD卡&#xff0c;有gpu但是没有用。这里不说具体步骤&#xff0c;只说坑点。 首先就是安装gfpgan、clip、openclip问题&#xff0c;我参考…