Stm32_标准库_期末设计_温度测量光照测量手机与芯片通信实现信息的更新

目录

  • 前言:
  • 1.接线&效果&功能:
  • 2. 实现:
    • 1、手机与芯片单向通信:
      • (1) 确保接收数据的完整性:
      • (2) 判断传输数据的合法性:
      • (3) 对数据合理的分割整合:
      • (4) 实现过程产生的重大BUG及解决方法:
    • 2、温度&光照的测量:
    • 3、OLED显示优化:
    • 4、主函数的设计与布局:
  • 3. 总结:
  • 4.程序源码:

前言:

期末设计预期的效果是整个系统能对环境温度、环境的光照情况进行测量及显示,并且能对时间及日期进行显示。时间与日期的控制不再打算用按键进行修改,取而代之用蓝牙模块实现手机与蓝牙模块之间单向通信,即手机向蓝牙模块发送当前的时间或日期,蓝牙模块接受数据,通过内部代码对数据进行筛选与解析,最后更新芯片自身数据为手机发送的数据。


1.接线&效果&功能:

1、接线:

1、光敏传感器AO端口接GPIO_PA_0

2、热敏传感器AO端口接GPIO_PA_1

3、蓝牙模块端口RXD接GPIO_PA_9

4、蓝牙模块端口TXD接GPIO_PA_10

2、效果:

在这里插入图片描述
3、功能:

1、实时监控当前环境的温度范围为[- 20 ℃,+ 99 ℃]

2、实时监控当前环境的光照强度,光照强度由低到高为[0 , 100]

3、显示时间与日期

4、能接收手机传输的信息并整合更新自己的日期与时间


2. 实现:

1、手机与芯片单向通信:

主要利用了Stm32自带的串口通信功能,这个跟着网上大佬学就可以了

除此之外手机与芯片之间的单向通信还要解决以下几个问题:

1、如何确保接收数据的完整性?

2、如何判断传输数据的合法性?

3、如何对数据合理的分割整合?

解答如下:


—— 2023/10/16

(1) 确保接收数据的完整性:

首先需要注意的就是数据之所以会出现丢失,主要原因在于手机向接受端发送信息时,接收端不能及时接受信息,以至于前一个数据还未来的及接受就被后来的数据覆盖

数据不能被及时接收的原因:

网上常用数据接收代码:

void USART1_IRQHandler(void)
{
if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
{Serial_RxData = USART_ReceiveData(USART1); //一个一个接收Serial_RxFlag = 1;USART_ClearITPendingBit(USART1, USART_IT_RXNE);
}
}

由上述串口接收数据中断函数可以看出,触发中断后数据总是一个字节逐个被Serial_RxData变量接收

接着标记标志位Serial_RxFlag,主函数发现标志位变化,才会接受并储存Serial_RxData上的数据

这个逻辑看似没有问题,但漏洞在于,我们的主函数不可能时刻判断标志位的值是否变化吧?朴素的说主函数不可能就执行判断标志位是否变化这一个语句吧?正是由于主函数在执行其他语句的时候导致没能时刻观察标志位的变化,而导致数据不能被立即接收,最终导致了数据丢失

那么解决方向就显而易见了,即如何做到数据能在中断发生的时候就立即接收呢?
答案就是数组

优化代码:

void USART1_IRQHandler(void)//中断函数
{if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET){news[I] = USART_ReceiveData(USART1);//读数据Serial_RxFlag = 1;//至标志位为有数据I ++;USART_ClearITPendingBit(USART1, USART_IT_RXNE);}
}

在中断产生的时候就立即用数组进行接收,同时标记标志位

主函数发现标志位变化了,等待一会就可以获取数组,取出传输方发送的全部信息了


(2) 判断传输数据的合法性:

传输方发送的信息不可能都是符合标准的,那么如何对数据进行筛选就显得及其重要

首先对我们需要的正确信息进行分析其特点:

例如需要获取的正确信息如下:日期:2023/10/17时间:21:57:55

分析上述两个典型数据,可以发现日期的特点是数据里存在/,数据时间特点是有:,那么第一次筛选条件就是判断接收数据是否存在上述任意一种符号。

这个在数据传输阶段就可以用两个标志位判断:

if(news[i] == '/') flagDate = 1;
if(news[i] == ':') flagTime = 1;

接下来摆在面前的就是假若筛选后的数据里出现超过两个/:符号的时候

