当前位置: 首页 > news >正文

STM32---串口通信USART

目录

一、串口通信协议        

二、USART模块介绍

(1)移位寄存器

(2)控制电路

(3)波特率

(4)C语言接口

三、串口的引脚初始化

(1)引脚分布表

(2)重映射表

(3)GPIO配置表

(4)C语言接口使用

四、标志位的使用

(1)读写标志位

(2)错误标志位

五、发送数据代码

六、接收数据代码


一、串口通信协议        

        在学习网络通信的时候,我们曾认识到两台主机想要进行通信,必须要有协议的存在,否则对方根本不知道你说了啥,因为在网络中没有信息的概念,只有二进制电平信号。如果不规定协议,对方的操作系统就不知道如何解析该二进制信号。于是演变出来OSI的7层模型,每一层都相当于一层协议,对数据包进行封装,从而让对方的同层协议可以解析提取真正想要的数据。

        那么我们STM32单片机自然也可以认为属于网络协议中的物理层协议。因为他并没有经过交换机路由器等设备,仅仅只是把两台主机直连,所以他并不可能在数据链路层、或者网络层。但是也有人认为他属于数据链路层,以为他有数据帧封装,尽管这个封装十分简单。而且他没有mac地址其实是因为他没有负责的连接环境,但是本质上他这个简单的协议是可以做到传输mac地址的。其实这种理解也是有道理的,因为规定上物理层没有任何协议存在,是单纯的数据流传输。

        真实的物理连接图:

        正是因为它属于物理层协议,那么可以预见的是他的协议必然很简单。我们来看看他的协议格式:

        它的协议格式非常简单,由一位低电平起始位+7-8位数据位+(一位校验位)+一位高电平停止位组成。

        其中这里的数据位为7-8位是可以选择的,不过我们一般都是要传递一个字节,所以一般情况下只会选择8位数据位,至于校验位,如果你的精确度要求高可以选择,通常来说并无较大差异。

二、USART模块介绍

        在结构图中可以看到UART有三个,APB1和APB2线上都存在。可以根据你对时钟频率的不同选取。

(1)移位寄存器

        在这幅图中有两个移位寄存器,他的作用就是接收和发送数据。

        当我们想要发送数据的时候,就把值填入发送寄存器。之后该模块会自动把该寄存器的数据在时钟的频率下,一位位得把数据的二进制流交给控制电路。

        反过来,接收数据的时候,是先交给到了控制电路,控制电路对接收到的数据帧,进行解包(去除起始位、停止位、并检验校验位是否正确),把数据取出交给接收寄存器,然后由该寄存器把数据向上传递即可。

        在这个过程中两个寄存器的作用主要是串转并、并转串。因为在物理线路中的传递都是二进制流的串行数据,而用户想看到的则是8位一起的并行数据。

(2)控制电路

        控制电路主要就是进行封包和解包分用的。在这里可以通过配置寄存器来决定数据包的格式:数据位是7位还是8位?有没有校验位?、停止位是多少个时钟周期的高电平?

(3)波特率

        波特率指的是一分钟的时间,比特位传输的数量。比如你的串口选择的波特率是9600,那么他一分钟能传递的比特位就是9600个,即9600/8=1200个字节。大多数情况下波特率都会被配置成9600、115200、921600,这个和时钟的频率有关,尽可能选择可以由时钟频率直接分频得到的,精确度较高。

        在这幅图中,波特率是由时钟经过波特率寄存器BRR和一个16分频的分频器得到的。因为STM32的时钟频率往往是36、72MHz比较大,经过这些分频降低频率更好用。不过如果你对数据的传输时间限制很短,可以尝试较高的频率。

(4)C语言接口

在库函数中可以找到一个USART_Init,他就是用来配置UART(上述)模块的函数。可以在这里设置波特率、数据位长度、校验方式、接收还是发送数据等。

当然还需要一个时钟总开关使能

USART_Cmd(USART1,ENABLE);//使能USART模块

三、串口的引脚初始化

        我们在上面已经了解了UART模块的配置方法。那么既然要向外传输数据,必然会有引脚暴露出来供我们使用,那么他们是谁呢?

        USART的引脚有这5个,其中Tx和Rx最为熟悉,是用来传输数据的。而硬件流控我们暂时并不会涉及到,也不过多讲解。同步模式的时钟线,则是如果你想让两个STM32单片机进行数据交流,则可以用这个时钟线把两台主机连接到一起,让他们都遵循一个时钟,在该时钟的指导下进行串口通信,保证数据的准确性。

