嵌入式学习--江协stm32day5

USART

1. 引脚与接口层
  • 异步引脚
    • TX:发送数据输出;RX:接收数据输入;SW_RX:单线半双工模式的接收引脚(替代 RX)。
  • 同步引脚SCLK:同步模式下的时钟输出(主模式)或输入(从模式)。
  • IrDA 接口IrDA_OUT/IrDA_IN,配合编解码模块实现红外通信(需外接 IrDA 收发器)。
  • 硬件流控引脚nRTS(请求发送,输出)、nCTS(清除发送,输入),协调收发双方速率。
2. 数据收发核心:寄存器 + 移位寄存器
  • 发送路径
    CPU/DMA → 写入 发送数据寄存器(TDR) → 送入 发送移位寄存器(并行→串行,逐位输出到 TX/IrDA/SW_RX)。
  • 接收路径
    RX/IrDA/SW_RX 接收串行数据 → 送入 接收移位寄存器(串行→并行)→ 存入 接收数据寄存器(RDR) → 供 CPU/DMA 读取。
  • 关键逻辑:移位寄存器负责 “串并转换”,TDR/RDR 作为数据缓冲(避免 CPU 频繁干预)。
3. 控制与配置:CR1/CR2/CR3 寄存器
  • CR1:基础配置,如:
    • UE:USART 使能;M:字长(8/9 位);WAKE:唤醒模式(空闲线 / 地址标记);
    • 中断使能(TXEIE 发送空、RXNEIE 接收非空、IDLEIE 总线空闲等)。
  • CR2:帧格式与同步控制,如:
    • STOP[1:0]:停止位数量(0.5/1/1.5/2 位);LINEN:LIN 总线模式;
    • 同步模式时钟配置(CPOL 极性、CPHA 相位、CLKEN 时钟使能)。
  • CR3:高级功能,如:
    • DMA 使能(DMAT 发送 DMA、DMA 接收 DMA);
    • 硬件流控(RTSE 使能 nRTS、CTSE 使能 nCTS);
    • 红外模式(IREN)、半双工(HDSEL)等。
4. 波特率生成:USART_BRR 寄存器
  • 核心公式
    USARTDIV=16×波特率fPCLK​​=DIV_Mantissa+16DIV_Fraction​
    • fPCLK:USART 外设时钟(来自 RCC 配置);
    • DIV_Mantissa:整数部分(15 位),DIV_Fraction:小数部分(4 位),共同决定波特率精度(如 9600、115200 等)。
  • 时钟分配:生成的 USARTDIV 同时供给 发送器时钟 和 接收器时钟,保证收发同步。
5. 状态与中断:SR 寄存器 + 中断控制
  • 状态标志(SR
    • TXE:发送数据寄存器空(可写入新数据);
    • RXNE:接收数据寄存器非空(可读取数据);
    • IDLE:总线空闲(异步模式下,用于检测一帧结束);
    • 错误标志:OE(溢出)、PE(奇偶校验错)、FE(帧错)、NE(噪声错)。
  • 中断控制:通过 CR1 使能对应中断(如 TXEIE 使能 TXE 中断),触发后进入 USART 中断控制模块,通知 CPU 处理。

串口发送

#include "stm32f10x.h"                  // Device header
#include "stdio.h"
#include "stdarg.h"
void Serial_Init()
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);USART_InitTypeDef USART_InitStructrue;USART_InitStructrue.USART_BaudRate=9600;USART_InitStructrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStructrue.USART_Mode=USART_Mode_Tx;USART_InitStructrue.USART_Parity=USART_Parity_No;USART_InitStructrue.USART_StopBits=USART_StopBits_1;USART_InitStructrue.USART_WordLength=USART_WordLength_8b;USART_Init(USART1,&USART_InitStructrue);USART_Cmd(USART1,ENABLE);}void Serial_SendByte(uint8_t Byte)
{USART_SendData(USART1,Byte);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);}
void Serial_SendArray(uint8_t *Array,uint16_t Length)
{uint16_t i;for(i=0;i<Length;i++){Serial_SendByte(Array[i]);}
}
void Serial_SendString(char *String)
{uint8_t i;for(i=0;String[i]!='\0';i++){Serial_SendByte(String[i]);}}
uint32_t Serial_Pow(uint32_t X,uint32_t Y)
{uint32_t Result;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');}
}
int fputc(int ch,FILE *f)
{Serial_SendByte(ch);return ch;}void Serial_printf(char *format,...)
{char String[100];va_list arg;va_start(arg,format);vsprintf(String,format,arg);va_end(arg);Serial_SendString(String);}