再进一步讲上若传入的数据符号为两个,但是传入的时间为25:15:80阁下又应该如何应对?

要解决上述问题还是要对传入数据的特点进行细节分析:

拿日期 2023/10/17 进行分析,其中/符号出现了两次我们完全可以用一个cnt在拆解数据的过程中进行计数,若最后cnt的大小不等于2的时候那么这个数据就会被判断为不合法这样符号问题就解决了


—— 2023/10/17

(3) 对数据合理的分割整合:

那么又如何对年份,月份,天数、进行判别呢?

这就需要将数据进行切割了拿2023/10/17 示范,分析数据,巧妙的是在2023出现的时候cnt = 0,也就是在2023之前没有出现/而到10出现的时候cnt = 1,最后17出现的时候自然cnt = 2恍然大悟用一个updateDate[cnt]分别对数据进行储存即可updateDate[0] = 2023、updateDate[1] = 10、updateDate[2] = 17再对这三个数据分别分析就可以最终判断传入的数据是否合法了!

实现代码:

uint8_t Function_DateState(unsigned int *updateDate, char *News){uint8_t cnt = 0;uint8_t i = 0;uint8_t end = Serial_GetI();char month[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};while(i < end){if(News[i] == '/') {cnt ++;i ++;if(cnt >= 3) {return 0;}continue;}updateDate[cnt] = updateDate[cnt]* 10 + (News[i] - '0');i ++;}if(cnt != 2) return 0;if(Function_Numlength(updateDate[0]) >= 5 || updateDate[0] > 9999 || updateDate[0] == 0) return 0;if((updateDate[0] % 4 == 0 && updateDate[0] % 100 != 0 )|| updateDate[0] % 400 == 0) month[2] = 29;else month[2] = 28;if(Function_Numlength(updateDate[1]) >= 3 || updateDate[1] > 12 || updateDate[1] == 0) return 0;if(Function_Numlength(updateDate[2]) >= 3 || updateDate[2] > month[updateDate[1]]|| updateDate[2] == 0) return 0;Time_GetArrayMonth()[2] = month[2];//这里年份也会发生变化,要修改原有数据return 1;}

(4) 实现过程产生的重大BUG及解决方法:

上述理论成立,接下来就是动手实践了。以下是在对功能以及细节实现过程中产生重大BUG原因的解答以及解决方法的揭秘:

为了让主函数main函数更加简洁,我将数据传输的侦测,处理以及更新都封装在主函数以外的文件中,主函数引用其头文件即可调用我提前封装好的函数,也就是因为封装这些函数,所以产生一些小问题以下列函数为例:

返回数据函数:

char * Serial_returnNews(void){//返还一个数组char * array;uint8_t i = 0;array = (char *) malloc(sizeof(char) * 100);Delay_ms(300);//等待数据传输完while(i < I){//复制if(news[i] == '/') flagDate = 1;if(news[i] == ':') flagTime = 1;array[i] = news[i];i ++;}return array;
}

1、多次传输数据芯片出现卡机现象:

这个函数目的是将接收端存放在数组内的数据,传送至数据处理端,这里使用malloc创建了一个char数组将news数值的数据copy过来并作为返地址,由于此函数是个返还类型的函数,所以没办法及时清理掉这个新创建的array数组,但这不代表不需要清理

若不采取情理,运行程序,手机端在向芯片连续发送几次信息后,显示屏上的就会卡住,任凭怎么输入都没有反应。

究其原因就是因为大量因创建数组产生的地址泄露,导致最后芯片地址耗尽,停止工作

解决方法:

free(News);//释放空间必须释放否者发生地址紊乱,直接卡机

2、返回数据函数被离奇执行两次:

解决上述问题后,数据传输会卡机的现象就没有了,但是再多测试几次的时候,却惊奇的发现传输的数据和接收的数据还是会有误差,查看news数组的时候发现数据并没有丢失?!但传递到数据处理端就有问题?然而我的返还数组函数并没有问题啊,这个bug就很玄学了。

经过不懈排查体调试最终发现传输数据的时候,char * Serial_returnNews(void)被执行了两次?!这是我用cnt变量计数得来的,这个函数又没和别的中断函数重名,为啥调用一次执行两次?再说偏偏还执行两次,真是邪门…

重新更改调试方向,我将目标放在了主函数:

if(Serial_GetRxFlag() == 1)    //时刻监控标志位

这条语句是监控数据是否传输完成的,若传输完成则Serial_GetRxFlag()会返回1值并自动清0,主函数进入if语句内并处理数据

uint8_t Serial_GetRxFlag(void)//读取标志位后自动青除
{if (Serial_RxFlag == 1){Serial_RxFlag = 0;return 1;}return 0;
}

再结合着中断传输数据函数判断:

void USART1_IRQHandler(void)//中断函数
{if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET){news[I] = USART_ReceiveData(USART1);//读数据Serial_RxFlag = 1;//至标志位为有数据I ++;USART_ClearITPendingBit(USART1, USART_IT_RXNE);}
}

看似没有问题,但要知道中断函数在接受数据的时候是一字节一字节的接受,当传输一串数据的时候Serial_RxFlag = 1语句就是一个持续的过程,也就是当传输一串数据的时候主函数if虽然获取了标志位,并将其制0,但后续数据继续传输的时候中断函数内的Serial_RxFlag = 1,仍会继续将标志位制1,这就是为什么if语句还会执行一次

解决方法在if语句结束的时候再次调用制0函数:

Serial_GetRxFlag();//制零否则if循环将会被执行两次

3、数据显示乱码:

这个问题单纯是因为使用中间变量接收数据完毕后没有将其恢复初始化,内部存有上次传输的数值,导致数据叠加乱码

解决方法:

 unsigned int updateTime[] = {0, 0, 0};unsigned int updateDate[] = {0, 0, 0};

2、温度&光照的测量:

主要用到了Stm32的数据转换功器(ADC)
通俗来说,正常的GPIO口只能读取0或1即低电平和高电平,而在低电平与高电平这一区间内的电平却无法描述,Stm32的ADC正可以解决这个问题,朴素的来讲ADC能让GPIO口成为一个电压表
而温度传感器,光敏传感器就是因为温度或光照的变化导致内部电阻阻值发生变化,最后导致其输出电压发生变化,GPIO口通过读取这些电压的具体量,再由人为对这些数据量做一些数据处理就能转换成我们想要的摄氏度、光照强度,以下是数据转换公式:

1.光照模拟量转实际光照强度:

uint16_t Function_RealityADLight(uint16_t ADCnum){//获取光照强度return 100 - ADCnum / 40;
}

2.温度模拟量转实际摄氏度:

这个网上找的公式不能用,问了人家说只知道成线性关系,所以带入两组数据自己测了一个函数关系用起来还不错凑活着用:

int32_t Function_RealityTmperature(uint16_t Vout){//获取实际温度double T = 0;//获取的实际温度T = -0.0423 * Vout + 105 + 0.5;//模拟电压转实际温度公式return (int32_t) T; 
}

这个温度可以测出负温度,为了严谨,用了double变量转换温度


3、OLED显示优化:

OLED:

我对OLED的理解就是它一行有128个点,显示一个字母需要消耗这一行其中8个点,且字符是分两部分打印,上一半和下一半,一行最多打印16个字符,最多能打印四列

OLED程序源中提供了输出字符、清屏、以及输出符号类数字等功能,还是相当丰富的

但是为了让显示屏显示光照、温度的效果达到最佳,还是迫切需要对OLED库中扩充一些功能

1.解决输出无符号数字不足规定长度自动补零的缺陷:

OLED提供的源显示数据函数:

void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)