(1)引脚分布表

在数据手册中有这样两幅图,他们表示了当前芯片的封装情况、重映射情况。

由于他比较多,我直接把和UASRT相关的引脚内容挑出来看,所以知道了我们在不使用重映射的情况下USART的输入输出引脚是接在PA9和PA10上面的。如果你就想使用默认情况,则直接配置PA9和PA10两个引脚即可。

当然,在重映射后他们的位置则变为了PB6和PB7。注意你如果把他们配置成了USART的引脚,则原本的GPIO功能是无法使用的。

(2)重映射表

在上面直接看引脚分布表比较麻烦,可以直接到使用手册中查看。内容是一样的。

(3)GPIO配置表

        我们已经找到了其引脚,配置成什么模式呢?

在使用手册中同样有一个表格,明确说明了各种外设在使用GPIO的时候,应当被配置为什么模式。

在这里我们看到全双工模式下,Tx要配置成推挽复用输出、Rx要配置成上拉输入。

        复用推挽输出和通用推挽输出的区别就是:一个是由CPU直接控制引脚的电平高低,另一个把引脚电平的控制权交给外设模块自己操作,更加方便。

(4)C语言接口使用

默认情况:

重映射情况:

四、标志位的使用

        在USART的框图中我们曾有一部分没有讲解,就是右上角的标志位。通过读取标志位,可以让我们时刻检查到USART模块的运行情况。

(1)读写标志位

TxE:检查能否填入数据到发送寄存器

TC:检查档次发送过程是否结束

RxNE:

(2)错误标志位

        我们在通过USART协议传输数据的时候,难免会出现某些原因,使得数据的发送端和接收端并不一致,我们就认为他出错了。虽然USART的控制电路会自动检测错误,但是我们上层应用要想知道仍需要查看这些标志位来获取状态。

        错误标志位是一个协议中非常重要的存在。通过检验错误标志位,你可以对不同的错误做出不同的处理,比如:如果接受数据错误,你可以选择向对端发送消息,告诉他你的数据错了,请重新发。有没有回想到我们之前学习TCP也是这样的!

PE:

FE:

比如没有接收到停止位,就是一种帧格式错误。

NE:

我们实际在接受一个USART协议的信号的时候,会在一个时钟周期内多次检测,看看每次检测的结果是不是一样的,如果不一样则表示有噪音,该数据不可信。

ORE:

当接受寄存器中有数据没有被上层应用取走,他会停留在原地(字节1),如果有数据又来了,他就保存在了接收端的移位寄存器(字节2),此时仍然没有问题。但是如果继续来了数据(字节3),他就会覆盖掉移位寄存器中的字节2,此时控制电路就会监测到该情况,并把ORE置1。

五、发送数据代码

向发送寄存器写入数据的函数

对上述代码进行封装:

void Init_USART()
{//USART配置RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);USART_InitTypeDef USART_InitStruct;USART_InitStruct.USART_BaudRate=115200;USART_InitStruct.USART_Mode=USART_Mode_Tx | USART_Mode_Rx;USART_InitStruct.USART_WordLength=USART_WordLength_8b;USART_InitStruct.USART_Parity=USART_Parity_No;USART_InitStruct.USART_StopBits=USART_StopBits_1;USART_Init(USART1,&USART_InitStruct);//GPIO配置RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);//使能USARTUSART_Cmd(USART1,ENABLE);}void My_USART_SendBytes(USART_TypeDef* USARTx,uint8_t* pData,uint16_t Number)
{for(uint16_t i=0;i<Number;i++){//不为空的时候就在while循环中出不来while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//走到这说明发送寄存器为空了USART_SendData(USARTx,pData[i]);//如果移位寄存器没有清空,就不退出这个函数while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);}
}int main(void)
{Init_USART();uint8_t datas[]={10,50,90,100,66};while(1){My_USART_SendBytes(USART1,datas,5);}
}

如果你上述步骤都正确的话你是可以成功的通过STM32单片机向电脑主机发送消息的。结果如下:

六、接收数据代码

具体使用如下:

示例代码:

void Init_USART()
{//USART配置RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);USART_InitTypeDef USART_InitStruct;USART_InitStruct.USART_BaudRate=115200;USART_InitStruct.USART_Mode=USART_Mode_Tx | USART_Mode_Rx;USART_InitStruct.USART_WordLength=USART_WordLength_8b;USART_InitStruct.USART_Parity=USART_Parity_No;USART_InitStruct.USART_StopBits=USART_StopBits_1;USART_Init(USART1,&USART_InitStruct);//GPIO配置RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);//使能USARTUSART_Cmd(USART1,ENABLE);}void My_USART_SendBytes(USART_TypeDef* USARTx,uint8_t* pData,uint16_t Number)
{for(uint16_t i=0;i<Number;i++){//不为空的时候就在while循环中出不来while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//走到这说明发送寄存器为空了USART_SendData(USARTx,pData[i]);//如果移位寄存器没有清空,就不退出这个函数while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);}
}void My_Led_Init(void)
{//GPIO配置RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_OD;GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz;GPIO_Init(GPIOC,&GPIO_InitStruct);//初始设置为灭,即GPIOC_Pin_13为高电平GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);
}int main(void)
{My_Led_Init();Init_USART();uint8_t datas[]={10,50,90,100,66};while(1){// My_USART_SendBytes(USART1,datas,5);//接收数据,并处理while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET);uint8_t byteEecv=USART_ReceiveData(USART1);//处理//0灭if(byteEecv==0){GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);}//1亮else if(byteEecv==1){GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET);}}}

如果你的操作正确,则可以看到用串口控制芯片上的LED了。

相关文章:

STM32---串口通信USART

目录 一、串口通信协议 二、USART模块介绍 &#xff08;1&#xff09;移位寄存器 &#xff08;2&#xff09;控制电路 &#xff08;3&#xff09;波特率 &#xff08;4&#xff09;C语言接口 三、串口的引脚初始化 &#xff08;1&#xff09;引脚分布表 &…...

YOLO11改进-Backbone-引入TransXNet替换YOLO backbone 学习全局和局部动态信息,提高检测精度

Vision Transformer 的缺陷&#xff1a;Vision Transformer&#xff08;ViT&#xff09;运用多头自注意力机制在计算机视觉领域取得进展&#xff0c;但它缺乏卷积神经网络&#xff08;CNNs&#xff09;所具有的归纳偏差&#xff0c;导致泛化能力相对较弱。像 Swin Transformer …...

SQL 多表查询:数据整合与分析的强大工具

SQL 多表查询&#xff1a;数据整合与分析的强大工具 在关系型数据库中&#xff0c;数据通常被组织在多个表中。这种表的分离有助于减少冗余并提高数据的管理效率。然而&#xff0c;在实际应用中&#xff0c;往往需要对多个表中的数据进行整合查询&#xff0c;来获得更完整的信…...

MCU开发学习记录11 - ADC学习与实践(HAL库) - 单通道ADC采集、多通道ADC采集、定时器触发连续ADC采集 - STM32CubeMX

名词解释&#xff1a; ADC&#xff1a; Analog-to-Digital SAR&#xff1a;Successive Approximation Register 本文将介绍ADC的概念、相关函数以及STM32CubeMX生成ADC的配置函数。针对于ADC实践&#xff1a;单通道采集芯片内部温度传感器&#xff08;ADC1_ch16&#xff09;&a…...

MacOS中安装Python(homebrew,pyenv)

前言 由于MacOS中自带Python&#xff0c;而自带的Python关联到许多系统组件&#xff0c;不推荐 禁止使用自带Python 安装homebrew包管理器 homebrew官网 打开终端&#xff08;terminal&#xff09;输入以下命令 /bin/bash -c "$(curl -fsSL https://raw.githubusercon…...

从物理到预测:数据驱动的深度学习的结构化探索及AI推理

在当今科学探索的时代&#xff0c;理解的前沿不再仅仅存在于我们书写的方程式中&#xff0c;也存在于我们收集的数据和构建的模型中。在物理学和机器学习的交汇处&#xff0c;一个快速发展的领域正在兴起&#xff0c;它不仅观察宇宙&#xff0c;更是在学习宇宙。 AI推理 我们…...

新书速览|Hadoop与Spark大数据全景解析(视频教学版)

《Hadoop与Spark大数据全景解析:视频教学版》 01 本书内容 《Hadoop与Spark大数据全景解析:视频教学版》结合作者多年在大数据领域的开发实践经验&#xff0c;采用“理论实战”的形式&#xff0c;以大量实例全面介绍Hadoop和Spark的基础知识及其高级应用。作者将丰富的教学经…...

Linux:42线程控制lesson30

代码1&#xff1a;验证join可以去的线程执行完后的退出码/返回值 #include<iostream> #include<unistd.h> #include<pthread.h> #include<string> using namespace std;void* routine(void* arg){string name static_cast<const char*>(arg);i…...

配置 Apache 的 HTTPS

证书文件 文件名 作用 来源 example.com.key 服务器的私钥&#xff0c;用于加密和解密数据。 本地生成 -----BEGIN PRIVATE KEY----- MIIEowIBAAKCAQEAqp5c... -----END PRIVATE KEY----- example.com.csr Certificate Signing Request 证书签名请求文件&#xff0c;包…...

【Flutter高效开发】GetX指南:一文学会状态管理、路由与依赖注入

GetX是Flutter生态中最受欢迎的轻量级全能框架&#xff0c;以其简洁的API设计和卓越的性能著称。本文将带你全面掌握GetX的核心功能和使用技巧&#xff0c;提升你的Flutter开发效率。 一、GetX框架核心优势 1. 三位一体架构设计 模块功能传统方案对比状态管理响应式状态控制…...

第四节:核心概念高频题-Vue生命周期钩子变化

重命名&#xff1a;beforeDestroy→beforeUnmount&#xff0c;destroyed→unmounted 新增&#xff1a;onServerPrefetch&#xff08;SSR场景&#xff09; Vue 生命周期钩子变化详解&#xff08;Vue2 → Vue3&#xff09; 一、核心钩子重命名与语义优化 销毁阶段语义化升级 • …...

安全邮件系统的Maple实现详解

代码改进版&#xff1a; # # 安全邮件系统实现 - 结合DES和RSA加密 # 功能&#xff1a;实现安全的消息加密、签名和传输 # # -------------------------- # 第一部分&#xff1a;消息准备和加密 # --------------------------# 原始消息内容 message : "This is an atte…...

VTK-8.2.0源码编译(Cmake+VS2022+Qt5.12.12)

参考&#xff1a; 安装VTK 详细图文讲解CMake编译VTK&#xff0c;包含详细的编译环境版本 Visual Studio 2022 配置VTK9.3.0 VTK-8.2.0源码编译和初步使用(CmakeVS2015Qt5.14.2) 文章目录 下载编译编译环境介绍配置CMake信息BUILD_SHARED_LIBS控制生成的库是动态链接库&#xf…...

【playwright】学习--持续汇总

seleniumplaywrightselenium 需要结合其他自动化框架&#xff0c;比如pytest之后才能支持web自动化测试playwright 不需要其他自动化框架selenium库》webdriver》浏览器驱动playwright库》playwright driver》浏览器驱动 目录 安装playwright通过pip安装通过VScode安装 安装pla…...

深度解析算法之模拟

39.替换所有的问号 题目链接 给你一个仅包含小写英文字母和 ? 字符的字符串 s&#xff0c;请你将所有的 ? 转换为若干小写字母&#xff0c;使最终的字符串不包含任何 连续重复 的字符。 注意&#xff1a;你 不能 修改非 ? 字符。 题目测试用例保证 除 ? 字符 之外&#…...

leetcode刷题日记——插入区间

[ 题目描述 ]&#xff1a; [ 思路 ]&#xff1a; intervals 有序&#xff0c;需要将一个新的范围插入&#xff0c;然后进行整合方法一&#xff0c;将新的范围插入原 intervals 区间&#xff0c;然后使用 56 题的合并区间函数直接解决方法二&#xff0c; 找出能够包容 newInte…...

gbase8s存储学习一 rootdbs存储结构以及寻址分析

主要层次自下而上为 最小物理存储单元page &#xff0c;多个page 组成逻辑存储单元extent,多个extent 组成物理存储单元chunk ,而多个chunk组成逻辑存储单元dbspace&#xff0c;多个dbspace 组成一个数据库实例 在数据库初始化阶段会生成一个rootdbs表空间&#xff0c;该表空…...

学习设计模式《五》——工厂方法模式

一、基础概念 工厂方法模式的本质是【延迟到子类来选择实现】&#xff1b; 工厂方法模式的定义&#xff1a;定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类&#xff0c;FactoryMethod使一个类的实例化延迟到其子类 。 工厂方法模式的功能 序号说明0工厂方法模…...

如何将 Azure Active Directory (Azure AD) 作为 SAML IdP 对接到 Keycloak

✅ 一、在 Azure AD 创建 SAML 应用 &#x1f527; 1. 登录 Azure 门户 前往 https://portal.azure.com&#xff0c;使用管理员账号登录。 &#x1f4cc; 2. 创建企业应用&#xff08;Enterprise Application&#xff09; 左侧菜单进入 “企业应用程序”。点击 “新建应用程…...

OCR之身份证识别

前言 OCR身份证识别是光学字符识别技术在身份证领域的应用。通过扫描或拍照获取身份证图像&#xff0c;利用图像处理、深度学习等技术&#xff0c;自动提取姓名、性别、民族、出生日期、地址、身份证号等信息&#xff0c;可大幅提升信息录入效率&#xff0c;广泛应用于政务、金…...

JavaScript 渲染内容爬取:Puppeteer 高级技巧与实践

在现代网络应用中&#xff0c;动态网页内容的爬取一直是开发者面临的挑战之一。Puppeteer 作为一种强大的浏览器自动化工具&#xff0c;为这一问题提供了优雅的解决方案。本文将深入探讨 Puppeteer 的高级技巧&#xff0c;包括动态内容抓取、性能优化、反检测与伪装、复杂自动化…...

组织级项目管理OPM

组织级项目管理(Organizational Project Management, OPM)是一种系统化的管理方法,旨在通过整合项目组合、项目集和项目管理,确保组织的战略目标与项目执行的一致性,提升资源利用效率和项目成功率。以下是其核心内容与框架的详述: 一、组织级项目管理的定义与目标 定义 组…...

HTML与Web 性能优化:构建高速响应的现代网站

HTML 与 Web 性能优化&#xff1a;构建高速响应的现代网站 引言 随着互联网用户对网站加载速度期望的不断提高&#xff0c;前端性能优化已经成为现代 Web 开发的核心竞争力。据 Google 研究表明&#xff0c;页面加载时间每增加 1 秒&#xff0c;用户跳出率就会增加 32%。用户…...

模型 观测者效应

系列文章分享模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。观察即影响&#xff0c;存在因注视而变。 1 观测者效应的应用 1.1 工业心理学—霍桑实验中的生产效率谜题 行业背景&#xff1a;20世纪20年代西方电气公司霍桑工厂&#xff0c;研究者试图通过优化照明…...

Ubuntu启动SMB(Samba)服务步骤

目录 1.基本的Samba服务器搭建流程主要分为四个步骤。 2.Samba工作流程&#xff1a; 3.解读主要配置文件smb.conf 4.开始安装Samba 5.检查Samba服务状态 6.创建Samba共享文件夹 7.配置Samba文件以及设置Samba用户密码 8.重启Samba服务器 9.关闭防火墙 10.Linux客户端…...

使用react的ant-design-pro框架写一个地图组件,可以搜索地图,可以点击地图获取点击的位置及经纬度

首先&#xff0c;先创建一个地图页面&#xff0c;用于显示地图组件&#xff0c;我是在pages文件中创建了一个mapSearch组件。 然后在routes.ts中注册页面。 {path: /mapSearch,name: mapSearch,icon: smile,component: ./mapSearch,}, 第三步就是使用高德地图来创建地图。 关键…...

【每日八股】复习计算机网络 Day4:TCP 协议的其他相关问题

文章目录 昨日内容复习已经建立了 TCP 连接&#xff0c;客户端突然出现故障怎么办&#xff1f;什么时候用长连接&#xff1f;短连接&#xff1f;TCP 的半连接队列与全连接队列&#xff1f;什么是 SYN 攻击&#xff1f;如何避免&#xff1f;TIME_WAIT 的作用&#xff1f;过多如何…...

Git远程操作与标签管理

目录 1.理解分布式版本控制系统 2.远程仓库 3.新建远程仓库 4.克隆远程仓库 5.向远程仓库推送 6.拉取远程仓库 7.配置Git 7.1.忽略特殊文件 7.2.给命令配置别名 8.标签管理 8.1.理解标签 8.2.创建标签 8.3.操作标签 1.理解分布式版本控制系统 Git是目前世界上…...

Element Plus消息通知体系深度解析:从基础到企业级实践

一、核心组件与技术定位 Element Plus的消息通知体系由三个核心组件构成&#xff1a;ElMessage&#xff08;全局提示&#xff09;、ElNotification&#xff08;通知弹窗&#xff09;和ElMessageBox&#xff08;交互式对话框&#xff09;。这套体系的设计目标是为开发者提供轻量…...

SpringCloud组件——Eureka

一.背景 1.问题提出 我们在一个父项目下写了两个子项目&#xff0c;需要两个子项目之间相互调用。我们可以发送HTTP请求来获取我们想要的资源&#xff0c;具体实现的方法有很多&#xff0c;可以用HttpURLConnection、HttpClient、Okhttp、 RestTemplate等。 举个例子&#x…...

[Godot] C#2D平台游戏基础移动和进阶跳跃代码

本文章给大家分享一下如何实现基本的移动和进阶的跳跃&#xff08;跳跃缓冲、可变跳跃、土狼时间&#xff09;以及相对应的重力代码&#xff0c;大家可以根据自己的需要自行修改 实现效果 场景搭建 因为Godot不像Unity&#xff0c;一个节点只能绑定一个脚本&#xff0c;所以我…...

C语言对n进制的处理

先看一道题目: 从键盘获取一个正整数,如果把它转为16进制的数字,那么它是一个几位数呢?如果把它转为28进制又是一个几位数呢? 在讲这个题目之前,我们先要了解进制转换 什么是进制转换&#xff1f; 简单来说&#xff0c;进制就是数位的表示方法。 十进制&#xff08;常用&am…...

rk3568main.cc解析

rk3568main.cc解析 前言解析总结前言 正点原子rk3568学习,rk官方RKNN_MODEL_ZOO文件中 rknn_model_zoo-main/examples/mobilenet/cpp/main.cc 从执行命令:./build-linux.sh -t rk3568 -a aarch64 -d mobilenet 到: cmake ../../examples/mobilenet/cpp \-DTARGET_SOC=rk3…...

【白雪讲堂】[特殊字符]内容战略地图|GEO优化框架下的内容全景布局

&#x1f4cd;内容战略地图&#xff5c;GEO优化框架下的内容全景布局 1️⃣ 顶层目标&#xff1a;GEO优化战略 目标关键词&#xff1a; 被AI理解&#xff08;AEO&#xff09; 被AI优先推荐&#xff08;GEO&#xff09; 在关键场景中被AI复读引用 2️⃣ 三大引擎逻辑&#x…...

S32K144学习(16)-Bootloader

1.什么是bootloader Bootloader&#xff08;引导加载程序&#xff09; 是存储在设备非易失性存储器&#xff08;如 ROM、Flash&#xff09;中的一段特殊程序&#xff0c;负责在设备上电后初始化硬件、加载操作系统&#xff08;OS&#xff09;或用户应用程序&#xff0c;并最终…...

反素数c++

先上代码 #include<bits/stdc.h> using namespace std; typedef long long ll; ll n; ll p[]{2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53}; int maxd,maxval; void dfs(int pl,ll tmp,int num,int up){ if((num>maxd)||(nummaxd&&maxval>tmp)){ …...

C++ linux打包运行方案(cmake)

文章目录 背景动态库打包方案动态库转静态库动态库打到软件包中 运行 背景 使用C编写的一个小项目&#xff0c;需要打包成ubuntu下的可执行文件&#xff0c;方便分发给其他ubuntu执行&#xff0c;因为docker镜像方案过于臃肿&#xff0c;所以需要把项目的动态库都打在软件包中…...

JavaScript 渲染内容爬取实践:Puppeteer 进阶技巧

进一步探讨如何使用 Puppeteer 进行动态网页爬取&#xff0c;特别是如何等待页面元素加载完成、处理无限滚动加载、单页应用的路由变化以及监听接口等常见场景。 一、等待页面元素加载完成 在爬取动态网页时&#xff0c;确保页面元素完全加载是获取完整数据的关键。Puppeteer…...

AI数字人:元宇宙舞台上的闪耀新星(7/10)

摘要&#xff1a;AI数字人作为元宇宙核心角色&#xff0c;提升交互体验&#xff0c;推动内容生产变革&#xff0c;助力产业数字化转型。其应用场景涵盖虚拟社交、智能客服、教育、商业营销等&#xff0c;面临技术瓶颈与行业规范缺失等挑战&#xff0c;未来有望突破技术限制&…...

测试基础笔记第九天

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、数据类型和约束1.数据类型2.约束3.主键4.不为空5.唯一6.默认值 二、数据库操作1.创建数据库2.使用数据库3.修改数据库4.删除数据库和查看所有数据库5.重点&…...

C++抽象基类定义与使用

在 C 中&#xff0c;抽象基类&#xff08;Abstract Base Class, ABC&#xff09; 是一种特殊的类&#xff0c;用于定义接口规范和约束派生类的行为。它通过纯虚函数&#xff08;Pure Virtual Function&#xff09;强制要求派生类实现特定功能&#xff0c;自身不能被实例化。以下…...

20.4 显示数据库数据

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的 20.4.1 设计时进行简单绑定 【例 20.22】【项目&#xff1a;code20-022】设计时关联数据库。 设计时设置DataGridView的DataSource属…...

PyTorch 多 GPU 入门:深入解析 nn.DataParallel 的工作原理与局限

当你发现单个 GPU 已经无法满足你训练庞大模型或处理海量数据的需求时&#xff0c;利用多 GPU 进行并行训练就成了自然的选择。PyTorch 提供了几种实现方式&#xff0c;其中 torch.nn.DataParallel (简称 DP) 因其使用的便捷性&#xff0c;常常是初学者接触多 GPU 训练的第一站…...

UDP协议理解

文章目录 UDP协议理解UDP 协议的特点&#xff1a;UDP协议图示UDP 的头部结构&#xff1a;UDP数据传输图示 UDP 的应用场景&#xff1a;TCP 与UDP对比UDP的传输丢包和顺序错乱问题&#xff08;了解&#xff09;丢包的解决方法&#xff1a;顺序错乱的解决方法&#xff1a;综合应用…...

微信小程序拖拽排序有效果图

效果图 .wxml <view class"container" style"--w:{{w}}px;" wx:if"{{location.length}}"><view class"container-item" wx:for"{{list}}" wx:key"index" data-index"{{index}}"style"--…...

算力网络的早期有关论文——自用笔记

2023年底至2024年初阅读有关论文的自用笔记&#xff0c;作为参考。 算力网络架构 https://baijiahao.baidu.com/s?id1727377583404975414&wfrspider&forpc think&note 是否可以和cpu进程调度联系。 目前&#xff1a;看一些综述深一步了解背景和发展现状,完善认…...

卷积神经网络基础(四)

今天我们继续学习各个激活函数层的实现过程。 目录 5.2 Sigmoid层 六、Affine/Softmax层实现 6.1 Affine层 6.2 批处理版本 5.2 Sigmoid层 sigmoid函数的表达式如下&#xff1a; 用计算图表示的话如下&#xff1a; 计算过程稍微有些复杂&#xff0c;且这里除了乘法和加法…...

【MySQL数据库】表的约束

目录 1&#xff0c;空属性 2&#xff0c;默认值 3&#xff0c;列描述 4&#xff0c;zerofill 5&#xff0c;主键primary key 6&#xff0c;自增长auto_increment 7&#xff0c;唯一键unique 8&#xff0c;外键foreign key 在MySQL中&#xff0c;表的约束是指用于插入的…...

网络威胁情报 | Friday Overtime Trooper

本文将分别从两个环境出发&#xff0c;以实践来体验利用威胁情报分析可疑文件的过程。 Friday Overtime 现在你是一位安全分析人员&#xff0c;正在美美等待周五过去&#xff0c;但就在即将下班之时意外发生了&#xff1a;你的客户发来求助&#xff0c;说他们发现了一些可疑文…...

GPIO(通用输入输出端口)详细介绍

一、基本概念 GPIO&#xff08;General - Purpose Input/Output&#xff09;即通用输入输出端口&#xff0c;是微控制器&#xff08;如 STM32 系列&#xff09;中非常重要的一个外设。它是一种软件可编程的引脚&#xff0c;用户能够通过编程来控制这些引脚的输入或输出状态。在…...