串口发送+接收

#include "stm32f10x.h"                  // Device header
#include "stdio.h"
#include "stdarg.h"uint8_t Serial_RxFlag;
uint8_t Serial_RxData;
void Serial_Init()
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);USART_InitTypeDef USART_InitStructrue;USART_InitStructrue.USART_BaudRate=9600;USART_InitStructrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStructrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;USART_InitStructrue.USART_Parity=USART_Parity_No;USART_InitStructrue.USART_StopBits=USART_StopBits_1;USART_InitStructrue.USART_WordLength=USART_WordLength_8b;USART_Init(USART1,&USART_InitStructrue);USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructrue;NVIC_InitStructrue.NVIC_IRQChannel=USART1_IRQn;NVIC_InitStructrue.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStructrue.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStructrue.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStructrue);USART_Cmd(USART1,ENABLE);}void Serial_SendByte(uint8_t Byte)
{USART_SendData(USART1,Byte);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);}
void Serial_SendArray(uint8_t *Array,uint16_t Length)
{uint16_t i;for(i=0;i<Length;i++){Serial_SendByte(Array[i]);}
}
void Serial_SendString(char *String)
{uint8_t i;for(i=0;String[i]!='\0';i++){Serial_SendByte(String[i]);}}
uint32_t Serial_Pow(uint32_t X,uint32_t Y)
{uint32_t Result;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');}
}
int fputc(int ch,FILE *f)
{Serial_SendByte(ch);return ch;}void Serial_printf(char *format,...)
{char String[100];va_list arg;va_start(arg,format);vsprintf(String,format,arg);va_end(arg);Serial_SendString(String);}
uint8_t Serial_GetRxFlag()
{if(Serial_RxFlag==1){Serial_RxFlag=0;return 1;}return 0;
}
uint8_t Serial_GetRxData()
{return Serial_RxData;
}
void USART1_IRQHandler()
{if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET){Serial_RxData=USART_ReceiveData(USART1);Serial_RxFlag=1;USART_ClearITPendingBit(USART1,USART_IT_RXNE);}}

串口发送HEX数据包

