单片机-89C51部分:9、串行口通讯
飞书文档https://x509p6c8to.feishu.cn/wiki/WSh3wnADkixHspk7kc8c5esRnad
一、什么是串口?它的作用?
串行口,简称为串口,什么是串口?它的作用是什么?
两个人交流,一般通过在说话在空气中产生的声波传输,两台机器交流,我们可以模拟摩斯密码一样,其中一台机器通过IO发送对应频率高低电平的脉冲,另一台机器接收进行解析,但这种操作IO的方式需要我们考虑的问题很多,多快的频率,谁发谁收,丢失了一个脉冲怎么办等等,于是后面就有了规范这些交流的协议,简称为通讯协议,基于通讯方式的不同,也有了串行通讯和并行通讯两种通讯方式。
串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。
串行通信
串行通信是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。其只需要少数几条线就可以在系统间交换信息,特别适用于计算机与计算机,计算机与外设之间的远距离通信,先传输低位在传输高位。如下图所示:
并行通信
并行通信通常是将数据字节的各位用多条数据线同时进行传送,通常是8位,16位,32位等数据一起传输。如下图所示:
对比:
串行通信的特点:传输线少,长距离传送时成本低,且可以利用电话网等现成的设备,但数据的传送控制比并行通信复杂。
并行通信的特点:控制简单,传输速度快;由于传输线较多,长距离传送时成本高且接收方的各位同时接受存在困难,抗干扰能力差。
现阶段绝大部分的通讯口都使用串口。
二、串口的参数
串行通信的基本方式
单工通信:数据只能单方向传输。
半双工通信:通信双方交替进行双向数据传输,但两个方向的传输不能同时进行。
全双工通信:通信双方可同时进行数据收发的工作方式。51单片机的串行口是全双工传输方式。
串口电平标准
是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:
• TTL电平(transistor transistor logic ): +3V~+5V 表示 1 , 0V 表示 0
• RS232 电平: -3~-15V 表示 1 , +3~+15V 表示 0
• RS485 电平:两线压差 +2~+6V 表示 1 , -2~-6V 表示 0 (差分信号)
串口数据结构
一个完整的串行数据,也就是一个数据帧(Data frame),包括起始位、数据位、停止位、奇偶校验位。数据位前后即帧头和帧尾,包含一些必要的控制信息。其中,MSB(Most Significant Bit)是指低地址存放最高有效字节,LSB(Least Significant Bit)则是低地址存放最低有效字节。
- 20 - > 0x14 -> 0b0001 0100
- MSB: 0010 1000
- LSB: 0001 0100
串口波特率
通俗解析就是,波特率越高,传输速度越快。
常见的串口典型的“波特率”值是 300/1200/2400/9600/19200/38400/115200 /230400等。
串口通信速率,单位时间内传输二进制的位数(例波特率为9600,指1s内传输9600位,则传输一位需要1/9600=104.17us)
串口校验位
N 无校验
不加校验位,可以少传输一位数据
O 奇校验
a要传输的数据中(不包含校验位)有奇数个‘1’ 则校验位为‘0’, 反之为‘1’
例: 数据‘1111 000’ 偶数个‘1’ 所以添加校验位为‘1’ 整体为‘1111 0000 1’
E 偶校验
要传输的数据中(不包含校验位)有偶数个‘1’ 则校验位为‘0’, 反之为‘1’
M(Mark 标记、符合)检验位固定为1
S(Space 空间、空地)校验位固定为0
串口停止位
停止位,停止位是一帧数据结束的标志,可以是1bit、1.5bit或者2bit逻辑“1” 高电平
如果没有停止位,接收设备就无法知道何时一个数据包结束,从而无法正确地处理接收到的数据。
空闲位
空闲位不算是串口报文内的数据, 它是发送完一组报文后,总线会自动将电平拉高,产生1bit 逻辑“1”的空闲位
串口调试助手
https://alithon.com/downloads
主要使用CH340驱动软件和逻辑分析仪驱动软件,可以点击飞书文档链接下载
USB转串口助手:
| | |
逻辑分析仪:
| |
三、51的串口使用
硬件接线
串口相关寄存器:
一般常用的是SCON SBUF PCON IE,如果需要配置不同中断优先级的则需要配置IPH IP,SADEN、SADDR用于多机通讯,比较少用。
模式选择
STC89C52 有 1 个 UART, 有四种工作模式:
模式0:同步移位寄存器,主要用于扩展并行输入或输出口。
模式1:8位UART,波特率可变(常用)
模式2:9位UART,波特率固定(多出的1位为校验位)
模式3:9位UART,波特率可变(多出的1位为校验位)
这里简单说明下常用和其它的区别,常用的就是你使用串口功能时,一般使用模式1就能满足所有需求,像我工作这么久,做了非常多的项目,其它模式基本上没用过,所以学习时把常用的学会,原理搞懂就可以了,后面根据项目需求有目的性学习,而不是把所有细节都学一遍。
模式选择寄存器
SM0 = 0; |
模式1说明
发送数据相关寄存器配置
发送流程
SBUF 串口数据缓冲寄存器:可写入需要发送的数据
时钟源选择,影响波特率
Timer1 Overflow:定时器1溢出作为时钟源,用于串口通讯的波特率
查表法:
方式一: |
公式法:
如果需要设置波特率为9600=(1/32)*(11059000/12/(256-TH1))
SMOD:波特率加倍选择位,复位为0,可以不设置
方式一: |
校验位设置
TB8:校验位,在串口模式2、3作为校验位,模式1是8bit的,无需校验位
发送数据
发送字节函数:
#include <reg52.h>void UartInit() //9600bps@11.0592MHz
{SCON = 0x40; //0100 0000 串口工作模式1TMOD &= 0x0F; //清空TMOD中定时器1相关TMOD |= 0X20; //设置定时器1工作模式2:8位自动重载TH1 = 0xFD; //设定定时初值TL1 = 0XFD;TR1 = 1; //启动定时器1
}//主函数
void main()
{UartInit();//调用串口初始化函数SBUF=0x30;while(1){}
}
发送字符串函数:
这里还需要注意一个点是发送完成最后一位后,会置TI=1,所以我们可以用TI寄存器来判断是否发送完。
#include <reg52.h>void UartInit() //9600bps@11.0592MHz
{SCON = 0x40; //0100 0000 串口工作模式1TMOD &= 0x0F; //清空TMOD中定时器1相关TMOD |= 0X20; //设置定时器1工作模式2:8位自动重载TH1 = 0xFD; //设定定时初值TL1 = 0XFD;TR1 = 1; //启动定时器1
}void send_string(unsigned char str[])
{unsigned char i=0;while(str[i]!='\0')//判断是否到字符串尾{SBUF = str[i];while(TI==0); //等待发送完成,发送完成TI会置1TI=0; //下次发送前,要手动将TI置0i++; //下次发送}
}//主函数
void main()
{UartInit();//调用串口初始化函数send_string("hello world!!");while(1){}
}
串口接收数据相关寄存器配置
波特率设置
波特率部分和发送是一样,于是初始化函数就变为
void UartInit() //9600bps@11.0592MHz
{SCON = 0x40; //0101 0000 串口工作模式1TMOD &= 0x0F; //清空TMOD中定时器1相关TMOD |= 0X20; //设置定时器1工作模式2:8位自动重载TH1 = 0xFD; //设定定时初值TL1 = 0XFD;TR1 = 1; //启动定时器1
}
允许接收寄存器设置
REN 禁止/允许串口接收控制位,为1时,才能接收。
SM0 = 0; |
接收有效数据标志位
RI:接收有效数据标志位
串口中断
接收到有效数据时,会触发串口中断,这时候,我们开启串口中断相关的寄存器,就可以在中断服务函数中处理相关逻辑,不需要在大循环中一直判断啦。
#include <reg52.h>
sbit led=P2^7;//串口初始化函数
void UartInit() //9600bps@11.0592MHz
{SCON = 0x50; //0101 0000 串口工作模式1TMOD &= 0x0F; //清空TMOD中定时器1相关TMOD |= 0X20; //设置定时器1工作模式2:8位自动重载TH1 = 0xFD; //设定定时初值TL1 = 0XFD;TR1 = 1; //启动定时器1ES=1;//打开串行通信中断EA=1;//打开总中断
}
//串行中断函数
void Uart_receive() interrupt 4
{if(RI==1)//RI=1说明串口接收到了数据{ char receive;RI=0;//RI置0保证下次接收receive=SBUF;//将从串口接收到的数据报存到变量中//判断接收的数据,作出相应的操作if(receive=='O')led=0;if(receive=='C')led=1; }
}
//主函数
void main()
{UartInit();while(1){}
}
Printf发送数据
#include <reg52.h>
#include <stdio.h> void UartInit(void) //9600bps@11.0592MHz
{PCON &= 0x7F; //波特率不倍速SCON = 0x50; //8位数据,可变波特率TMOD &= 0x0F; //清除定时器1模式位TMOD |= 0x20; //设定定时器1为8位自动重装方式TL1 = 0xFD; //设定定时初值TH1 = 0xFD; //设定定时器重装值ET1 = 0; //禁止定时器1中断TR1 = 1; //启动定时器1
}/*
**重写printf调用的putchar函数,重定向到串口输出
**需要引入头文件<stdio.h>
*****/
char putchar(char dat){//输出重定向到串口SBUF = dat; //写入发送缓冲寄存器while(!TI); //等待发送完成,TI发送溢出标志位 置1TI = 0; //对溢出标志位清零return dat; //返回给函数的调用者printf
}//主函数
void main()
{UartInit();//调用串口初始化函数printf("hello\r\n");while(1){}
}
printf格式化输出
和c语言中的格式输出稍微一些不同
例如打印 unsigned char 类型的数据需要使用 %bd
unsigned char dat1 = 48;
printf("char-->%bd\r\n",dat1); //无符号字符型使用%bd显示十进制数
相关文章:
单片机-89C51部分:9、串行口通讯
飞书文档https://x509p6c8to.feishu.cn/wiki/WSh3wnADkixHspk7kc8c5esRnad 一、什么是串口?它的作用? 串行口,简称为串口,什么是串口?它的作用是什么? 两个人交流,一般通过在说话在空气中产生…...
C++程序退出时的对象析构陷阱:深度解析与避坑指南
C++程序退出时的对象析构陷阱:深度解析与避坑指南 一、从诡异案例说起:局部对象为何"神秘消失"?二、全局对象 vs 局部对象1. 全局对象生命周期2. 局部对象生命周期三、程序终止的两种姿势:exit() vs return四、atexit():最后的救命稻草1.基础用法2. 核心特性3…...
为什么 Vite 速度比 Webpack 快?
一、webpack会先进行编译,再运行,vite会直接启动,再按需编译文件。 首先看两张图,可以清晰的看到,上面的图是webpack编译过的,而下面的图是vite直接使用工程内文件。 二、区别于Webpack先打包的方式&am…...
指针变量存放在哪?
指针的存储位置取决于其声明方式和作用域,以下是详细分析: 1. 栈(Stack) 局部指针变量:在函数内部声明的指针(非静态),作为局部变量存储在栈中。void func() {int *p; // p本身存储…...
Kafka 消息可靠性深度解析:大流量与小流量场景下的设计哲学
在分布式消息系统的设计中,消息可靠性保障本质上是系统在一致性、可用性、吞吐量三者之间动态博弈的结果。Kafka作为现代流式架构的核心组件,其消息可靠性机制在不同流量场景下呈现出截然不同的设计哲学。本文将从系统设计原理层面,解构大流量…...
python数据分析(六):Pandas 多数据操作全面指南
Pandas 多数据操作全面指南:Merge, Join, Concatenate 与 Compare 1. 引言 在数据分析工作中,我们经常需要处理多个数据集并将它们以各种方式组合起来。Pandas 提供了多种强大的多数据操作方法,包括合并(merge)、连接(join)、连接(concaten…...
在K8S迁移节点kubelet数据存储目录
默认k8s节点kubelet数据目录在 /var/lib/kubelet,如果在部署前没有做好规划,其实默认就存储在系统盘/分区下了,这样会导致一个问题,如果数据量过大会导致kubelet服务异常,其次,系统盘下有一些系统服务引用&…...
k8s 学习记录 (六)_Pod 污点和容忍性详解
一、前言 在 Kubernetes 集群中,我们已经了解了节点亲和性和 Pod 亲和性,它们在 Pod 调度方面提供了很大的灵活性。今天,我们来探讨另外两个重要的概念 ——Pod 污点(Taints)和容忍性(Tolerations…...
hutools工具类中isNotEmpty与isNotBlank区分
基于以下两种情况。在判断的变量是String类型时, 判断是否为空,推荐使用isNotBlank(). 1. isNotEmpty 不会验证str中是否含有空字符串,而 isNotBlank方法会验证 public static boolean isNotEmpty(CharSequence str) {return false isEmpty…...
C#解析USB - HID手柄上摇杆按键数据
1. 了解相关知识 HID设备通信原理:HID设备通过端点报告其状态和数据,设备通过报告描述符来描述数据用途,操作系统通过这个描述符了解设备发送数据的结构。通常一个完整的报告以特定的格式从设备传输至主机。Windows API函数…...
k8s术语pod
Pod概览 理解Pod Pod是kubernetes中你可以创建和部署的最小也是最简的单位,pod代表着集群中运行的进程。 Pod中封装着应用的容器(有的情况下是好几个容器),存储、独立的网络IP,管理容器如何运行的策略选项。Pod代表着部署的一个单位:kubemetes中应用的一个实例,可能由一个…...
使用高德MCP+AI编程工具打造一个旅游小助手
开始之前,我们先来回顾一下,什么是mcp MCP(Model Context Protocol) 模型上下文协议是 2024 年 11 月由 Anthropic 公司推出并开源的一个新标准 核心内容 架构2:MCP 采用客户端 - 服务器架构。AI 应用程序(如聊天工具或 IDE&a…...
AgeTravel | 银发文娱旅游一周新鲜事
银发文娱旅游一周新鲜事 整理 | AgeClub吕娆炜 一周银发文娱旅游产业资讯速览 星期一 4月28日 1 企业动态 携程老友会联合喜悦盛年,首发“旅游兴趣课堂”模式 华寿中心“这YOUNG的老年派”合作聚焦老龄文化需求 通用技术康养Q1营收同比增长129% 2 行业风向…...
【记】Laya2.x数字末尾导致换行异常问题
文章目录 图示 图示...
jspm老年体检信息管理系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 信息化时代,各行各业都以网络为基础飞速发展,而医疗服务行业的发展却进展缓慢,传统的医疗服务行业已经逐渐不满足民众的需求,有些还在以线下预约的方式接待病人,特别是针对于老年体检的服务,是少之又…...
point-cloud-annotation-tool工具windows复现,史诗巨制(windows 11)
point-cloud-annotation-tool 前期准备1.安装Qt52.安装Cmake3.安装VS 20194.编译构建 VTK 8.15.安装 PCL 1.86.编译Boost 软件环境适配准备1 Boost2 VTK 开始编译开始生成 前期准备 point-cloud-annotation-tool是一款三维标注软件,本次介绍的是再windows11环境下安…...
欧拉计划 Project Euler60(素数对集合)题解
欧拉计划 Project Euler 60 题解 题干思路code 题干 思路 先欧拉筛预处理出素数,然后dfs,注意剪枝,不然太容易炸了 code //13 5197 5701 6733 8389 //26033 #include <bits/stdc.h>using namespace std;using ll long long;bool i…...
DeepSeek破界而来:重构大规模深度检索的算力与边界
深度检索技术革命:DeepSeek万亿参数框架如何突破实时召回率瓶颈 引言:当千亿参数遇见实时检索 在人工智能技术飞速发展的今天,超大规模语言模型已成为推动产业智能化的核心引擎。然而,随着模型参数量突破万亿级门槛,…...
自定义指令input中前面不能输入空格
vue3加el-input 封装自定义指令 utils/trim.ts import type { Directive, DirectiveBinding } from vue;const trim: Directive {mounted(el, binding: DirectiveBinding) {// 获取 el-input 的 DOM 节点const inputEl el.querySelector(input);if (!inputEl) {console.er…...
esp32将partitions.csv文件启用到工程项目中的配置
在ESP32项目里,partitions.csv 文件用于定义闪存的分区表,它规定了不同类型数据(如代码、文件系统、OTA 分区等)在闪存中的存储位置和大小。下面为你详细介绍如何将 partitions.csv 文件集成到工程项目中以及相应的配置步骤。 1.…...
Windows系统下,导入运行 RuoYi-Vue3 项目
基于SpringBootVue3前后端分离的Java快速开发框架 一、后端 1.git下载代码 RuoYi-Vue:RuoYi-Vue: 基于SpringBoot,Spring Security,JWT,Vue & Element 的前后端分离权限管理系统 git clone https://gitee.com/y_project/R…...
Spark 配置 YARN 模式
在大数据处理领域,Spark 是一个强大的分布式计算框架,而 YARN(Yet Another Resource Negotiator)则是 Hadoop 生态系统中出色的资源管理器。将 Spark 配置为 YARN 模式,可以充分利用 YARN 高效的资源管理和调度能力&am…...
【Linux学习笔记】进程替换和自定义shell
【Linux学习笔记】进程替换和自定义shell 🔥个人主页:大白的编程日记 🔥专栏:Linux学习笔记 文章目录 【Linux学习笔记】进程替换和自定义shell前言一.进程程序替换1.1 替换原理1.2 替换函数1.2.1函数解释1.2.2命名理解 二.自主…...
HarmonyOS运动开发:如何监听用户运动步数数据
前言 在开发运动类应用时,准确地监听和记录用户的运动步数是一项关键功能。HarmonyOS 提供了强大的传感器框架,使得开发者能够轻松地获取设备的运动数据。本文将深入探讨如何在 HarmonyOS 应用中实现步数监听功能,同时分享一些开发过程中的经验和技巧,帮助你更好地理解和实…...
Vuex状态管理及其持久化使用指南
1. 安装 Vuex Vue 2 或 Vue 3 项目: npm install vuex4 # Vuex 4 兼容 Vue 2 和 Vue 3 2. 创建 Store 新建 store/index.js: import { createStore } from vuex; import createPersistedState from vuex-persistedstate; // 持久化插件// 定义子模…...
k8s学习笔记
1查看默认命名空间pod kubectl get nodes 查看所有名空间的pod kubectl get pods -A 查看所有节点node kubectl get nodes 2根据配置文件,给集群创建资源 kubectl apply -f xxxx.yaml 3查看集群部署了哪些应用? kubectl get pods -A 4生成、删除、获取所…...
HarmonyOS ArkUI安全控件开发指南:粘贴、保存与位置控件的实现与隐私保护实践
目录 安全控件1. 粘贴控件1.1 约束与限制1.2 开发步骤 2. 保存控件2.1 约束与限制2.2 开发步骤 3. 位置控件3.1 约束与限制3.2 开发步骤 安全控件 安全控件是系统提供的一组系统实现的ArkUI组件,其中保存控件在用户首次使用时,会弹出通知弹窗࿰…...
前端在平常的开发中高度还原ui图的思考规范
问题原因 我们明明按照ui测量 为什么还会出现这么多样式偏差 根据我多次的验收反馈总结如下 使用组件库 不可能所以样式覆盖复制粘贴以前的代码 样式产生偏差有些样式是继承所得 难免疏漏图片等背景问题 或者切图问题padding等结尾问题 解决方案 组件库穿透 主要样式复制粘…...
Python 数据智能实战 (2):LLM 工具箱搭建 - API/库实操与高效 Prompt 设计入门
写在前面 —— 工欲善其事,必先利其器:连接你的 Python 与 LLM 大脑,掌握“对话”的艺术 本篇博客,我们将聚焦于“工欲善其事,必先利其器”这一核心环节,带你完成以下关键任务: 选择你的 LLM “接入点”: 了解访问 LLM 的主要方式 (云 API vs. 本地模型),并为入门选…...
即时设计笔记
1. 编辑形状 1.1 连接两个锚点 如图,形状编辑模式下,想将下面图形变成闭合形状 使用【钢笔工具】选中其中一锚点,会自动伸出一条线,然后再点击另一个锚点即可 【注意】,形状闭合后,会发现无法填充颜色&am…...
“云大物智移”背景下,五年制高职计算机类高水平专业群建设方案
在信息技术革命的浪潮中,云计算、大数据、物联网、人工智能和移动互联网(简称“云大物智移”)已成为推动全球经济和社会数字化转型的关键力量。这些技术不仅重塑了产业格局,也给职业教育带来了前所未有的挑战与机遇。随着“云大物…...
docker desktop汉化
关闭Docker Desktop 在Docker安装目录找到app.asar文件并将其备份,防止出现意外。 Windows下默认为C:\Program Files\Docker\Docker\frontend\resourcesMacos下默认为/Applications/Docker.app/Contents/MacOS/Docker Desktop.app/Contents/ResourcesUbuntu/Debian…...
KUKA机器人快速启动设置
KUKA机器人在首次开机启动时,有时在示教器上需要进行投入运行等相关的设置。如以下相关的信息需要处理: 1、机器人系统开机后,选择T1运行模式;2、显示提示信息:“RDC 存储器和控制系统不一致什么被更换了”时…...
【Java学习】Java的CGLIB动态代理:通俗解释与使用指南
应友友的要求,本章是对于Java的CGLIB动态代理进行一个通俗的解释,希望能够帮助到奋斗的你,一起加油!!! 🌟 通俗理解CGLIB动态代理 想象你有一个玩具机器人(原始类)&…...
Python3 基础语法
编码 默认情况下,Python3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。 当然你也可以为源码文件指定不同的编码: # -*- coding: cp-1252 -*- 上述定义允许在源文件中使用 Windows-1252 字符集中的字符编码,对应适合…...
基于Lucene的多场景检索系统开发指南
基于Lucene的多场景检索系统开发指南 官网 https://lucene.apache.org/ 一、项目构建配置 (pom.xml) <dependencies><!-- Lucene核心库 --><dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-core</artifactId&g…...
SDC命令详解:使用get_nets命令进行查询
相关阅读 SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm1001.2014.3001.5482 get_nets命令用于创建一个线网对象集合,关于设计对象和集合的更详细介绍,可以参考下面的博客。需要注意的是,在有些工具中还存…...
MATLAB长方体磁体3D磁力线生成
代码说明: 磁体参数设置:对磁体的尺寸、磁化强度以及真空磁导率进行定义。计算网格生成:构建一个 3D 网格,同时排除磁体内部的点。磁场计算:采用等效面磁荷法来计算每个网格点的磁场。可视化: 绘制磁体的框…...
东土科技NewPre系列智能控制器的创新之旅
物流行业,作为支撑现代供应链的核心环节,正在面临效率瓶颈、人工成本上升、设备协同难等多重挑战。如何实现从自动化向智能化的转型,成为行业亟须解决的关键问题。东土科技基于NewPre3102智能控制器打造的工业AI智能机器人控制系统࿰…...
2025年燃气从业人员考试题库及答案
一、单选题 83.城镇燃气输配管道严密性试验稳压的持续时间应为24h,每小时记录不应少于1次,当修正压力降小于_____Pa为合格。() A.100 B.133 C.150 D.200 答案:B 84.室外钢管敷设描述错误的是_____。(…...
小结: 接口类型和路由优先级
网络接口类型 1. Bridge-if(桥接接口) 作用:用于桥接网络,将多个接口或VLAN连接为一个广播域,实现二层数据转发。 常用指令: interface bridge-if <number> bridge <bridge-id> # 将接口加入…...
【XR空间传送】深入理解Unity中 XR Interaction Toolkit 的 MatchOrientation 用法与使用场景(空间传送、视角切换)
一、前言 在 Unity 进行 VR/AR 开发,尤其是在展示、环境体验、导览交互等场景中,“传送(Teleport)”是一项非常核心的操作。它不仅决定了玩家的位置,还直接影响玩家的站姿、视角与空间感知。 在 Unity 官方提供的 XR…...
PPT/WORD如何实现Shift键加鼠标滚轮实现左右滑动
方法:使用【AutoHotKey】软件 1. 什么是AutoHotKey? AutoHotKey (AHK),是一款类似于按键精灵的软件,用于自动化控制键盘和鼠标,提高工作效率。 官网下载:https://www.autohotkey.com/ 2. 需求背景 在编…...
C++函数模板基础
1 函数模板 1.1 基础介绍 函数模板是一种特殊的函数定义,它允许你创建通用的函数,这些函数可以处理多种不同的数据类型,而不需要为每种数据类型都编写一个单独的函数。 在 C++ 里,函数模板的格式包含模板声明与函数定义两部分,其基本格式如下: template <typename…...
Java实现使用EasyExcel按模板导出文件
需求:导出excel文件要求头部标题内容过于复杂,在代码层面不好实现,直接提供模板,只需要将数据写入即可。 一、代码实现示例 实现数据写入模板代码如下: public void export(HttpServletResponse response) throws E…...
【AI】OrinNX上安装RIVA-2.19.0,实现文本转语音
1、注册NGC账户 1)登录官网注册, https://ngc.nvidia.com/signin 2)生成key 3)拷贝生成的key到文本中,下面会使用 2、安装NGC工具 目前最新版本为3.64.2 1)下载 wget --content-disposition https://api.ngc.nvidia.com/v2/resources/nvidia/ngc-apps/ngc_cli/vers…...
Ansible安装配置
一、前提 服务器操作系统均为centos7.9 主机ipmaster(Ansible管理端)172.25.192.2node1172.25.192.10node2172.25.192.3 更新/etc/hosts文件 二、安装 master节点: 1. 安装epel源 yum install -y epel-release 2. 安装Ansible yum install -y ansible A…...
认识Linux基本操作、命令
目录 一、了解一下用户目录、linux根目录 二、常见的linux命令 (1)目录切换 cd【与windows通用】 (2) 查看文件列 ls (3)打开文件权限-chmod ux *.sh (4)查看当前所在路径 pwd…...
Android学习总结之Bitmap篇
一、质量压缩(面试高频:原理与适用场景) 1. 核心原理(面试官必问) 质量压缩针对有损压缩格式(如 JPEG),通过丢弃图像中人类视觉不敏感的高频信息(如色彩过渡细节&#…...
MySQL--数据引擎详解
存储引擎 MySQL体系结构 连接层: 主要接收客户端的连接,然后完成一些链接的处理,以及认证授权的相关操作和安全方案,还要去检查是否超过最大连接数等等,比如在连接MySQL服务器时需要输入用户名,密码&#…...