这个函数需要提前写入你要显示的数字长度,后续数字长度不足会在前面补零
在这里插入图片描述
如上述显示及其影响美观,所以添加一个能实时监控输入数字长度的函数:

uint8_t Function_Length(uint16_t num){uint8_t length = 0;if(num == 0) return (uint8_t) 1;while(num > 0){num = num / 10;length = length + 1;}return length;
}

这不学的算法就用上了,注意0的长度是1

由于温度有正有负,所以需要一个检测有符号数字长度的函数:

uint8_t Function_SignedNum_Length(int32_t num){uint8_t length = 1;//符号位占1位if(num == 0) return (uint8_t) 1;if(num < 0) num = - num;while(num > 0){num = num / 10;length = length + 1;}return length;
}

由于OLED库函数的输出有符号数字事先未考虑计算符号长度,而是提前添加正负号,所以其也得修改

void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length)
{uint8_t i;uint32_t Number1;Length = Length - 1;if (Number >= 0){OLED_ShowChar(Line, Column, '+');Number1 = Number;}else{OLED_ShowChar(Line, Column, '-');Number1 = -Number;}for (i = 0; i < Length; i++)							{OLED_ShowChar(Line, Column + i + 1, Number1 / OLED_Pow(10, Length - i - 1) % 10 + '0');}
}