#include "stm32f10x.h"                  // Device header
#include "stdio.h"
#include "stdarg.h"uint8_t Serial_RxFlag;
uint8_t Serial_RxData;
uint8_t Serial_TxPacket[4];
uint8_t Serial_RxPacket[4];void Serial_Init()
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);USART_InitTypeDef USART_InitStructrue;USART_InitStructrue.USART_BaudRate=9600;USART_InitStructrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStructrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;USART_InitStructrue.USART_Parity=USART_Parity_No;USART_InitStructrue.USART_StopBits=USART_StopBits_1;USART_InitStructrue.USART_WordLength=USART_WordLength_8b;USART_Init(USART1,&USART_InitStructrue);USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructrue;NVIC_InitStructrue.NVIC_IRQChannel=USART1_IRQn;NVIC_InitStructrue.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStructrue.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStructrue.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStructrue);USART_Cmd(USART1,ENABLE);}void Serial_SendByte(uint8_t Byte)
{USART_SendData(USART1,Byte);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);}
void Serial_SendArray(uint8_t *Array,uint16_t Length)
{uint16_t i;for(i=0;i<Length;i++){Serial_SendByte(Array[i]);}
}
void Serial_SendString(char *String)
{uint8_t i;for(i=0;String[i]!='\0';i++){Serial_SendByte(String[i]);}}
uint32_t Serial_Pow(uint32_t X,uint32_t Y)
{uint32_t Result;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');}
}
int fputc(int ch,FILE *f)
{Serial_SendByte(ch);return ch;}void Serial_printf(char *format,...)
{char String[100];va_list arg;va_start(arg,format);vsprintf(String,format,arg);va_end(arg);Serial_SendString(String);}
void Serial_SendPacket()
{Serial_SendByte(0xFF);Serial_SendArray(Serial_TxPacket,4);Serial_SendByte(0xFE);}
uint8_t Serial_GetRxFlag()
{if(Serial_RxFlag==1){Serial_RxFlag=0;return 1;}return 0;
}void USART1_IRQHandler()
{static uint8_t RxState=0;static uint8_t pRxPacket=0;if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET){uint8_t RxData=USART_ReceiveData(USART1);if(RxState==0){if(RxData==0xFF){RxState=1;pRxPacket=0;}}else if(RxState==1){Serial_RxPacket[pRxPacket]=RxData;pRxPacket++;if(pRxPacket>=4){RxState=2;}}else if(RxState==2){if(RxData==0xFE){RxState=0;Serial_RxFlag=1;}}USART_ClearITPendingBit(USART1,USART_IT_RXNE);}}

串口发送文本数据包

#include "stm32f10x.h"                  // Device header
#include "stdio.h"
#include "stdarg.h"uint8_t Serial_RxFlag;
uint8_t Serial_RxData;
char Serial_RxPacket[100];void Serial_Init()
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);USART_InitTypeDef USART_InitStructrue;USART_InitStructrue.USART_BaudRate=9600;USART_InitStructrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStructrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;USART_InitStructrue.USART_Parity=USART_Parity_No;USART_InitStructrue.USART_StopBits=USART_StopBits_1;USART_InitStructrue.USART_WordLength=USART_WordLength_8b;USART_Init(USART1,&USART_InitStructrue);USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructrue;NVIC_InitStructrue.NVIC_IRQChannel=USART1_IRQn;NVIC_InitStructrue.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStructrue.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStructrue.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStructrue);USART_Cmd(USART1,ENABLE);}void Serial_SendByte(uint8_t Byte)
{USART_SendData(USART1,Byte);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);}
void Serial_SendArray(uint8_t *Array,uint16_t Length)
{uint16_t i;for(i=0;i<Length;i++){Serial_SendByte(Array[i]);}
}
void Serial_SendString(char *String)
{uint8_t i;for(i=0;String[i]!='\0';i++){Serial_SendByte(String[i]);}}
uint32_t Serial_Pow(uint32_t X,uint32_t Y)
{uint32_t Result;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');}
}
int fputc(int ch,FILE *f)
{Serial_SendByte(ch);return ch;}void Serial_printf(char *format,...)
{char String[100];va_list arg;va_start(arg,format);vsprintf(String,format,arg);va_end(arg);Serial_SendString(String);}void USART1_IRQHandler()
{static uint8_t RxState=0;static uint8_t pRxPacket=0;if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET){uint8_t RxData=USART_ReceiveData(USART1);if(RxState==0){if(RxData=='@'&&Serial_RxFlag==0){RxState=1;pRxPacket=0;}}else if(RxState==1){if(RxData=='\r'){RxState=2;}else{Serial_RxPacket[pRxPacket]=RxData;pRxPacket++;}}else if(RxState==2){if(RxData=='\n'){RxState=0;Serial_RxFlag=1;Serial_RxPacket[pRxPacket]='\0';}}USART_ClearITPendingBit(USART1,USART_IT_RXNE);}}

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

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

相关文章

使用Fiddler抓包

