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

【单片机】12-串口通信和RS485

1.通信有关的常见概念

区分:串口,COM口,UART,USART_usart和串口区别-CSDN博客

串口、COM口、UART口, TTL、RS-232、RS-485区别详解-CSDN博客

1.什么是通信

(1)人和人之间的通信:说话,写信

(2)人和计算机之间的通信:按键,显示器,鼠标

(3)计算机和计算机之间的通信

2.通信的关键

(1)事先约定

(2)基本的信息单元

(3)有效信息的编码,传输和解码

3.通信的专业性概念

(1)同步和异步:同一个步调

(2)单工,半双工,全双工:数据传输方向

(3)并行和串口:并行(多根线),串行(单根线)

(4)电平信号【传输近,易受干扰】和差分信号【传输远,不易受干扰】:电平是通过高低电平进行区分,差分是相对的

2.串行通信

1.串口通信基础

(1)一种特定的通信协议【电平通信】

(2)串行通信,串口通信,UART,USART

(3)串口通信的特点:异步,串行,全双工

2.串行通信的主要用途

(1)早期:计算机之间短距离通信(1.5米内),完备通信机制

(2)现在:CPU之间近距离通信【CPU和周边芯片】,调试信息输入输出非完备通信

3.串行通信的工作方式

(1)3根线(GND,RxD【接收线】,TxD【发送线】---recive ,transmit)---不完备通信

或者9根线(DB9)-完备通信

(2)发送方有发送位移寄存器,接收方有接收移位寄存器

(3)数据在发送方和接收方的CPU中都以字节为单位整字节处理

(4)数据在通信线上以位为单位逐个bit的传输

4.串行通信的主要概念

传输都是一帧一帧的发

1.起始位

开始之前要发送一个起始位

2.数据位

比如我们传输“A”,转换为ASCII就是8位二进制,这8位就叫做8位数据位【有效数据】

数据位要双方沟通确定的

3.奇偶校验位

判断传输过程中是否出错

4.停止位(帧)

判断是否结束

5.波特率

串行通信的速度

一秒钟传输多少给bit位,发送方和接收方必须波特率设置为一样【波特率越小,传输速度慢,抗干扰能力越强】

6.流控

速率协商,现在一般要禁用掉

3.51单片机的串行通信

1.基础概念

SoC:把CPU以及其他功能集成到一个芯片上

(1)串行通信功能是SoC的一个(内部)外设提供的,与CPU无关【CPU=运算器+控制器】--CPU本身无法通信

(2)各种不同的SoC的串行通信大同小异【内部差不多,编程时候可能不同】

(3)串行通信经常作为主控SoC与其他外部芯片之间的通信接口【串行通信==SoC与外部其他芯片的通信】

2.STC51单片机的串行通信简介

4.STC51的串行通信相关寄存器

1.总体浏览

2.SCON:串行控制寄存器

3.SBUF:串行口缓存寄存器

4.PCON:电源控制寄存器

5.IE:中断允许寄存器

6.串口发送时的软硬件协作方式

(1)查询方式。硬盘在发送完一帧数据后会将一个标志位置位(标志位本来是0),软件需要不断读取这个标志位的值来判断硬件是否完成了发送(如果读出来的是0就表示硬件还在发还在发还没完还在忙,所以我们就不能认为硬件发完了,所以就不能给硬件安排下一帧数据的发送;如果读出来的是1则说明硬件已经发完了上一帧数据,这时候软件就应该给硬件在给一帧数据去发送)

(2)因为串口发送完这个事件对CPU来说是个异步事件(因为不知道什么时候发送消息),所以这里查询方式来处理和之前讲过的查询方式处理按键是非常类似的。

(3)常见情况下:串口发送会使用查询方式,串口接收会使用中断方式【因为不知道什么时候会接收到信息,使用中断才不会过度销毁CPU】

7.波特率加倍

PCON中的SMOD

所谓波特率加倍,就是正常计算出的波特率假设是2400,那么SMOD=1时则实际波特率就是4800;当SMOD=0时不加倍,也就是2400还是2400

5.STC51的串行通信实战

1.硬件接线分析

(1)目标:将PC机和51单片机通过串口连接起来

(2)PC机的串口情况:台式机串口,笔记本USB转串口

(3)开发板原理图分析

2.接线方案

1.使用板载CH340

什么都不用动,默认就是使用这个,最简单最省事,最推荐

2.使用DB9接口USB转串口线