2.解决数据刷新造成的数据显示不连贯效果:

OLED数据刷新是采用覆盖式的例如上一次数据显示19这一次要写入9的时候不足位会补0也就是显示09,但由于上述操作让其位数不足不会补0,也就是说显示的将不会是09而是显示99即1被这次要写入的9覆盖掉了而后面的数据却没有被覆盖了,这涉及的就不是美不美观的问题了,直接就显示错了数据

所以必须要将后面的数清理掉,OLED库函数提供的只有清屏函数,简单粗暴全部清理掉,再全部写入

这样做有很多不便之处,原因在于整体清除刷新需要大量时间OLED显示起来整体就不连贯影响美观,还有就例如日期数据就没必要一直刷新,只有天数变了才需要刷新,没必要放在while循环内。所以迫切需要一个能清除某片区域的函数,以便能为美化OLED显示以及后续代码的优化提供功能支持

清除特定区域函数:

void OLED_ClearLocation(uint8_t row, uint8_t begin, uint8_t end)
{  uint8_t i, j;for (j = row * 2 - 2; j < row * 2; j++){OLED_SetCursor(j, begin * 8);for(i = begin * 8; i < end * 8; i ++){OLED_WriteData(0x00);}}
}

根据清屏函数重写一个清除某区域的函数,参数分别表示要删除的行,以及从哪里清除,到哪里结束。

3.添加OLED显示汉字功能:

利用取模软件对想要输出汉字进行取模,根据已有输出字符函数原理创建输出汉字函数

在这里插入图片描述
封装汉字数组:

const uint8_t OLED_F10x16[][32] ={0x10,0x60,0x02,0x8C,0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,
0x04,0x04,0x7E,0x01,0x40,0x7E,0x42,0x42,0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00,/*"温",0*/0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00,
0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00,/*"度",1*/0x40,0x40,0x42,0x44,0x58,0xC0,0x40,0x7F,0x40,0xC0,0x50,0x48,0x46,0x40,0x40,0x00,
0x80,0x80,0x40,0x20,0x18,0x07,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x78,0x00,/*光,2*/0x00,0xFE,0x42,0x42,0x42,0xFE,0x00,0x42,0xA2,0x9E,0x82,0xA2,0xC2,0xBE,0x00,0x00,
0x80,0x6F,0x08,0x08,0x28,0xCF,0x00,0x00,0x2F,0xC8,0x08,0x08,0x28,0xCF,0x00,0x00,/*"照",3*/0x00,0x08,0x30,0x00,0xFF,0x20,0x20,0x20,0x20,0xFF,0x20,0x20,0x22,0x2C,0x20,0x00,
0x04,0x04,0x02,0x01,0xFF,0x80,0x40,0x30,0x0E,0x01,0x06,0x18,0x20,0x40,0x80,0x00,/*"状",4*/0x00,0x04,0x84,0x84,0x44,0x24,0x54,0x8F,0x14,0x24,0x44,0x84,0x84,0x04,0x00,0x00,
0x41,0x39,0x00,0x00,0x3C,0x40,0x40,0x42,0x4C,0x40,0x40,0x70,0x04,0x09,0x31,0x00,/*"态",5*/
};

显示汉字函数:

void OLED_ShowCHINESE(uint8_t Line, uint8_t Column, uint8_t Num)
{uint8_t i;uint8_t wide = 16;//字宽OLED_SetCursor(( Line - 1 ) * 2, ( Column - 1 )* wide);		//参数1:把光标设置在第几页. 参数2:把光标设置在第几列for (i = 0; i < wide; i++){OLED_WriteData(OLED_F10x16[Num][i]);			//显示上半部分内容}OLED_SetCursor(( Line - 1 ) * 2 + 1,( Column - 1) * wide);		for (i = 0; i < wide ; i++){ OLED_WriteData(OLED_F10x16[Num][i+wide]);		//显示下半部分内容}}

参考来源:OLED显示汉字及屏幕滚动


4、主函数的设计与布局:

为了使主函数布局清晰,所以对主函数的代码进行了最大可能的优化,采用函数嵌套函数的方式,反正Stm32函数已经够多了我再添加一点也很核理,这样做的优点就是思路清晰,后续添加新功能的时候也很方便明了,缺点就是查bug的时候得来回跳转,不过我是确认没有大bug的情况下才开始优化的

主函数:

#include "ADC.h" 
#include "OLED.h"
#include "Time.h" 
#include <stdio.h>
#include "Delay.h"
#include <stdlib.h>
#include "Serial.h"
#include "Function.h"
#include "stm32f10x.h"   char *News = NULL; //存数据int main(void){AD_Init();                               //开启ADC
OLED_Init();                            //开启显示器
Time_Init();                           //开启计时器
Serial_Init();                        //开启串口允许接收数据
Function_ShowTransmit();	           //显示接收数据的状态
Time_ShowDate(Time_GetArrayDate()); //显示日期while(1){Time_Show(Time_GetArrayTime());            //时刻显示温度ADC_printf(ADC_Channel_0, ADC_Channel_1); //时刻获取温度&光照强度并显示if(Serial_GetRxFlag() == 1){     //时刻监控标志位News = Serial_returnNews();  //获取传输的数据Function_DP(Serial_GetFlagTime(), Serial_GetFlagDate(), Time_GetArrayTime(), Time_GetArrayDate(), News); //对获取的数据进行筛选处理并自我更新Serial_StateRecovery(News); //数据恢复初始化}}
}

与主函数搭配的库函数:

在这里插入图片描述


3. 总结:

明白了学习嵌入的过程就是理解并能灵活使用其提供的库函数的过程

要有自己的创新与解决问题的能力

将功能尽可能封装,能使代码思路更加清晰


4.程序源码:

链接:https://pan.baidu.com/s/1WsZ7dTRUMHRa8jaXDtmrpA?pwd=ws6f

提取码:ws6f


—— 2023/10/18

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

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

相关文章

防火墙规则顺序解决方案

防火墙是保护网络免受攻击的第一道防线&#xff0c;防火墙对互联网和公司IT网络之间的流量拥有绝对控制权&#xff0c;防火墙规则的配置处理调节流量的关键任务。 这些规则会仔细检查传入和传出流量&#xff0c;并根据规则中提到的条件允许或阻止它&#xff0c;防火墙规则越严…

SpringCloud之Gateway整合Sentinel服务降级和限流

1.下载Sentinel.jar可以图形界面配置限流和降级规则 地址:可能需要翻墙 下载jar文件 2.引入maven依赖 <!-- spring cloud gateway整合sentinel的依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-s…

九月 Web3 游戏报告:数量增长,巨头入场,用户获取和留存仍存挑战

作者: stellafootprint.network 9 月份&#xff0c;比特币价格窄幅波动&#xff0c;小幅上涨 3.7%。Web3 游戏行业正在增长&#xff0c;但月活跃用户超过 1,000 人的游戏仍不足 10%。不同公链上的游戏分布相对稳定&#xff0c;其中 BNB 以 30.9% 的份额领先。 随着 Web3 游戏…

【算法 | 位运算No.1】leetcode268. 丢失的数字

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【Leetcode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

Go语言入门心法(九): 引入三方依赖

