32f4,usart2fifo,2025
usart2fifo.h
#ifndef __USART2FIFO_H
#define __USART2FIFO_H#include "stdio.h"
#include "stm32f4xx_conf.h"
#include "sys.h"
#include "fifo_usart2.h"//extern u8 RXD2_TimeOut;//超时检测//extern u8 Timer6_1ms_flag;extern __IO bool Usart2_rxFrameFlag ;
extern __IO uint8_t Usart2_rxCmd[USART2_FIFO_SIZE] ;
extern __IO uint8_t Usart2_rxCount ;
//********************************************************************************
#define USART2_REC_LEN 256 //定义最大接收字节数 200
#define DIY_END_CODE_Before 0x0D //每次发送的帧尾\n
#define DIY_END_CODE 0x0A //每次发送的帧尾\nextern u8 USART2_RX_BUF[USART2_FIFO_SIZE]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符
extern u16 USART2_RX_STA; //接收状态标记 extern u16 USART2_Rec_Byte_Length;//接收长度,最大是200,在接收数组空间范围内?
extern u8 USART2_Rec_Frame_Flag;//接收完整一帧标记=0,没接收完,=1接收完void uart2_init(u32 baudRate);//设置串口1的波特率,以及初始化
void Clear_Uart2_RecBuf(void);//清空接收缓冲区
u8 Judge_Usart2_Response(char* fmt,...);//判断串口1接受到的字符串,比对
//if(Judge_Usart1_Response("OK"))只要存在OK连续两个就行,分大小写
//uyyOKoo
//https://www.cnblogs.com/zhanxiaohong0303/p/zz_2020_10_1.html
//将按照指定格式接收的数据赋值
u8 Get_Usart2_Data(int *x,float *y);
u8 Get_Usart2_Data2(float *x,float *y);u8 Get_Usart2_S1(float *x);//旋转舵机
u8 Get_Usart2_S2(float *x);//爪子舵机
u8 Get_Usart2_S7(float *x);//步进电机#endif
usart2fifo.c
#include "sys.h"
#include "usart2FIFO.h"
#include "led.h"
#include "stdlib.h"
#include "stdarg.h"
#include "stdio.h"#include "fifo_usart2.h"__IO bool Usart2_rxFrameFlag = false;
__IO uint8_t Usart2_rxCmd[USART2_FIFO_SIZE] = {0};
__IO uint8_t Usart2_rxCount = 0;//u8 RXD2_TimeOut=0;//超时检测
//u8 Timer6_1ms_flag=0;
//注意,读取USARTx->SR能避免莫名其妙的错误
u8 USART2_RX_BUF[USART2_FIFO_SIZE]; //接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15, 接收完成标志
//bit14, 接收到0x0d
//bit13~0, 接收到的有效字节数目
u16 USART2_RX_STA=0; //接收状态标记
u16 USART2_Rec_Byte_Length=0;//接收长度,最大是200,在接收数组空间范围内?
u8 USART2_Rec_Frame_Flag=0;//接收完整一帧标记//初始化IO 串口1
//bound:波特率
void uart2_init(u32 baudRate)
{//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE); //使能GPIOD时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART1时钟//串口1对应引脚复用映射GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_USART2); //GPIO5复用为USART2
GPIO_PinAFConfig(GPIOD,GPIO_PinSource6,GPIO_AF_USART2); //GPIO6复用为USART2//USART1端口配置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6; //GPIOA9与GPIOA10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉GPIO_Init(GPIOD,&GPIO_InitStructure); //初始化PA9,PA10//USART1 初始化设置USART_InitStructure.USART_BaudRate = baudRate;//波特率设置USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式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(USART2, &USART_InitStructure); //初始化串口2USART_ClearFlag(USART2, USART_FLAG_TC);USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启相关中断,接收一个字节,就发生中断USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);//开启空闲中断USART_ITConfig(USART2, USART_IT_ORE_RX, ENABLE);//开启空闲中断USART_Cmd(USART2, ENABLE); //使能串口2}void USART2_IRQHandler(void) //串口2中断服务程序
{__IO uint16_t i = 0;//接收中断(接收到的数据必须是0x0a结尾)if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) {// 未完成一帧数据接收,数据进入缓冲队列usart2_fifo_enQueue((uint8_t)USART2->DR);// 清除串口接收中断USART_ClearITPendingBit(USART2, USART_IT_RXNE);}/**********************************************************
*** 串口空闲中断
**********************************************************/else if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET){// 先读SR再读DR,清除IDLE中断USART2->SR; USART2->DR;// 提取一帧数据命令Usart2_rxCount = usart2_fifo_queueLength(); //获取数据长度for(i=0; i < Usart2_rxCount; i++) { Usart2_rxCmd[i] = usart2_fifo_deQueue();//拆解数据//printf("response data=%x\r\n",Usart2_rxCmd[i]);}// 一帧数据接收完成,置位帧标志位Usart2_rxFrameFlag = true;}//溢出中断else if(USART_GetITStatus(USART2,USART_IT_ORE)){USART_ClearFlag(USART2, USART_FLAG_ORE);USART_ReceiveData(USART2);}
} void Clear_Uart2_RecBuf(void)//清空接收缓冲区
{u16 i;for(i=0;i<USART2_FIFO_SIZE;i++){Usart2_rxCmd[i]=0;}USART2_Rec_Byte_Length=0;Usart2_rxFrameFlag=0;
}//#include "stdlib.h"
//#include "stdarg.h"
//#include "stdio.h"
//#include "string.h" //str函数
//带不定长度参数的函数if(Judge_Usart1_Response("OK9999"))
u8 Judge_Usart2_Response(char* fmt,...)
{char p[USART2_FIFO_SIZE];va_list ap;//如果串口1没接收到一帧数据,那么返回0,结束本函数if(!Usart2_rxFrameFlag) return 0;//如果接收到一帧数据,到下面将需要判断的数据数据复制到p数组中va_start(ap,fmt);vsprintf((char*)p,fmt,ap);va_end(ap); //结束ap指针,必须结束//用strstr函数,将接收到的字符串和我们的数据进行对比,如果没有相等的那么返回0并结束函数,否则返回1说明判断有效if(strstr((char*)Usart2_rxCmd,p)==NULL) return 0;else return 1;
}//获取指定格式字符串的部分数据
u8 Get_Usart2_Data(int *x,float *y)
{int xtemp;float ytemp;if(!Usart2_rxFrameFlag) return 0;//x=125,y=25.65\r\nsscanf((const char *)Usart2_rxCmd,"x1=%d,y=%f",&xtemp,&ytemp);*x=(int)xtemp;*y=(float)ytemp;return 1;
}//获取指定格式字符串的部分数据
u8 Get_Usart2_Data2(float *x,float *y)
{float xtemp;float ytemp;if(!Usart2_rxFrameFlag) return 0;//x=125,y=25.65\r\nif(Usart2_rxCmd[0]=='x' && Usart2_rxCmd[1]=='2'){sscanf((const char *)Usart2_rxCmd,"x2=%f,y=%f",&xtemp,&ytemp);*x=(float)xtemp;*y=(float)ytemp;return 1;}else return 0;}
//https://www.cnblogs.com/zhanxiaohong0303/p/zz_2020_10_1.html//获取指定格式字符串的部分数据
u8 Get_Usart2_S1(float *x)
{float xtemp;
// if(!USART2_Rec_Frame_Flag) return 0;if(Usart2_rxCmd[0]=='t'&&Usart2_rxCmd[1]=='2'){sscanf((const char *)Usart2_rxCmd,"t2=%f",&xtemp);*x=(float)xtemp; return 1;}else return 0;
}
u8 Get_Usart2_S2(float *x)
{float xtemp;// if(!USART2_Rec_Frame_Flag) return 0;if(Usart2_rxCmd[0]=='t'&&Usart2_rxCmd[1]=='3'){sscanf((const char *)Usart2_rxCmd,"t3=%f",&xtemp);*x=(float)xtemp;return 1;}else return 0;}u8 Get_Usart2_S7(float *x)
{float xtemp;if(Usart2_rxCmd[0]=='t'&&Usart2_rxCmd[1]=='7'){sscanf((const char *)Usart2_rxCmd,"t7=%f",&xtemp);*x=(float)xtemp;return 1;}else return 0;
// if(!USART2_Rec_Frame_Flag) return 0;}
//*******************************
//int main(void)
//{
//
// u8 t;
// u8 len;
// u16 times=0;
// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
// delay_init(168); //延时初始化
// uart_init(115200); //串口初始化波特率为115200
// LED_Init(); //初始化与LED连接的硬件接口
// while(1)
// {
// if(USART_RX_STA&0x8000)
// {
// len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
// printf("\r\n您发送的消息为:\r\n");
// for(t=0;t<len;t++)
// {
// USART_SendData(USART1, USART_RX_BUF[t]); //向串口1发送数据
// while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
// }
// printf("\r\n\r\n");//插入换行
// USART_RX_STA=0;
// }else
// {
// times++;
// if(times%5000==0)
// {
// printf("\r\nALIENTEK 探索者STM32F407开发板 串口实验\r\n");
// printf("正点原子@ALIENTEK\r\n\r\n\r\n");
// }
// if(times%200==0)printf("请输入数据,以回车键结束\r\n");
// if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.
// delay_ms(10);
// }
// }
//}//void Clear_Openmv_Rxbuff(void)
//{
// u8 *p,i;
// p=openmv_rx_data;
// for(i=0;i<Rx_Length;i++)
// {
// *p++=0;
// }
// length=0;
// rx_flag=0;
//}//u8 Judge_Openmv_Response(char* fmt,...)
//{
// char p[30];
// if(!rx_flag) return 0;
// va_list ap;
// va_start(ap,fmt);
// vsprintf((char*)p,fmt,ap);
// va_end(ap);
// if(strstr((char*)openmv_rx_data,p)==NULL) return 0;
// else return 1;
//}// if(Judge_Openmv_Response("OK"))
// {
// Clear_Openmv_Rxbuff();
// LCD_ShowString(0,16,"OK");
// }
fifo_usart2.h
#ifndef __FIFO_USART2_H
#define __FIFO_USART2_H#include "sys.h"
#include "stdbool.h"/********************************************************************************************************************/#define USART2_FIFO_SIZE 128typedef struct {uint16_t buffer[USART2_FIFO_SIZE];__IO uint8_t ptrWrite;__IO uint8_t ptrRead;
}USART2_FIFO_t;extern __IO USART2_FIFO_t rx2FIFO;void usart2_fifo_initQueue(void);
void usart2_fifo_enQueue(uint16_t data);
uint16_t usart2_fifo_deQueue(void);
bool usart2_fifo_isEmpty(void);//bool需要添加stdbool.h头文件
uint16_t usart2_fifo_queueLength(void);#endif
fifo_usart2.c
#include "fifo_usart2.h"/**********************************************************
**********************************************************/__IO USART2_FIFO_t rx2FIFO = {0};/*** @brief 初始化队列* @param 无* @retval 无*/
void usart2_fifo_initQueue(void)
{rx2FIFO.ptrRead = 0;rx2FIFO.ptrWrite = 0;
}/*** @brief 入队* @param 无* @retval 无*/
void usart2_fifo_enQueue(uint16_t data)
{rx2FIFO.buffer[rx2FIFO.ptrWrite] = data;++rx2FIFO.ptrWrite;if(rx2FIFO.ptrWrite >= USART2_FIFO_SIZE){rx2FIFO.ptrWrite = 0;}
}/*** @brief 出队* @param 无* @retval 无*/
uint16_t usart2_fifo_deQueue(void)
{uint16_t element = 0;element = rx2FIFO.buffer[rx2FIFO.ptrRead];++rx2FIFO.ptrRead;if(rx2FIFO.ptrRead >= USART2_FIFO_SIZE){rx2FIFO.ptrRead = 0;}return element;
}/*** @brief 判断空队列* @param 无* @retval 无*/
bool usart2_fifo_isEmpty(void)
{if(rx2FIFO.ptrRead == rx2FIFO.ptrWrite){return true;}return false;
}/*** @brief 计算队列长度* @param 无* @retval 无*/
uint16_t usart2_fifo_queueLength(void)
{if(rx2FIFO.ptrRead <= rx2FIFO.ptrWrite){return (rx2FIFO.ptrWrite - rx2FIFO.ptrRead);}else{return (USART2_FIFO_SIZE - rx2FIFO.ptrRead + rx2FIFO.ptrWrite);}
}
测试main.c
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "beep.h"
#include "usart2fifo.h"
#include "fifo_usart2.h"int main(void)
{u16 i=0;float rotate_angle,grab_angle,stepper_mm;
// int x;
// float y;Nvic_Init(NVIC_PriorityGroup_4);//中断分组第四组 高优先打断低优先Set_Nvic_Irq(USART1_IRQn,0,3);//设置串口1的中断等级;Delay_Init();//延时函数默认中断优先级是最低的。LED_Init();//LED灯初始化BEEP_Init();//蜂鸣器初始化uart1_init(115200);//设置串口1的波特率是115200uart2_init(115200);Usart_SendByte(USART1,'a');//测试单字节发送函数Usart_SendByte(USART1,'b');//测试单字节发送函数Usart_SendString(USART1,"tab\r\n");//测试字符串发送函数printf("hello world\r\n");//这个也能用,测试printf函数printf("LED=1,%d\r\n",i);//这个也能用,测试printf函数Printf(USART1,"LED=0,%d\r\n",i);//这个也能用,测试大写的Printf函数while(1){//********************************************* 串口屏HMI命令解析//*********************************************//*********************************************//*********************************************//*********************************************if(Usart2_rxFrameFlag==true){{//将接收的数据通过串口1输出,验证数据// Usart_SendString(USART1,Usart2_rxCmd);// // for(i=0;i<Usart2_rxCount;i++)// {// Usart_SendByte(USART1,Usart2_rxCmd[i]);// } Usart_SendByte(USART1,Usart2_rxCmd[Usart2_rxCount-1]);// Usart_SendByte(USART1,Usart2_rxCmd[Usart2_rxCount-2]);// Usart_SendByte(USART1,Usart2_rxCmd[Usart2_rxCount-1]);}if(Usart2_rxCmd[Usart2_rxCount-1]==0x0a) //如果接收到的最后的数据是约定好的帧尾,最后面的0x0a{printf("0d ok\r\n");if(Usart2_rxCmd[Usart2_rxCount-2]==0x0d) //前一个0x0d{printf("0d 0a ok\r\n");USART2_Rec_Frame_Flag=1;//接收标记等于1,在哪里清0?在判断里面清0if(Judge_Usart2_Response("stop")){printf("stop\r\n");
// machine_stop_flag=1;
// machine_start_flag=0;Clear_Uart2_RecBuf();}else if(Get_Usart2_S1(&rotate_angle)) //旋转舵机旋转一个角度{// Servo1_move(rotate_angle,1200,270);printf("rotate_angle=%f\r\n",rotate_angle);Clear_Uart2_RecBuf();} else if(Get_Usart2_S2(&grab_angle)) //抓手舵机旋转一个角度{// servohandflag =1;Clear_Uart2_RecBuf();} else if(Get_Usart2_S7(&stepper_mm)) //步进电机运动到绝对坐标,以回0的位置为原点{// hmi_stepper_mm_flag=1;//move(stepper_mm);printf("stepper_mm=%f\r\n",stepper_mm);Clear_Uart2_RecBuf();} else Clear_Uart2_RecBuf();} }Usart2_rxCount=0;//长度清零,给下次使用Usart2_rxFrameFlag=false;Clear_Uart2_RecBuf();}}
}

相关文章:
32f4,usart2fifo,2025
usart2fifo.h #ifndef __USART2FIFO_H #define __USART2FIFO_H#include "stdio.h" #include "stm32f4xx_conf.h" #include "sys.h" #include "fifo_usart2.h"//extern u8 RXD2_TimeOut;//超时检测//extern u8 Timer6_1ms_flag;exte…...
激光模拟单粒子效应试验如何验证CANFD芯片的辐照阈值?
在现代航天电子系统中,CANFD(Controller Area Network with Flexible Data-rate)芯片作为关键的通信接口元件,其可靠性与抗辐射性能直接关系到整个系统的稳定运行。由于宇宙空间中存在的高能粒子辐射,芯片可能遭受单粒…...
从零构建大语言模型全栈开发指南:第五部分:行业应用与前沿探索-5.2.1模型偏见与安全对齐(Red Teaming实践)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 大语言模型全栈开发指南:伦理与未来趋势 - 第五部分:行业应用与前沿探索5.2.1 模型偏见与安全对齐(Red Teaming实践)一、模型偏见的来源与影响1. 偏见的定义与分类2. 偏见的实际影响案例二、安全对齐…...
Docker安装开源项目x-ui详细图文教程
本章教程,主要介绍如何使用Docker部署开源项目x-ui 详细教程。 一、拉取镜像 docker pull enwaiax/x-ui:latest二、运行容器 mkdir x-ui && cd x-ui docker run -itd --network=host \-v $PWD<...
检索增强生成(RAG) 优化策略
检索增强生成(RAG) 优化策略篇 一、RAG基础功能篇 1.1 RAG 工作流程 二、RAG 各模块有哪些优化策略?三、RAG 架构优化有哪些优化策略? 3.1 如何利用 知识图谱(KG)进行上下文增强? 3.1.1 典型RAG架构中,向…...
Educational Codeforces Round 172 (Rated for Div. 2)
AB略 C 答案没有单调性,无法用二分答案写。b比a多的得分s1*0s2*1.......sn*(n-1),s代表这一段中b比a多的数量。这里s的处理可以想到用前缀和来,于是得到(s1-0)*0(s2-s1)*1(s3-s2)*2......(sn-sn-1)*(n-1)-s1-s2-s3.....sn*(n-1),…...
前端:v-html和v-text在使用上的区别
v-html 和 v-text 在 Vue 中的核心区别如下: 一、解析机制 v-text 将数据作为纯文本渲染,不解析 HTML 标签。 例如数据 <strong>Hello</strong> 会直接输出为字符串 <strong>Hello</strong>。v-html 将数据解析为…...
【面试篇】Kafka
一、基础概念类 问题:请简述 Kafka 是什么,以及它的主要应用场景有哪些? 答案:Kafka 是一个分布式流处理平台,它以高吞吐量、可持久化、可水平扩展等特性而闻名。其主要应用场景包括: 日志收集:…...
零基础玩转树莓派5!从系统安装到使用VNC远程控制树莓派桌面实战
文章目录 前言1.什么是Appsmith2.Docker部署3.Appsmith简单使用4.安装cpolar内网穿透5. 配置公网地址6. 配置固定公网地址总结 前言 你是否曾因公司内部工具的开发周期长、成本高昂而头疼不已?或是突然灵感爆棚想给团队来点新玩意儿,却苦于没有专业的编…...
SAP CEO引领云端与AI转型
在现任首席执行官克里斯蒂安克莱因(Christian Klein)的领导下,德国软件巨头 SAP 正在经历一场深刻的数字化转型,重点是向云计算和人工智能方向发展。他提出的战略核心是“RISE with SAP”计划,旨在帮助客户从传统本地部…...
【MyBatis】深入解析 MyBatis:关于注解和 XML 的 MyBatis 开发方案下字段名不一致的的查询映射解决方案
注解查询映射 我们再来调用下面的 selectAll() 这个接口,执行的 SQL 是 select* from user_info,表示全列查询: 运行测试类对应方法,在日志中可以看到,字段名一致,Mybatis 就成功从数据库对应的字段中拿到…...
图像退化对目标检测的影响 !!
文章目录 引言 1、理解图像退化 2、目标检测中的挑战 3、应对退化的自适应方法 4、新兴技术与研究方向 5、未来展望 6、代码 7、结论 引言 在计算机视觉领域,目标检测是一项关键任务,它使计算机能够识别和定位数字图像中的物体。这项技术支撑着从自动驾…...
《AI大模型应知应会100篇》第57篇:LlamaIndex使用指南:构建高效知识库
第57篇:LlamaIndex使用指南:构建高效知识库 摘要 在大语言模型(LLM)驱动的智能应用中,如何高效地管理和利用海量知识数据是开发者面临的核心挑战之一。LlamaIndex(原 GPT Index) 是一个专为构建…...
目标检测中COCO评估指标中每个指标的具体含义说明:AP、AR
《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...
鸿蒙应用元服务开发-Account Kit概述
Account Kit(华为账号服务)提供简单、快速、安全的登录功能,让用户快捷地使用华为账号登录元服务。用户授权后,Account Kit可提供头像、手机号码等信息,帮助元服务更了解用户。Account Kit提供的SampleCode示例工程体现…...
如何利用ATECLOUD测试平台的芯片测试解决方案实现4644芯片的测试?
作为多通道 DC-DC 电源管理芯片的代表产品,4644 凭借 95% 以上的转换效率、1% 的输出精度及多重保护机制,广泛应用于航天航空(卫星电源系统)、医疗设备(MRI 梯度功放)、工业控制(伺服驱动单元&a…...
SpringBoot集成OAuth2.0
文章目录 OAuth 2.0 介绍概念与传统认证方式的对比常见应用场景 OAuth 2.0 原理核心角色授权流程 Spring Boot 集成 OAuth 2.01. 添加依赖2. 配置 OAuth 2.0 客户端3. 配置 Spring Security4. 创建控制器5. 主应用类 代码解释 OAuth 2.0 介绍 概念 OAuth 2.0 是一个开放标准的…...
《继电器:机械骑士的电磁战甲》
点击下面图片带您领略全新的嵌入式学习路线 🔥爆款热榜 88万阅读 1.6万收藏 第一章:千年契约的青铜誓言 在电气王国的熔炉深处,电磁铁与簧片的盟约已镌刻千年。电磁铁身披螺旋铜线编织的斗篷,其胸膛中沉睡着一道可召唤磁力的古…...
c++中cin.ignore()的作用
在 C 中,cin.ignore() 是用于忽略(丢弃)输入流中的字符的函数,通常用来清除输入缓冲区中的残留内容(如换行符、多余输入等),以避免影响后续的输入操作。 基本用法 cin.ignore(n, delim);n&…...
python如何获取html中附件链接,并下载保存附件
在Python中,要获取HTML中的附件链接并下载保存附件,你通常需要执行以下步骤: 解析HTML内容:使用像BeautifulSoup这样的库来解析HTML并找到包含附件链接的标签(例如<a>标签,它们通常有一个href属性指向…...
【计算机相关学习】R语言
在Python统治数据科学的时代,我意外推开了R语言的大门。这个诞生于统计学家之手的编程语言,像一把精巧的手术刀,改变了我对数据处理的认知边界。 语法里的统计基因令人惊艳。当我第一次用<-符号完成变量赋值时,这个源…...
JavaScript DOM 节点操作
目录 一、DOM 节点 节点类型(Node Types) 二、查找节点 1.查找父节点 1. parentNode 2. parentElement 2.查找子节点 1. childNodes 2. children 3. firstChild / lastChild 4. firstElementChild / lastElementChild 3.查找兄弟节点 1. pre…...
快速求平方根
1. 前置知识 建议首先阅读我的另外一篇文章《雷神之锤 III 竞技场》快速求平方根倒数的计算探究》。建议大家自己看过《雷神之锤 III 竞技场》快速求平方根倒数的计算探究》学会快速求平方根倒数算法后,不看我这篇文章,自己推导一篇快速求平方根的算法&…...
科普:One-Class SVM和SVDD
SVM(支持向量机)算法是用于解决二分类问题的,它在样本空间(高维空间)中找一个最优超平面,使得两类数据点中离超平面最近的点(称为支持向量)到超平面的距离最大。 对于极少数“坏样本…...
Vue 3 中按照某个字段将数组分成多个数组
方法一:使用 reduce 方法 const originalArray [{ id: 1, category: A, name: Item 1 },{ id: 2, category: B, name: Item 2 },{ id: 3, category: A, name: Item 3 },{ id: 4, category: C, name: Item 4 },{ id: 5, category: B, name: Item 5 }, ];const grou…...
冒泡排序笔记
核心思想 通过相邻元素的比较和交换,使较大的元素逐渐“浮”到数组的末尾(像气泡从水底冒到水面一样) 基础冒泡排序 public class BubbleSort{public static void bubbleSort(int[] arr){for(int i 0; i < arr.length - 1; i){//冒泡…...
【ABAP】REST/HTTP技术(一)
1、概念 1.1、SAP 如何提供 Http Service 如果要将 SAP 应用程序服务器 (application server)作为 http 服务提供者,需要定义一个类,这个类必须实现 IF_HTTP_EXTENSION 接口。IF_HTTP_EXTENSION 接口只有一个方法 HANDLE_REQUEST。…...
Flutter PopupMenuButton 深度解析:从入门到架构级实战
在移动应用交互设计中,上下文菜单如同隐形的魔法师,在有限屏幕空间中优雅地扩展操作维度。作为Flutter框架中的核心交互组件,PopupMenuButton绝非简单的菜单触发器,其背后蕴含着Material Design的交互哲学、声明式UI的架构智慧以及…...
C语言基础要素(019):输出ASCII码表
计算机以二进制处理信息,但二进制对人类并不友好。比如说我们规定用二进制值 01000001 表示字母’A’,显然通过键盘输入或屏幕阅读此数据而理解它为字母A,是比较困难的。为了有效的使用信息,先驱者们创建了一种称为ASCII码的交换代…...
VSCode开发者工具快捷键
自动生成浏览器文件.html的快捷方式 在文本里输入: ! enter VSCode常用快捷键列表 代码格式化:Shift Alt F向上或向下移动一行:Alt Up 或者 Alt Down快速复制一行代码:Shift Alt Up 或者 Shift Alt Down快速保…...