有时候需要跟踪一些小程序的HTTP请求&#xff0c;但是无法像浏览器一样F12查看请求&#xff0c;因此需要借助其他的工具进行&#xff0c;在这里推荐使用Fiddler 配置 此时检查系统代理已经变成如下配置&#xff1a; 抓包 此时随便打开一个小程序&#xff0c;就可以进行抓包…

python学习打卡day47

DAY 47 注意力热图可视化 昨天代码中注意力热图的部分顺移至今天 知识点回顾&#xff1a; 热力图 作业&#xff1a;对比不同卷积层热图可视化的结果 # 可视化空间注意力热力图&#xff08;显示模型关注的图像区域&#xff09; def visualize_attention_map(model, test_loader,…

MySQL-运维篇

运维篇 日志 错误日志 错误日志是 MySQL 中最重要的日志之一&#xff0c;它记录了当 mysqld 启动和停止时&#xff0c;以及服务器在运行过程中发生任何严重错误时的相关信息当数据库出现任何故障导致无法正常使用时&#xff0c;建议首先查看此日志。 该日志是默认开启的&am…

Prompt Tuning(提示调优)到底训练优化的什么部位

Prompt Tuning(提示调优)到底训练优化的什么部位 在自然语言处理(NLP)领域,Prompt Tuning(提示调优)是一种轻量级的模型优化技术,其核心目标是通过优化提示(Prompt)来引导预训练语言模型(如GPT、BERT等)更好地完成特定任务,而无需大规模调整模型的主体参数。 一…

基于FPGA的超声波显示水位距离,通过蓝牙传输水位数据到手机,同时支持RAM存储水位数据,读取数据。

基于FPGA的超声波显示水位距离 前言一、整体框架二、代码架构1.超声波测距模块2.蓝牙数据发送模块3.数码管数据切换模块4.数码管驱动模块6.串口驱动7.顶层模块8.RAM ip核 仿真相关截图 前言 随着工业化进程的加速和环境保护意识的提升&#xff0c;对水资源管理和水位监测的需求…

OD 算法题 B卷【水果摊小买卖】

文章目录 水果摊小买卖 水果摊小买卖 小王手里有点闲钱&#xff0c;想做点水果买卖&#xff0c;给出两个数组m, n&#xff0c; m[i]表示第i个水果的成本价&#xff0c;n[i]表示第i个水果能卖出的价格&#xff1b;假如现在有本钱k&#xff0c;试问最后最多能赚多少钱&#xff1…

(新手友好)MySQL学习笔记(6):分组查询,正则表达式

目录 分组查询 创建分组 过滤分组 分组查询练习 正则表达式 匹配单个实例 匹配多个实例 正则表达式练习 练习答案 分组查询练习答案 正则表达式练习答案 分组查询 创建分组 group by 子句&#xff1a;根据一个或多个字段对结果集进行分组&#xff0c;在分组的字段上…

Android 之 kotlin 语言学习笔记四(Android KTX)

一、Android KTX 简介 Android KTX 是包含在 Android Jetpack 及其他 Android 库中的一组 Kotlin 扩展程序。KTX 扩展程序可以为 Jetpack、Android 平台及其他 API 提供简洁的惯用 Kotlin 代码。为此&#xff0c;这些扩展程序利用了多种 Kotlin 语言功能&#xff0c;其中包括&…

云原生思维重塑数字化基座:从理念到实践的深度剖析

&#x1f4dd;个人主页&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、引言&#xff1a;云原生为何成为数字化的“基础设施语言”&#xff1f; 随着5G、人工智能、物联网等技术逐步进入规模化落地阶段&am…

【C/C++】STL实现版本为什么比手写版本高?

文章目录 为什么标准库版本效率更高&#xff1f;1 具体介绍1.1 **内联优化&#xff08;Inlining&#xff09;和模板展开**1.2 **分支预测友好&#xff08;Branch Prediction&#xff09;**1.3 **迭代器解耦 静态分发**1.4 **代码紧凑&#xff0c;编译器优化空间大**1.5 **高质…