Go语言入门心法(一): 基础语法 Go语言入门心法(二): 结构体 Go语言入门心法(三): 接口 Go语言入门心法(四): 异常体系 Go语言入门心法(五): 函数 Go语言入门心法(六): HTTP面向客户端|服务端编程 Go语言入门心法(八): mysql驱动安装报错onnection failed Go语言入门心法(…

Springboot 常用注解

自动装配 ComponentScan 用于配置Spring需要扫描的被组件注解注释的类所在的包。 Component 用于标注一个普通的组件类&#xff0c;它没有明确的业务范围&#xff0c;只是通知Spring被此注解的类需要被纳入到Spring Bean容器中并进行管理。 Autowired Autowired用于自动装配…

Java实现业务异步的几种方案

背景&#xff1a; 在java中异步线程很重要&#xff0c;比如在业务流处理时&#xff0c;需要通知硬件设备&#xff0c;发短信通知用户&#xff0c;或者需要上传一些图片资源到其他服务器这种耗时的操作&#xff0c;在主线程里处理会阻塞整理流程&#xff0c;而且我们也不需要等…

百度发布全新 AI 互动式搜索:百度简单搜索

本心、输入输出、结果 文章目录 百度发布全新 AI 互动式搜索&#xff1a;百度简单搜索前言主要能力 相关资料能力介绍 百度搜索升级发文告用户如何获取百度简单搜索百度简单搜索的定位百度简单搜索在 APP 上面的体验讨论和点评我们关注的几个问题 弘扬爱国精神 百度发布全新 AI…

【yolov8目标检测】使用yolov8训练自己的数据集

目录 准备数据集 python安装yolov8 配置yaml 从0开始训练 从预训练模型开始训练 准备数据集 首先得准备好数据集&#xff0c;你的数据集至少包含images和labels&#xff0c;严格来说你的images应该包含训练集train、验证集val和测试集test&#xff0c;不过为了简单说…

安防视频监控平台EasyCVR出现视频流播放卡顿情况,如何优化?

视频集中存储/云存储/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、智能分析等。AI智能/大数据视频分析EasyCVR平台已经广泛应用在工地、工厂、园区、楼…

A062-防火墙安全配置-配置Iptables防火墙策略

实验步骤: 【教学资源类别】 序号 类别 打勾√ 1 学习资源 √ 2 单兵模式赛题资源 3 分组对抗赛题资源 【教学资源名称】 防火墙安全配置-配置安全设置iptables防火墙策略 【教学资源分类】 一级大类 二级大类 打勾√ 1.安全标准 法律法规 行业标准 安全…

离线语音与IoT结合:智能家居发展新增长点

离线语音控制和物联网&#xff08;IoT&#xff09;相结合在家居中具有广泛的应用和许多优势。离线语音控制是指在设备在本地进行语音识别和处理&#xff0c;而不需要依赖云服务器进行处理。IoT是指借助网络&#xff0c;通过手机APP、小程序远程控制家居设备。 启英泰伦基于AI语…

WLAN 无线案例(华为AC控制器配置模板)

实验说明&#xff1a; 无线用户VLAN 30 192.168.30.0/24 AP和AC用VLAN 20 192.168.20.0/24 有线网段 VLAN 10 192.168.10.0/24 步骤一&#xff1a;全网互通 sw1&#xff1a; sysname sw1 # vlan batch 10 20 30 # dhcp enable # ip pool 20 gateway-list 192.168.20.1…

React合成事件

一、合成事件 event 是 SyntheticEvent &#xff0c;模拟出来 DOM 事件所有能力 event.nativeEvent 是原生事件对象 所有的事件&#xff0c;都被挂载到 document 上&#xff08;React ≤ 16&#xff09;&#xff0c;React17之后是挂载到root组件 和 DOM 事件不一样&#xff…

Defects4j数据集安装及使用

0、常见问题 1. 所有配置完成后运行defects4j info -p Lang测试出现错误 Cant locate DBI.pm in INC (you may need to install the DBI module) (INC contains: /myproject/defects4j/framework/lib /myproject/defects4j/framework /myproject/defects4j/framework/core /m…

【计算机网络笔记】计算机网络性能(1)——速率、带宽、延迟

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 系列文章目录速率带宽延迟/时延(delay或latency) 下面介绍一些计算机网络中常用的性能指标。在本篇中涉及速…

创建React Native的第一个hello world工程

创建React Native的第一个hello world工程 需要安装好node、npm环境 如果之前没有安装过react-native-cli脚手架的&#xff0c;可以按照下述步骤直接安装。如果已经安装过的&#xff0c;但是在使用这个脚手架初始化工程的时候遇到下述报错的话 cli.init(root, projectname);…

WordPress导航主题蘑菇导航源码

蘑菇导航的列表页有两种风格&#xff0c;分别对应宽屏、窄屏。可以点击 文章。博客查看演示。文章页也是如此&#xff0c;这两种风格可以在后台设置。 本站菜单中的 VIP解析、音乐、图床&#xff0c;是单独的源码&#xff0c;不包含在本次主题中。后期看大家的要求&#xff0c…

SSH连接华为交换机慢

ssh连接交换机慢是因为交换计算密钥算法阶段默认使用安全性更高的秘钥&#xff0c;由于性能问题导致连接比较慢&#xff0c;如一台华为S5735S-L24T4S-QA2的交换机默认使用如下秘钥&#xff0c;安全行由高到低。 ssh server key-exchange dh_group16_sha512 dh_group15_sha512 …

【Release】Photoshop ICO file format plug-in 3.0

【Introduction】 The Photoshop ICO plug-in is a file format plug-in developed for Photoshop, which allows Photoshop to directly read and write ICO format files. Because Photoshop has powerful pixel bitmap editing functions, it has many users and a good us…