STM32 USART串口发送
单片机学习!
目录
前言
一、串口发送配置步骤
二、详细步骤
2.1 RCC开启USART和GPIO时钟
2.2 GPIO初始化
2.3 配置USART
2.4 开启USART
2.5 初始化总代码
三、发送数据函数设计
3.1 发送一个字节数据函数
3.2 发送一个数组函数
3.3 发送字符串函数
3.4 以字符串形式显示数字函数
总结
前言
本文介绍了USART初始化配置、USART串口发送的基础内容。
一、串口发送配置步骤
初始化流程,可以从基本结构图来梳理:
第一步,开启时钟,把需要用的USART和GPIO的时钟打开。
第二步,GPIO初始化,把TX配置成复用输出,RX配置成输入。
第三步,配置USART,直接使用一个结构体就可以把所有需要的参数都配置好。
第四步,如果只需要发送的功能,就直接开启USART,初始化就结束了。如果需要接收的功能,可能还需要配置中断,那就在开启USART之前,再加上ITCongfig和NVIC的代码就行了。
得益于库函数的封装,内部各种细节问题就不需要再关心了。
初始化完成之后
- 如果要发送数据,调用一个发送的函数就行了;
- 如果要接收数据,就调用接收的函数;
- 如果要获取发送和接收的状态,就调用获取标志位的函数。
以上就是USART外设的使用思路。
二、详细步骤
2.1 RCC开启USART和GPIO时钟
第一步开启时钟USART和GPIO的时钟。
代码示例:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//开启USART1的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启GPIOA时钟
开启USART1的时钟,这里USART1是APB2的外设,其他都是APB1的外设。然后还需要开启GPIO的时钟,看引脚定义表,USART1的TX是PA9,RX是PA10.
2.2 GPIO初始化
第二步初始化GPIO引脚。这里初始化GPIOA,引脚选择Pin_9
代码示例:
GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode= GPIO_Mode_AF_PP;//引脚模式选复用推挽输出GPIO_InitStruct.GPIO_Pin= GPIO_Pin_9;//引脚选择Pin_9GPIO_InitStruct.GPIO_Speed= GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);//初始化GPIOA
引脚模式的配置选择:
- TX引脚是USART外设控制的输出引脚,所以要选复用推挽输出。
- RX引脚是USART外设数据的输入引脚,所以要选择输入模式。
输入模式并不分什么普通输入,复用输入。一根线只能有一个输出,但可以有多个输入。所以输入脚、外设和GPIO都可以同时用。一般RX配置是浮空输入或者上拉输入,因为串口波形空闲状态是高电平,所以不使用下拉输入。这里引脚模式的配置可以参考手册GPIO那一节推荐的配置表。本章程序只实现数据发送,所以只初始化TX就可以了。引脚模式选择GPIO_Mode_AF_PP复用推挽输出。
以上配置就是把PA9配置为复用推挽输出,供USART1的TX使用。
2.3 配置USART
第三步初始化USART
代码示例:
USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate = 9600;//波特率USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件流控制USART_InitStructure.USART_Mode = USART_Mode_Tx;//串口模式USART_InitStructure.USART_Parity = USART_Parity_No;//校验位USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位USART_InitStructure.USART_WordLength =USART_WordLength_8b; //字长USART_Init(USART1,&USART_InitStructure);
USART_BaudRate 波特率,可以直接写一个波特率的数值。这里给9600,写完数值之后USART_Init函数内部会自动算好9600对应的分频系数,然后写到BRR寄存器。
USART_HardwareFlowControl 硬件流控制,这个参数的取值可以是:
- USART_HardwareFlowControl_None不使用流控;
- USART_HardwareFlowControl_CTS只用CTS;
- USART_HardwareFlowControl_RTS只用RTS;
- USART_HardwareFlowControl_RTS_CTS是CTS和RTS都使用。
这里不使用流控,所以选择USART_HardwareFlowControl_None这个参数。
USART_Mode串口模式,参数有:
- USART_Mode_Tx是Tx发送模式;
- USART_Mode_Rx是Rx接收模式。
- 如果既需要接收又需要发送,那就用或符号把Tx和Rx或起来。
代码示例:
USART_InitStructure.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;
这里程序只需要发送功能,所以就选择USART_Mode_Tx这一个参数就行了。
USART_Parity 校验位,参数有:
- USART_Parity_No无校验;
- USART_Parity_Odd奇校验;
- USART_Parity_Even偶校验。
这里不需要校验,所以选择USART_Parity_No无校验。
USART_StopBits停止位,参数可以选择:
- USART_StopBits_0_5 是0.5位停止位;
- USART_StopBits_1 是1位停止位;
- USART_StopBits_1_5 是1.5位停止位;
- USART_StopBits_2 是2位停止位。
这里选择USART_StopBits_1参数,就是1位停止位。
USART_WordLength 字长,参数可以选择:
- USART_WordLength_8b八位字长;
- USART_WordLength_9b九位字长。
因为不需要校验,前面设置了无校验参数,这里就选择USART_WordLength_8b字长为8位。
以上结构体参数的初始化就完成了,对串口的配置是9600波特率、无流控、只有发送模式、无校验位、1位停止位、八位字长。
2.4 开启USART
第四步,开启USART,调用USART_Cmd函数,给指定的通道USART1使能。
代码示例:
USART_Cmd(USART1,ENABLE);
2.5 初始化总代码
代码示例:
void Serial_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//开启USART1的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启GPIO的时钟GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode= GPIO_Mode_AF_PP;//引脚模式GPIO_InitStruct.GPIO_Pin= GPIO_Pin_9;//引脚选择Pin_9GPIO_InitStruct.GPIO_Speed= GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);//初始化GPIOAUSART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate = 9600;//波特率USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件流控制USART_InitStructure.USART_Mode = USART_Mode_Tx;//串口模式USART_InitStructure.USART_Parity = USART_Parity_No;//校验位USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位USART_InitStructure.USART_WordLength =USART_WordLength_8b; //字长USART_Init(USART1,&USART_InitStructure);USART_Cmd(USART1,ENABLE);}
三、发送数据函数设计
3.1 发送一个字节数据函数
这里设计一个发送数据的函数,调用这个函数就可以从TX引脚发送一个字节数据。
代码示例:
void Serial_SendByte(uint8_t Byte)
{//函数里面需要调用串口的SendData函数USART_SendData(USART1,Byte);//第一个参数给USART1,第二个参数给Bytewhile(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET); //第一个参数给USART1,第二个参数需要使用USART_FLAG_TXE发送数据寄存器空标志位。因为需要等待TXE置1,所以给USART_GetFlagStatus函数套一个while循环。}
Serial_SendByte函数里面需要调用USART_SendData函数,USART_SendData函数可以通过外设 USART1 发送单个数据。
USART_SendData(USART1,Byte);第一个参数给USART1,第二个参数给Byte,
这样可以在调用Serial_SendByte函数时把参数Byte的值通过外设 USART1 发送出去。
从USART_SendData函数定义内部代码可以更清楚的知道数据是怎么发送出去的。
USART_SendData函数源代码:
/*** @brief Transmits single data through the USARTx peripheral.* @param USARTx: Select the USART or the UART peripheral. * This parameter can be one of the following values:* USART1, USART2, USART3, UART4 or UART5.* @param Data: the data to transmit.* @retval None*/
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
{/* Check the parameters */assert_param(IS_USART_ALL_PERIPH(USARTx));assert_param(IS_USART_DATA(Data)); /* Transmit Data */USARTx->DR = (Data & (uint16_t)0x01FF);
}
这里定义的参数Byte传递给Data这个变量,之后Data&0x01FF,就是把无关的高位清零,然后直接赋值给DR寄存器。因为这是写入DR,所以数据最终通向TDR,发送数据寄存器,TDR再传递给发送移位寄存器。最后一位一位地把数据移出到TX引脚,完成数据的发送。
USARTx->DR = (Data & (uint16_t)0x01FF);
调用USART_SendData这一个库函数,Byte变量就写入到TDR了,写完之后还需要等待一下,等TDR的数据转移到移位寄存器了才算一次数据完整的转移完成。如果数据还在TDR进行等待,再写入数据就会产生数据覆盖。所以在发送之后,还需要等待一下标志位。这里用while循环里套一个USART_GetFlagStatus函数通过判断标志位来循环空出等待时间。
代码示例:
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
USART_GetFlagStatus函数的第一个参数给USART1,第二个参数需要使用USART_FLAG_TXE发送数据寄存器空标志位。
因为需要等待TXE置1,所以还是给USART_GetFlagStatus函数套一个while循环,如果TXE标志位==RESTE,就一直循环,直到为SET时,结束等待。
最后是标志位是否需要手动清除的问题,需要参考一下手册,在状态寄存器这里有对TXE这一位的描述。
当TDR寄存器中的数据被硬件转移到移位寄存器的时候,该位被硬件置位。如果USART_CR1寄存器中的TXEIE为1,就是允许中断,则产生中断。对USART_DR的写操作,将该位清零。
所以说这里标志位置1之后,不需要手动清零。当下一次再调用USART_SendData函数时,这个标志位会自动清零。以上Serial_SendByte函数就编写完成了。
3.2 发送一个数组函数
比如有一个很大的数组,需要通过串口发送到电脑。那就需要一个发送数组的函数。
代码示例:
void Serial_SendArray(uint8_t *Array,uint16_t Length)
{uint16_t i;for(i = 0 ; i < Length ; i++){Serial_SendByte(Array[i]);}
}
Serial_SendArray函数
void Serial_SendArray(uint8_t *Array,uint16_t Length)
- 第一个参数是一个uint8_t的指针类型,指向待发数组的首地址,传递数组需要使用指针。
- 第二个参数uint16_t Length由于数组无法判断是否结束,所以需要再传递一个Length进来,Length的类型可以根据需求来定义,可以是16位的,也可以是32位的。
for(i = 0 ; i < Length ; i++)
这里for循环就会执行Length次,可以对Array数据进行遍历。
在for循环里就不断调用Serial_SendByte函数,发送Array[i],这样就是依次取出数组Array的每一项,通过Serial_SendByte函数进行发送。
Serial_SendByte(Array[i]);
3.3 发送字符串函数
设计一个发送字符串的函数。
代码示例:
void Serial_SendString(char *String)uint8_t i;for(i = 0;String[i] != '\0';i++){Serial_SendByte(String[i]);}
}
Serial_SendString函数
void Serial_SendString(char *String)
这里参数类型给uint8_t *也可以,都是一样的效果。由于字符串自带一个结束标志位,所以就不需要再传递长度参数了。
for(i = 0;String[i] != '\0';i++)
这里循环条件的结束位就可以用字符串的结束标志位来判断了,这里数据0对应空字符,是字符串结束标志位。
- 如果循环到的数据不等于0,就是还没结束,进行循环;
- 如果循环到的数据等于0,就是结束了,停止循环。
这里数据0也可以写成字符的形式,就是'\0'空字符的转义字符表示形式,和直接写0最终效果是一样的。
Serial_SendByte(String[i]);
在for循环里不断调用Serial_SendByte函数,将String字符串一个个取出来,通过Serial_SendByte函数发送。
3.4 以字符串形式显示数字函数
给函数发送一个数字,最终这个数字能在电脑以字符串的形式显示。
代码示例:
uint32_t Serial_Pow(uint32_t X,uint32_t Y)//这个函数的返回值就是X的Y次方
{uint32_t Result = 1;while(Y--){Result *= X;}return Result;
}void Serial_SendNumber(uint32_t Number,uint8_t Length)
{uint8_t i;for(i = 0;i < Length;i++){Serial_SendByte(Number / Serial_Pow(10,Length - i - 1) %10 + '0');}
}
void Serial_SendNumber(uint32_t Number,uint8_t Length)
在函数Serial_SendNumber里面需要把Number的个位、十位、百位等位数以十进制拆分开。然后转换成字符数字对应的数据,依次发送出去。
以十进制拆分方法,用数字12345来举例:
- 取万位就是12345除以10000的值1再对10取余 (12345/10000)%10=1;
- 取千位就是12345除以1000的值12再对10取余 (12345/1000)%10=2;
- 取百位就是12345除以100的值123再对10取余 (12345/100)%10=3;
- 取十位就是12345除以10的值1234再对10取余 (12345/10)%10=4;
- 取个位就是12345除以1的值再对10取余 (12345/1)%10=5.
总结:
取某一位就是数字除以10的x次方再对10取余(数字/10^x)%10,除以10的x次方就是把这一位数的右边去掉,再对10取余就是把这一位数的左边去掉。
需要先写一个次方函数Serial_Pow函数,此函数用于十进制拆分逻辑,可供Serial_SendNumber函数里调用。
uint32_t Serial_Pow(uint32_t X,uint32_t Y)//这个函数的返回值就是X的Y次方
{uint32_t Result = 1;while(Y--)//循环Y次,就是Result累乘Y次X,也就是X的Y次方{Result *= X;}return Result;
}
Serial_SendNumber函数也是依次发送数字的每一位这个逻辑。
代码示例:
void Serial_SendNumber(uint32_t Number,uint8_t Length)
{uint8_t i;for(i = 0;i < Length;i++){Serial_SendByte(Number / Serial_Pow(10,Length - i - 1) %10 + '0');}
}
这里Serial_Pow函数的给值需要注意:
Serial_SendByte(Number / Serial_Pow(10,Length - i - 1) %10 + '0');
按照十进制拆分方法的公式取出Number的每一位。for循环中从i开始遍历是从0开始的,10的0次方是个位,第一数据应该是最高位而不是个位,所以要让遍历方向反过来Serial_Pow函数的第二个参数要是Length - i - 1,这样循环起来参数就会以十进制从高位到低位依次发送。不过最终要以字符的形式显示,查询ASCII表发现字符0对应的数据是0x30,所以最后还需要加0x30或者以字符的形式写就是'0'
总结
以上就是今天要讲的内容,本文仅仅简单介绍了USART初始化配置以及一些配置代码的细节。
相关文章:
STM32 USART串口发送
单片机学习! 目录 前言 一、串口发送配置步骤 二、详细步骤 2.1 RCC开启USART和GPIO时钟 2.2 GPIO初始化 2.3 配置USART 2.4 开启USART 2.5 初始化总代码 三、发送数据函数设计 3.1 发送一个字节数据函数 3.2 发送一个数组函数 3.3 发送字符串函数 3.4…...
二叉树的深度搜索专题一>计算布尔二叉树的值
题目: 题目解析: 算法解析: 代码: public boolean evaluateTree(TreeNode root) {if(root.left null && root.right null) return root.val 1 ? true : false;boolean leftTree evaluateTree(root.left);boolean…...
Web day01 html css
目录 1.html: 常用标签: 1.video img p br b u i s : 2.布局标签:div span 3.表单标签: 4.表单标签项: 5.表格标签: 2.css: 1.使用样式: 2.选择器: 3.样式: 1.color: 2. …...
PHP 超级全局变量
超级全局变量是指在php任意脚本下都可以使用 PHP 超级全局变量列表: $GLOBALS:是PHP的一个超级全局变量组,在一个PHP脚本的全部作用域中都可以访问。 $_SERVER:$_SERVER 是一个PHP内置的超级全局变量,它是一个包含了诸如头信息(header)、路…...
题目:素数列
思路: 注意审题,题目中的等差素数列指公差相同且每一个元素都是素数的数列,并不是说是所有素数中一段连续且插值相同的数列,它可以是离散的。 因此,只需要暴力的遍历每一个素数,并找以其开头的所有可能等差…...
机器学习系列-决策树
文章目录 1. 决策树原理决策树的构建流程 2. 案例步骤 1:计算当前节点的熵步骤 2:对每个特征计算分裂后的熵(1) 按“天气”分裂数据集(2) 计算分裂后的加权熵 步骤 3:计算分裂依据信息增益信息增益率GINI系数(二叉树) …...
H3C OSPF 多区域实验
目录 前言 实验拓扑 实验需求 实验解析 路由器配置 测试 前言 此篇文章为 OSPF多区域试验,建议先食用OSPF单区域实验,理解实验原理 学习基本配置,再来使用此篇,效果更佳!(当然如果你已经了解原理与基…...
【Python】 深入理解Python的单元测试:用unittest和pytest进行测试驱动开发
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 单元测试是现代软件开发中的重要组成部分,通过验证代码的功能性、准确性和稳定性,提升代码质量和开发效率。本文章深入介绍Python中两种主流单元测试框架:unittest和pytest,并结合测试驱动开发(TDD)…...
微信小程序中使用iconfont的详细教程
我们知道微信小程序对包体积有很严格的要求,最大不超过2M,而图片资源对包体检有至关重要的影响,所以使用自定义的图标字体来代替大量图标图片也是提高小程序性能的重要手段,总的来说在微信小程序中使用 IconFont(图标字…...
【小白学机器学习33】 大数定律python的 pandas.Dataframe 和 pandas.Series基础内容
目录 0 总结 0.1pd.Dataframe有一个比较麻烦琐碎的地方,就是引号 和括号 0.2 pd.Dataframe关于括号的原则 0.3 分清楚几个数据类型和对应的方法的范围 0.4 几个数据结构的构造关系 list → np.array(list) → pd.Series(np.array)/pd.Dataframe 1 python 里…...
hue 4.11容器化部署,已结合Hive与Hadoop
配合《Hue 部署过程中的报错处理》食用更佳 官方配置说明页面: https://docs.gethue.com/administrator/configuration/connectors/ 官方配置hue.ini页面 https://github.com/cloudera/hue/blob/master/desktop/conf.dist/hue.ini docker部署 注意: …...
“软件定义汽车”时代 | 产线海量数据刷写解决方案
一 背景 从起初汽车概念问世时期的“机械定义汽车”,到电力出现后的“电器定义汽车”,再到电子科技迅猛发展后的“电子定义汽车”,再到如今的“软件定义汽车”,可以看出,软件在车辆中扮演着越来越重要的角色。与此同时…...
DDoS对策是什么?详细解读DDoS攻击难以防御的原因与解决方案
近年来,DDoS(分布式拒绝服务)攻击的规模和频率不断增加。根据数据显示,2023年已观测到的最大攻击流量达到700Gbps,远远超出了许多企业的防御能力。DDoS攻击导致的网站性能问题如页面加载缓慢、频繁的504错误等现象&…...
【AI系统】Tensor Core 架构演进
自 Volta 架构时代起,英伟达的 GPU 架构已经明显地转向深度学习领域的优化和创新。2017 年,Volta 架构横空出世,其中引入的张量核心(Tensor Core)设计可谓划时代之作,这一设计专门针对深度学习计算进行了优…...
React前端框架基础知识详解
React 是由 Facebook 推出的一个用于构建用户界面的 JavaScript 库,现已成为前端开发中最流行的框架之一。React 的核心理念是通过组件化的方式构建用户界面,提升代码的可维护性和复用性。本文将为大家详细介绍 React 框架的基础知识,并带你快…...
Python学习——猜拳小游戏
import random player int(input(“请输入:剪刀 0,石头 1,布2”)) computer random.randint(0,2)# print(“玩家输入的是%d,电脑输入的是%d” %(player,computer)) 用于测试 if (player 0) and (computer 0) or (player 1) a…...
Spring:AOP通知类型
我们先来回顾下AOP通知: AOP通知描述了抽取的共性功能,根据共性功能抽取的位置不同,最终运行代码时要将其加入到合理的位置 通知具体要添加到切入点的哪里? 共提供了5种通知类型: 前置通知后置通知环绕通知(重点)返回后通知(了解)抛出异常后通知(了…...
【公益接口】不定时新增接口,仅供学习
文章日期:2024.11.24 使用工具:Python 文章类型:公益接口 文章全程已做去敏处理!!! 【需要做的可联系我】 AES解密处理(直接解密即可)(crypto-js.js 标准算法ÿ…...
php 导出excel 一个单元格 多张图片
public function dumpData(){error_reporting(0); // 禁止错误信息输出ini_set(display_errors, 0); // 不显示错误$limit $this->request->post(limit, 20, intval);$offset $this->request->post(offset, 0, intval);$page floor($offset / $limit) 1 ;$wh…...
Docker3:docker基础1
欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…...
18. 【.NET 8 实战--孢子记账--从单体到微服务】--记账模块--账本
这一篇我们来一起为账本功能编写代码。账本功能的代码很简单,就是一些简单的CURD操作。 一、需求 我们先来看一下需求: 编号需求说明1新增账本1. 账本名称不能和用户已有的账本名称重复2删除账本1. 存在收支记录的账本不能删除3修改账本1. 修改的账本…...
GPT1.0 和 GPT2.0 的联系与区别
随着自然语言处理技术的飞速发展,OpenAI 提出的 GPT 系列模型成为了生成式预训练模型的代表。作为 GPT 系列的两代代表,GPT-1 和 GPT-2 虽然在架构上有着继承关系,但在设计理念和性能上有显著的改进。本文将从模型架构、参数规模、训练数据和…...
在 Taro 中实现系统主题适配:亮/暗模式
目录 背景实现方案方案一:CSS 变量 prefers-color-scheme 媒体查询什么是 prefers-color-scheme?代码示例 方案二:通过 JavaScript 监听系统主题切换 背景 用Taro开发的微信小程序,需求是页面的UI主题想要跟随手机系统的主题适配…...
uni-app 界面TabBar中间大图标设置的两种方法
一、前言 最近写基于uni-app 写app项目的时候,底部导航栏 中间有一个固定的大图标,并且没有激活状态。这里记录下实现方案。效果如下(党组织这个图标): 方法一:midButton的使用 官方文档:ta…...
leetcode 无重复字符的最长子串
3. 无重复字符的最长子串 已解答 中等 相关标签 相关企业 提示 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串的长度。 提示: 0 < s.length < 5 * 104s 由英文字母、数字、符号和空格组成 class Solution:def lengthOfLongest…...
【C++习题】14.滑动窗口_找到字符串中所有字母异位词
文章目录 题目链接:题目描述:解法C 算法代码:图解 题目链接: 438. 找到字符串中所有字母异位词 题目描述: 解法 暴力解法: 字母排序后运用滑动窗口解题。 滑动窗口哈希表: 我们可以优化一下&am…...
matplotlib知识
问题与解决 1.module backend_interagg has no attribute FigureCanvas问题 Matplotlib 后端不兼容: matplotlib 使用的后端(如 backend_interagg)可能与当前环境不匹配或未正确加载。 在代码中显式设置一个兼容的后端,例如 TkAgg、Qt5Ag…...
如何在ubuntu上调试core dump
启用core dump 确认ulimit 状态 ulimit -c 如果输出是0,表示core dump被禁用了 运行 ulimit -c unlimited 再次运行 ulimit -c 确认输出是ulimited 设置core dump路径和文件名格式 下面命令表示设置core dump文件在当前目录(%e表示程序名&#x…...
Spring Boot教程之五:在 IntelliJ IDEA 中运行第一个 Spring Boot 应用程序
在 IntelliJ IDEA 中运行第一个 Spring Boot 应用程序 IntelliJ IDEA 是一个用 Java 编写的集成开发环境 (IDE)。它用于开发计算机软件。此 IDE 由 Jetbrains 开发,提供 Apache 2 许可社区版和商业版。它是一种智能的上下文感知 IDE,可用于在各种应用程序…...
排序算法1
排序算法是《数据结构与算法》中最基本的算法之一。 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。 常见的内部…...
vector, list 模拟实现
vector 实现 成员属性/迭代器 template<class T> class vector { public:typedef T* iterator;typedef const T* const_iterator;iterator begin() {return _first; }iterator end() {return _end; }const_iterator begin() const {return _first; }const_iterator end…...
中国近代传奇战役
军事战略层面的传奇战役 孟良崮战役:1947年5月,陈毅、粟裕指挥华东野战军在山东孟良崮地区对国民党军进行的一次大规模山地运动歼灭战。此役,我军出其不意地对国民党最强大的王牌之首第七十四师开战,并将其全歼。战役中ÿ…...
微信小程序页面配置详解:从入门到精通
微信小程序页面配置详解:从入门到精通 引言 随着移动互联网的飞速发展,微信小程序作为一种新兴的应用形式,因其便捷性和丰富的功能而受到广泛欢迎。在小程序的开发过程中,页面配置是至关重要的一环。本文将深入探讨微信小程序的页面配置,帮助开发者从基础到高级逐步掌握…...
C#基础题
6.在屏幕上输出如下所示数列:1 1 2 3 5 8 13 21……an(an<10000) 7.求任意两个整数之间所有整数的平方和?(要求从键盘输入任意两个整数,调用已定义函数求和) 8.将一个二维数组行和列元素互换,存…...
前端开发中v-if 与v-show的区别
v-if v-if指令用于条件性地渲染一块内容。这个块只有当指令的表达式返回true时才会被渲染。 工作原理:v-if通过动态地创建和销毁元素来控制元素的显示与隐藏。当条件为false时,对应的元素及其绑定的事件监听器和子组件都会被销毁;当条件…...
Django实现智能问答助手-基础配置
设置 Django 项目、创建应用、定义模型和视图、实现问答逻辑,并设计用户界面。下面是一步一步的简要说明: 目录: QnAAssistant/ # 项目目录 │ ├── QnAAssistant/ # 项目文件夹 │ ├── init.py # 空文件 │ ├── settings.py # 项目配…...
2024-11-25 二叉树的定义
一、基本概念 1.二叉树是n(n>0)个结点的有限集合: ① 或者为空二叉树,即n0。 ②或者由一个根结点和两个互不相交的被称为根的左子树和右子树组成。左子树和右子树又分别是一棵二叉树。 特点: ①每个结点至多只有两棵子树。 ②左右子树不能颠倒&am…...
构建高效 Redis 集群:从问题排查到最佳实践20241125
引言:Redis 集群的重要性 Redis 作为一款高性能的内存数据库,常用于高并发场景,比如缓存、消息队列和排行榜。通过构建 Redis 集群,可以进一步提升可用性与性能。然而,集群的部署并非一帆风顺,常会遇到各种…...
MyBatis多表映射
一、多表映射概念: 1.多表查询结果映射思路: MyBatis思想是:数据库不可能永远是你所想或所需的那个样子。 我们希望每个数据库都具备良好的第三范式或BCNF范式,可惜它们并不都是那样。 如果能有一种数据库映射模式,完美适配所有的应用程序查询需求&…...
[M最短路] lc743. 网络延迟时间(spfa最短路+单源最短路)
文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接:743. 网络延迟时间 相关链接: [图最短路模板] 五大最短路常用模板) 2. 题目解析 怎么讲呢,挺抽象的…很久没写最短路算法了。反正也是写出来了,但脱离了模板,把…...
使用nvm下载多个版本node后提示vue不是内部或外部命令,执行vue create报.vuerc错误
一、使用nvm后执行含vue的相关命令提示vue不是内部或外部命令 前言:之前有项目需要切换node版本,我把node卸载了然后使用nvm下载多个版本的node。现在想通过vue create搭建vue2的项目时提示vue不是内部或外部命令,执行npm i vue/cli后仍然无…...
高端服务器可以防护哪些攻击?
高端服务器,尤其是那些专门设计用于防御网络攻击的高防服务器,能够提供多种层次的防护,以抵御不同类型的网络攻击。以下是高端服务器可以防御的主要攻击类型: 1. DDoS攻击(分布式拒绝服务攻击) 带宽消耗攻…...
助力花生作物智能化采摘,基于嵌入式端超轻量级模型LeYOLO全系列【n/s/m/l】参数模型开发构建花生种植采摘场景下花生果实智能检测计数系统
秋天,是大地回馈辛勤耕耘者的季节,金黄的稻田、硕果累累的果园、还有那一片片郁郁葱葱的花生地,共同绘制出一幅幅丰收的画卷。对于农民而言,秋收不仅仅是收获的季节,更是他们与土地情感交织、汗水与希望交织的见证。花…...
物联网无线局域网WiFi开发(二):WiFi_RTOS_SDK
一、编译工程模板 (一)搭建app目录 在SDK目录下新建app目录 cd 到examples目录下 拷贝smart_config下所有文件到app目录下 cd 到app目录下查看文件是否拷贝成功 (二)修改gen_misc.sh vim 打开gen_misc.sh进行编辑 修改SDK_PATH为当前SDK路径…...
GitLab|应用部署
创建docker-compose.yaml文件 输入docker-compose配置 version: 3.8 services:gitlab:image: gitlab/gitlab-ce:15.11.2-ce.0restart: alwayscontainer_name: gitlab-ceprivileged: truehostname: 192.168.44.235environment:TZ: Asia/ShanghaiGITLAB_OMNIBUS_CONFIG: |exter…...
替换Nacos的MySQL驱动
前言:替换Nacos的MySQL驱动能实现使Nacos支持MySQL8.0及以上版本的MySQL数据库 注:下述教程会使用命令先解压Nacos的jar包然后重新用命令把Nacos压缩成jar包,不然直接用压缩工具替换MySQL驱动后的Nacos是会启动不起来的(因为没有替…...
链表内指定区间反转
描述 将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转,要求时间复杂度 O(n)O(n),空间复杂度 O(1)O(1)。 例如: 给出的链表为 1→2→3→4→5→NULL1→2→3→4→5→NULL, m2,n4m2,n4, 返回 1→4→3→2→5→NULL1→4→3→2→5→NULL. …...
jmeter5.6.3安装教程
一、官网下载 需要提前配置好jdk的环境变量 jmeter官网:https://jmeter.apache.org/download_jmeter.cgi 选择点击二进制的zip文件 下载成功后,默认解压下一步,更改安装路径就行(我安装在D盘) 实用jmeter的bin目录作为系统变量 然后把这…...
JavaScript高级程序设计基础(五)
上接语言基础:JavaScript高级程序设计基础(四) 本节内容较简单,有一定语言基础的可以跳过 2.5 语句 2.5.1 if语句 具体作用不做过多赘述。需要注意的是,在判断条件里会自动调用Boolean();并且在执行语句…...
Stable Diffusion 3 部署笔记
SD3下载地址:https://huggingface.co/stabilityai/stable-diffusion-3-medium/tree/main https://huggingface.co/spaces/stabilityai/stable-diffusion-3-medium comfyui 教程: 深度测评:SD3模型表现如何?实用教程助你玩转Stabl…...