35.成功解决编写关于“江协科技”编写技巧第二期标志位积累的问题

江科大学长又发布了第二期的编写技巧&#xff01; 大家可以看看&#xff1a;https://space.bilibili.com/383400717 最后面给了一个未完成的任务&#xff1a; 这里我已经把这个问题给解决了&#xff01; 总代码放在资源里面&#xff0c;key.c放在文章最后面&#xff01;同时感…

STM32什么是寄存器

提示&#xff1a;文章 文章目录 前言一、背景二、2.12.2 三、3.1 总结 前言 前期疑问&#xff1a; 1、什么是寄存器&#xff1f; 答&#xff1a;在4GB的地址空间中&#xff0c;512MB的block2上&#xff0c;每4个字节组成32位&#xff0c;这个32位为一个单元&#xff0c;控制&a…

【Pinia】Pinia和Vuex对比

Pinia 是 Vue 官方团队成员专门开发的一个全新状态管理库&#xff0c;并且 Vue 的官方状态管理库已经更改为了 Pinia。 在 Vuex 官方仓库中也介绍说可以把 Pinia 当成是不同名称的 Vuex 5&#xff0c;这也意味不会再出 5 版本了。 优点 1. 更加轻量级&#xff0c;压缩后提交只…

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件&#xff1a; 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…

Oracle双平面适用场景讨论会议

4月28日&#xff0c;我在杭州组织召开了Oracle双平面会议讨论沙龙。在国产化数据库浪潮的今天&#xff0c;Oracle数据库作为国产数据库的应急库&#xff0c;在国产数据库发生故障或者性能下降时&#xff0c;如何更好的使用Oracle。会议主题如下&#xff1a; 1、背景与痛点速览&…

10.Linux进程信号

1. 理解信号 信号VS信号量 老婆&#xff1a;老婆饼-》没有任何关系&#xff01;信号&#xff1a;闹钟&#xff0c;上课铃声&#xff0c;脸色...人-》进程&#xff1b;信号中断人正在做的事&#xff0c;是一种事件的异步通知机制&#xff1b; 我们自习一会&#xff0c;等张三回…

求解插值多项式及其余项表达式

例 求满足 P ( x j ) f ( x j ) P(x_j) f(x_j) P(xj​)f(xj​) ( j 0 , 1 , 2 j0,1,2 j0,1,2) 及 P ′ ( x 1 ) f ′ ( x 1 ) P(x_1) f(x_1) P′(x1​)f′(x1​) 的插值多项式及其余项表达式。 解&#xff1a; 由给定条件&#xff0c;可确定次数不超过3的插值多项式。…

C++刷题:日期模拟(1)

&#xff08;注&#xff1a;本文所展示代码均为本人所写&#xff0c;不一定为最优&#xff09; 我们首先用纯逻辑和手动计算来拆解日期模拟题&#xff0c;再来代码实现&#xff0c;看看这些问题的底层思路怎么玩明白&#xff5e; 一、基础日期计算&#xff1a;直接算“过几天是…

深入剖析Nginx:从入门到高并发架构实战

深入剖析Nginx&#xff1a;从入门到高并发架构实战 摘要&#xff1a;本文全面解析Nginx的核心功能、架构原理及实战配置&#xff0c;涵盖负载均衡、反向代理、动静分离等高级应用场景&#xff0c;助你构建高性能Web服务架构。 一、Nginx是什么&#xff1f;为什么它如此重要&…

Qt客户端技巧 -- 窗口美化 -- 圆角窗口

不解析&#xff0c;直接给代码例子 利用窗口重绘事件处理函数paintEvent main.cpp #include <QtCore/qglobal.h> #if QT_VERSION > 0x050000 #include <QtWidgets/QApplication> #else #include <QtGui/QApplication> #endif#include "roundedwin…