用DB9接口的USB转串口线

注意:跳线帽接到DB9一侧

3.使用TTL接口USB转串口线

只接三根线:TxD,RxD,GND

4.总结

3.使用板载CH340进行串口实践

1.接线+下载程序

2.查看设备管理器确定COM号

3.方法一:使用普中下载软件自带的串口助手监视

4.方法二:使用第三方串口助手软件监视

5.方法三:使用SecureCRT软件监视

4.使用DB9接口USB转串口线

1.接线+下载程序

2.注意对下载程序的影响

此时无法进行程序下载

3.使用各种方式进行监视

5.串口初始化

//串口初始化函数
//预设一个串口条件:8位数据位,1停止位,0校验位,波特率4800
//初始化的主要工作就是去设置相关的寄存器
void uart_init(void){SCON=0x50; //串口工作在模式1(8位串口),允许接收PCON=0x80;   //波特率加倍,意思是本来需要波特率4800,等一下计算时按照2400去计算就好}

6.波特率计算

SMOD---》判断是否进行波特率加倍【如果加倍则为1,不加倍则为0】

 查看数据手册中”串行通信中波特率的设置“

接着查看定时/计数器1的工作方式2的寄存器设置情况

TMOD=0x20;  //设置T1为模式2

TR1=1;        //开启T1让它开始工作

我们刚刚在上面计算出TH1=243;,所以进行设置

TH1=243;
TL1=243;   //8位自动重装,意思就是TH1用完了下一个周期TL1会自动重装到TH1中

 




7.串口发送字符【单个字符】

注意点:51单片机不一样,要先发送在检验有没有在发送

其他MCU都是先检验在发送

如果为【0】则表示在忙,如果为【1】则表示发送结束

//串口发送函数,发送一个字节
void uart_send_byte(unsigned char c){//【第一步】发送一个字节SBUF=c;//【第二步】先确认串口发送部分没有在忙while(!TI);//TI=0,表示在忙//【第三步】软件复位TI标志位---数据手册要求的TI=0;
}

8.测试一下

1.波特率不加倍

#include<reg51.h>//函数声明
void uart_init(void);
void uart_send_byte(unsigned char c);
void delay();void main(){//第一步:初始化好串口到正确的状态uart_init();while(1){//为了调试方便,让A循环发送,才好监视//第二步:通过串口发送信息出去uart_send_byte('A');delay();}}void delay(){unsigned char i,j;for(i=0;i<100;i++){for(j=0;j<200;j++);}
}//串口初始化函数
//预设一个串口条件:8位数据位,1停止位,0校验位,波特率4800
//初始化的主要工作就是去设置相关的寄存器
void uart_init(void){//波特率不加倍的例子SCON=0x50; //串口工作在模式1(8位串口),允许接收PCON=0x00;   //波特率不加倍//通信波特率相关的设置//此处我们使用【方式1】---对应数据手册TMOD=0x20;  //设置T1为模式2TR1=1;	//开启T1让它开始工作TH1=249;TL1=249;    //8位自动重装,意思就是TH1用完了下一个周期TL1会自动重装到TH1中//中断初始化ES=1;//串口中断初始化EA=1;//整个中断初始化}//串口发送函数,发送一个字节
void uart_send_byte(unsigned char c){//【第一步】发送一个字节SBUF=c;//【第二步】先确认串口发送部分没有在忙while(!TI);//TI=0,表示在忙//【第三步】软件复位TI标志位---数据手册要求的TI=0;
}

因为我们算出来的TH1和TL1=6.5,所以精确度可能会受到影响,我们将其设置为250 或者 249则结果都会输出乱码

2.换一个波特率:9600

我们前面算出TH1=6.5【这里我们的波特率为4800】,所以如果为9600则我们应该将【6.5/2=3.25】才是我们9600的结果


//波特率为9600SCON=0x50; //串口工作在模式1(8位串口),允许接收PCON=0x00;   //波特率不加倍//通信波特率相关的设置//此处我们使用【方式1】---对应数据手册TMOD=0x20;  //设置T1为模式2TR1=1;	//开启T1让它开始工作TH1=253;TL1=253;    //8位自动重装,意思就是TH1用完了下一个周期TL1会自动重装到TH1中//中断初始化ES=1;//串口中断初始化EA=1;//整个中断初始化

9.串口发送字符串【多个字符】

#include<reg51.h>//函数声明
void uart_init(void);
void uart_send_byte(unsigned char c);
void delay();
void uart_send_string(unsigned char *str);void main(){//第一步:初始化好串口到正确的状态uart_init();while(1){//发送字符串,也可以发送中文uart_send_string("abcdefg");delay();}}void delay(){unsigned char i,j;for(i=0;i<100;i++){for(j=0;j<200;j++);}
}//串口初始化函数
//预设一个串口条件:8位数据位,1停止位,0校验位,波特率4800
//初始化的主要工作就是去设置相关的寄存器
void uart_init(void){//波特率加倍的例子SCON=0x50; //串口工作在模式1(8位串口),允许接收PCON=0x80;   //波特率加倍,意思是本来需要波特率4800,等一下计算时按照2400去计算就好//通信波特率相关的设置//此处我们使用【方式1】---对应数据手册TMOD=0x20;  //设置T1为模式2TR1=1;	//开启T1让它开始工作TH1=243;TL1=243;    //8位自动重装,意思就是TH1用完了下一个周期TL1会自动重装到TH1中//中断初始化ES=1;//串口中断初始化EA=1;//整个中断初始化}//串口发送函数,发送一个字节【单个字节】
void uart_send_byte(unsigned char c){//【第一步】发送一个字节SBUF=c;//【第二步】先确认串口发送部分没有在忙while(!TI);//TI=0,表示在忙//【第三步】软件复位TI标志位---数据手册要求的TI=0;
}//发送字符串【多个字符】
void uart_send_string(unsigned char *str)
{while (*str != '\0'){uart_send_byte(*str);		// 发送1个字符str++;						// 指针指向下一个字符}
}

10.串口接收函数编写

因为我们在程序执行过程中如果要接收PC机传输过来的数据,则表示程序要进行中断,则要进行中断处理。

void uart_isr(void) interrupt 4 using 1{
}

#include<reg51.h>//函数声明
void uart_init(void);
void uart_send_byte(unsigned char c);
void delay();
void uart_send_string(unsigned char *str);void main(){//第一步:初始化好串口到正确的状态uart_init();uart_send_string("串口回环测试\n");while(1);
}void delay(){unsigned char i,j;for(i=0;i<100;i++){for(j=0;j<200;j++);}
}//串口初始化函数
//预设一个串口条件:8位数据位,1停止位,0校验位,波特率4800
//初始化的主要工作就是去设置相关的寄存器
void uart_init(void){//波特率加倍的例子SCON=0x50; //串口工作在模式1(8位串口),允许接收PCON=0x80;   //波特率加倍,意思是本来需要波特率4800,等一下计算时按照2400去计算就好//通信波特率相关的设置//此处我们使用【方式1】---对应数据手册TMOD=0x20;  //设置T1为模式2TR1=1;	//开启T1让它开始工作TH1=243;TL1=243;    //8位自动重装,意思就是TH1用完了下一个周期TL1会自动重装到TH1中//中断初始化ES=1;//串口中断初始化EA=1;//整个中断初始化}//串口发送函数,发送一个字节【单个字节】
void uart_send_byte(unsigned char c){//【第一步】发送一个字节SBUF=c;//【第二步】先确认串口发送部分没有在忙while(!TI);//TI=0,表示在忙//【第三步】软件复位TI标志位---数据手册要求的TI=0;
}//发送字符串【多个字符】
void uart_send_string(unsigned char *str)
{while (*str != '\0'){uart_send_byte(*str);		// 发送1个字符str++;						// 指针指向下一个字符}
}//中断处理程序
void uart_isr(void) interrupt 4 using 1
{unsigned char tmp;if(RI){tmp=SBUF;   //读取SBUF,其实就是读出串口接收到的1个字节//RI:串行口1接收中断标志RI=0;}//自此已经读到了PC发给单片机的一个字节,但是单片机没有显示器无法显示//我们用最简单的方法,就是直接回发uart_send_byte(tmp);
}

6.RS485

1.UART的缺点:传输距离受限

(1)理论上RS232不超过15米--电脑的COM端口【DB9】

(2)理论上TTL电平通信距离更短---TTL是在单片机上使用

(3)实际上几百米也有人宣称做到了,但是稳定性不能保证

(4)波特率越高通信距离越短【速度越快,通信距离越短】

2.远距离传输

(1)提高电压标准

(2)提高通信线抗干扰能力,降低阻抗

(3)使用差分信号--抗干扰能力强【RS485/RS422】

3.RS485(RS422)

(1)最大通信距离1200多米,最快通信速率10Mbps,距离和速度成反比(USB接口,网线)

(2)差分信号负逻辑【5V代表---0     -3V代表----1】

(3)更远距离可以加中继器【中继器---多个485的节点连接起来--放大】

(4)半双工【如果要实现全双工,则使用4根线】

(5)RS485只提高物理层通信能力,不提供数据层协议,需要用户自定义,或者使用标准协议如MODBUS协议。

4.MAX485

MAX485就是相当于UART与RS485之间的信号转换

(1)CPU本身只会提供URAT接口,而不会提供RS485接口。CPU根本不认识RS485

(2)RS485使用场景:CPUA-->UART转RS485------>远距离通信----->RS485转UART---->CPUB

(3)对RS485的理解:RS485是纯硬件实现的,硬件芯片如MAX485来管理的,根本不涉及软件编程。软件工程师只关注串口,只通过串口将数据发送出去或者接收回来即可。UART转485和485转UART对CPU来说是透明的。

相关文章:

【单片机】12-串口通信和RS485

1.通信有关的常见概念 区分&#xff1a;串口&#xff0c;COM口&#xff0c;UART&#xff0c;USART_usart和串口区别-CSDN博客 串口、COM口、UART口, TTL、RS-232、RS-485区别详解-CSDN博客 1.什么是通信 &#xff08;1&#xff09;人和人之间的通信&#xff1a;说话&#xff…...

一步步教你使用GDB调试程序:从入门到精通的全面指南

文章目录 Step1&#xff1a;安装GDB1.1、包管理器安装1.2、下载源码编译安装 Step2&#xff1a;编译程序时添加调试信息Step3&#xff1a;GDB启动、退出、查看代码Step4&#xff1a;GDB断点操作Step5&#xff1a;GDB调试操作5.1 单步调试5.2 多进程调试 调试是软件开发中非常重…...

OpenCV读取图像时按照BGR的顺序HWC排列,PyTorch按照RGB的顺序CHW排列

OpenCV读取RGB图像 在OpenCV中&#xff0c;读取的图片默认是HWC格式&#xff0c;即按照高度、宽度和通道数的顺序排列图像尺寸的格式。我们看最后一个维度是C&#xff0c;因此最小颗粒度是C。 例如&#xff0c;一张形状为2562563的RGB图像&#xff0c;在OpenCV中读取后的格式…...

基于安卓android微信小程序的校园维修平台

项目介绍 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用java语言技术和mysql数据库来完成对系统的设计。整…...

mysql面试题16:说说分库与分表的设计?常用的分库分表中间件有哪些?分库分表可能遇到的问题有哪些?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:说说分库与分表的设计? 在MySQL中,分库与分表是常用的数据库水平扩展技术,可以提高数据库的吞吐量和扩展性。下面将具体讲解MySQL中分库与分表…...

AlexNet网络复现

1. 引言 在现代计算机视觉领域&#xff0c;深度学习已经成为了一个核心技术&#xff0c;其影响力远超过了传统的图像处理方法。但深度学习&#xff0c;特别是卷积神经网络&#xff08;CNN&#xff09;在计算机视觉的主导地位并不是从一开始就有的。在2012年之前&#xff0c;计…...

pytorch模型量化和移植安卓详细教程

十一下雨,在家撸模型,希望对pytorch模型进行轻量化,间断摸索了几天,效果不错,做个总结分享出来。 量化是一种常见的技术,人们使用它来使模型在推断时运行更快,具有更低的内存占用和更低的功耗,而无需更改模型架构。在这篇博客文章中,我们将简要介绍量化是什么以及如何…...

C++(List)

本节目标&#xff1a; 1.list介绍及使用 2.list深度剖析及模拟实现 3.list和vector对比 1.list介绍及使用 1.1list介绍 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list的底层是双向链表结构&#xff0c;…...

分布式架构篇

1、微服务 微服务架构风格&#xff0c;就像是把一个单独的应用程序开发为一套小服务&#xff0c;每个服务运行在自己的进程中&#xff0c;并使用轻量级机制通信&#xff0c;通常是 HTTP API。这些服务围绕业务能力来构建&#xff0c;并通过完全自动化部署机制来独立部署。这些…...

ros编译报错-- Could NOT find ros_ethercat_eml (missing: ros_ethercat_eml_DIR)

– Could NOT find ros_ethercat_eml (missing: ros_ethercat_eml_DIR) – Could not find the required component ‘ros_ethercat_eml’. The following CMake error indicates that you either need to install the package with the same name or change your environment …...

VD6283TX环境光传感器驱动开发(3)----测试闪烁频率代码

VD6283TX环境光传感器驱动开发----3.测试闪烁频率代码 概述视频教学样品申请源码下载参考代码开发板设置测试结果 概述 ST提供了6283A1_AnalogFlicker代码在X-NUCLEO-6283A1获取闪烁频率&#xff0c;同时移植到VD6283TX-SATEL。 闪烁频率提取主要用于检测光源的闪烁频率&#…...

透明度和透明贴图制作玻璃水杯

1、什么是透明度 模型透明度是指一个物体或模型在呈现时的透明程度。它决定了物体在渲染时&#xff0c;是否显示其后面的物体或背景。 在图形渲染中&#xff0c;透明度通常以0到1之间的值表示。值为0表示完全透明&#xff0c;即物体不可见&#xff0c;背景或其他物体完全穿透…...

【前后缀技巧】2022牛客多校3 A

登录—专业IT笔试面试备考平台_牛客网 题意&#xff1a; 思路&#xff1a; 这种是典中典中典&#xff0c;对于gcd&#xff0c;背包问题都是一样的处理方式 预处理出前缀lca和后缀lca&#xff0c;枚举哪个消失即可&#xff0c;可以统计方案数 Code&#xff1a; #include &l…...

Ae 效果:CC Page Turn

扭曲/CC Page Turn Distort/CC Page Turn CC Page Turn &#xff08;CC 翻页&#xff09;主要用于模拟书页翻动的效果。通过使用该效果&#xff0c;用户可以创建出像书页或杂志页面翻动的视觉效果&#xff0c;增强影片的交互性和视觉吸引力。 ◆ ◆ ◆ 效果属性说明 Contro…...

【数据仓库设计基础(四)】数据仓库实施步骤

文章目录 1&#xff0e;定义范围2&#xff0e;确定需求3&#xff0e;逻辑设计1&#xff09;建立需要的数据列表2&#xff09;识别数据源3&#xff09;制作实体关系图 4&#xff0e;物理设计1&#xff09;性能优化2&#xff09;数仓的拓展性 5&#xff0e;装载数据6&#xff0e;…...

GridSearchCV 工具介绍

目录 1、定义 2、工作流程 3、示例代码 4、总结 1、定义 GridSearchCV 是一个用于超参数调优的工具&#xff0c;它在给定的参数网格中执行交叉验证&#xff0c;以确定最佳的参数组合。通过穷举搜索&#xff08;exhaustive search&#xff09;来寻找最佳参数&#xff0c;即…...

基于 SSM 框架的旅游文化管理平台

本系统采用基于JAVA语言实现、架构模式选择B/S架构&#xff0c;Tomcat7.0及以上作为运行服务器支持&#xff0c;基于JAVA等主要技术和框架设计&#xff0c;idea作为开发环境&#xff0c;数据库采用MYSQL5.7以上。 开发环境&#xff1a; JDK版本&#xff1a;JDK1.8 服务器&…...

chatgpt技术总结(包括transformer,注意力机制,迁移学习,Ray,TensorFlow,Pytorch)

最近研读了一些技术大咖对chatgpt的技术研讨&#xff0c;结合自己的一些浅见&#xff0c;进行些许探讨。 我们惊讶的发现&#xff0c;chatgpt所使用的技术并没有惊天地泣鬼神的创新&#xff0c;它只是将过去的技术潜能结合现在的硬件最大化的发挥出来&#xff0c;也正因如此&am…...

vertx的学习总结4

一、异步数据和事件流 1.为什么流是事件之上的一个有用的抽象&#xff1f; 2.什么是背压&#xff0c;为什么它是异步生产者和消费者的基础&#xff1f; 3.如何从流解析协议数据&#xff1f; 1. 答&#xff1a;因为它能够将连续的事件序列化并按照顺序进行处理。通过将事件…...

SpringBoot心旅售票管理系统

本心旅售票管理系统采用基于JAVA语言实现、架构模式选择B/S架构&#xff0c;Tomcat7.0及以上作为运行服务器支持&#xff0c;基于JAVA、springboot、vue等主要技术和框架设计&#xff0c;idea作为开发环境&#xff0c;数据库采用MYSQL5.7以上。 采用技术: SpringBootVueMySQL...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...