单片机学习笔记---串口通信(1)

目录

通信的基本概念

通信的方式

1.按照数据传送的方式,可分为串行通信和并行通信。

1.1串行通信

1.2并行通信

2.按照通信的数据同步方式,又可以分为异步通信和同步通信。

2.1 异步通信

2.2同步通信

3.按照数据的传输方向,又可以分为单工通信,半双工通信,还有全双工通信。

3.1单工通信

3.2半双工通信

3.3全双工通信

4.总线

通信速率

串口通信简介  

串口通信

串口

接口标准和接口种类

接口标准

接口种类

常见通信接口

接口上的引脚定义

逻辑电平

串口数据收发线:交叉连接

通信协议


通信的基本概念

随着单片机的系统的广泛应用和计算机网络的技术普及,单片机的通信功能越来越重要。 像在WiFi、蓝牙、GPS、GSM和GPRS这些应用当中,充分体现了串口通信的重要性。 学习51单片机的重点难点,主要体现在51的中断、定时计数器、以及串口通信这些功能。中断、定时计数器再前四节已经搞定,本节就来学习一下串口通信。

下面我们就来看一下串口通信相关的一些基本概念。 我们知道51单片机不仅可以实现串口通信还可以通过IO口模拟实现多种其他的一些通信,比如SPI,IIC等等,学习这些通信前,我们就很有必要了解一下通信的一些基本概念。

通信的方式

可以分为很多种:

按照数据传送的方式,可分为串行通信和并行通信。

按照通信的数据同步方式又可以分为异步通信和同步通信。 按照数据的传输方向,又可以分为单工通信,半双工通信,还有全双工通信。

下面就逐个来介绍。

1.按照数据传送的方式,可分为串行通信和并行通信。

1.1串行通信

在串行通信当中,是指使用一条数据线将数据一位一位的一次进行传输,每一位数据占据固定的时间长度。只需要很少的几条线就可以在系统之间进行数据交换,特别适用于计算机与计算机,计算机与外部设备的远距离的传输,这样,可以大大的节约成本,因为它只需要很少的线。

那像在数据传输过程当中,它的数据是依靠一根线来进行一位一位的传输,它优先传输低位(D0),最后在传输高位(D7),字节的数据就通过8次传输到接收设备当中。

串行通信它有一个特点就是传输线很少,从这张图当中也可以看到,它只需要一根线,对于长距离传输的这些应用,它的成本是非常低的。 可以利用电话线,或者是一些网线这些现成的设备来进行传输,但是传输的控制,以及稳定性就相对来说要复杂一些。 因为你这个数据要在一条数据线上面进行传输,你需要对它的数据进行处理,一位的一位的发送,那相比于并行通信来说,相对来说要复杂一点。

1.2并行通信

那我们再来看一下并行通信。

它通常是将这个数据的字节的各个位(一个字节为8位)按照多条数据线同时进行传输,通常是有8位,16位,32位的数据一起传输。

那像我们这张图当中,要传输一个字节的数据,那这里就有8根并行线接到接收设备,一个字节就是通过每一根线传输一位,总共就8位,一次性传输过去。

这种通信方式的特点,是控制简单,传输速度快。一个字节一下就传过去了,不需要一位一位的传。

我们前面的串行通信是一个字节分8次,一次一位的传输,而我们并行通信是8位同时传输,这样的速度,比串行通信肯定是更快的。

但是如果说由于这个传输线比较多,那对于长距离传输的一些应用就增加了比较大的成本。

比如说我们在长距离传输的时候,如果使用串行通信的时候,它只要一根数据线,而这个并行通信,它需要8根,所以成本相对于串行通信来说比较高的。并且,我们长距离传输的时候,接收方的各位同时接收存在困难,所以它的抗干扰能力,就要差一些。

2.按照通信的数据同步方式又可以分为异步通信和同步通信。

2.1 异步通信

异步通信:通信双方各自约定通信速率

异步通信是指通信的发送和接收设备使用各自的时钟控制数据的发送和接收过程,为了使双方收发协调,要求发送的设备和接收的设备的时钟尽可能一致。

这是什么意思?因为它们要使用各自的时钟来控制它的数据发送和接收,如果说你们这两个设备发送设备和接收设备的时钟都不相同的话,那么它接收的数据也可能是错的或者是乱的,所以在异步通信的过程当中,要求发送设备和接收设备它的时钟尽可能要一致。

异步通信是以字符为单位进行传输的,字符与字符之间的间隙是任意的。但每个字符中的个位是以固定的时间传输,也就是说字符之间的间隔时间或者说间隙是任意的。

但是,它字符之间不一定有位间隔的整数倍关系,但是同一个字符内的各个位之间的间隙是位间隔的整数倍关系。

我们来看一下,对于异步通信来说,字符帧的格式是这样的。

有起始位,然后紧接着跟着八个数据位,它也有校验位和停止位,这是一帧一帧的字符数据,总共是11个,也就是说字符帧通常含有11个位。

异步通信的特点是不要求收发双方的时钟严格一致,实现容易。

比如说我们发送设备的时钟的频率假设是11.0592,那这个接收设备不是说一定要按照11.0592兆,它可以有一定的有误差范围,这样对于我们接收设备来说,实现这么大的时钟就比较容易一点,而不是精确,设备开销也较小,因为它采用的是一位一位的进行传输,但每个字符之间要附加2~3个位,用来作为起始、校验,停止这些位。 各帧与各帧之间因为有了间隔,所以它的传出效率不是很高。

因为我们可以看到这张图,在每一个字符与字符之间,这个间隔时间是不同的。因为有了这个间隔,所以在传输数据的时候,它的效率就不是很高。

2.2同步通信

同步通信:通信双方靠一根时钟线来约定通信速率

同步通信是要建立发送方时钟对接收方时钟直接的控制,从这张图当中我们可以看到,比如说我们这里计算机甲是发送方,计算机乙是接收方,那么发送方的时钟是直接控制接收方的,所以,让我们这双方的时钟完全相同,也就是同步这就是同步通信此时,传输数据的位之间的距离是位间隔的整数倍。

同时传输的字符间是不留间隙的,也就保持了这个同步的关系。

发送方对接收方的同步可以通过两种方式来实现,像这像下面这两张图。

一种是外同步,一种是自同步。

外同步是通过发送方的时钟来控制接收方的时钟,这就可以达到外同步。

然后,自同步的话是通过发送方控制发送的数据和时钟实现自同步。

通俗来讲,外同步就是时钟线传输时钟信号,数据线传输数据信号。自同步就是一条线上同时传输了时钟和数据信号。

异步和同步的概念,可以说同步就像两人打电话,异步就是发短信。这种同步通信我们用的不是很多,主要是异步通信那一块,像串口通信,它就是异步的通信。

3.按照数据的传输方向,又可以分为单工通信,半双工通信,还有全双工通信。

3.1单工通信

单工通信是指数据传输仅按照方向来进行传输,它不能实现反向的传输

从这张图当中我们也可以看得到,发送方是按照发送方到接收方的这个数据传输方向,不能实现反方向的传输,所以,它是单工的通信。

3.2半双工通信

半双工的通信是数据传输可以按照两个方向进行传输,一个是发送,一个是接收但它是需要进行分时才能进行发送和接收,那从这张图我们也可以看到。

假如在时间1这个点是处于发送的状态,就是从发送设备到接收设备传输数据,如果在时间2的时候,要接收数据,那从接收设备来发送数据到我们的发送设备,从而接收。所以,在发送和接收这一块,它的时间点是不一样的,也就进行了分时进行传输。

3.3全双工通信

全双工的通信是指数据可以同时进行两个方向的传输

比如说我们从这张图当中可以看到,它可以既可以作为发送,又可以作为接收,可以同时进行。

补充:

4.总线

总线就是连接各个设备的数据传输线路(类似于一条马路,把路边各住户连接起来,使住户可以相互交流)

通信速率

下面我们来介绍概念:通信速率。

衡量通信性能的重要指标参数就是这个通信的速率,通常也叫比特率。 比特率是每秒钟传输二进制代码的位数,它的单位是位/秒。 比如说我们每秒钟传输240个字符。按照前面的格式,字符它包含起始位、停止位,然后中间有八个数据位,假如没有校验位的话,那么1字符的一帧数据含有10个位,那比特率是多少?结果是2400bps。

  在后面我们还会遇到一个概念,就是波特率。 通常我们接触比较多的是波特率,我们可以把它看成是比特率。

波特率表示每秒钟传输了多少个码元(串口通信的速率(发送和接收各数据位的间隔时间))。而比特率是每秒钟传输二进制代码的位数。 这个码元是通信信号调试的概念,通信中常用的时间间隔相同的符号表示二进制的数字,这样的信号称为码元。

第一种情况:比如常见通信中用0V表示数字0,5V表示数字1,每个码元可以表示两种状态,0和1,所以一个码元也就等于一个二进制的比特位此时,波特率的大小跟比特率的大小是一致的

第二种情况:如果在通信传输过程当中,用0V,2V,4V,6V等等来表示二进制的话,那表示0V就是00,2V是01,4V是10,6V是11,每个码元可以表示四种状态,也就是两个二进制的比特位,00 01 10 11,就是用两个比特位来表示一个码元所以码元是二进制的比特位的一半,这个时候的波特率就是比特率的一半

我们常见的通信当中,码元是表示两种状态,也就是0和1,跟我们的二进制位是一样的。所以,我们也可以把波特率看成是比特率。在我们常见的通信当中,基本上是这样的,所以我们在通信应用当中,我们通常也叫波特率,很少听到比特率这种叫法。大家要知道它们的区别。

串口通信简介  

接下来我们来看一下51单片机的串口的介绍,首先我们来看一下串口通信的简介。

串口通信

是指外设和计算机间通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。

串口

是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。

单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力。

51单片机内部自带UART(Universal Asynchronous Receiver Transmitter,通用异步收发器),可实现单片机的串口通信。

串口是一种接口标准。它规定了接口的电器标准,没有规定接口插件的电缆以及使用的协议,它规定的是接口标准,厂家必须按照这个接口标准来做串口的标准接口。

所以,在我们的串口设备当中,通常会见到它的这个接口,比如我们下面这张图当中的DB9或者是DB25的这种标准接口。

不过我们现在应用比较多的是这种DB9的孔。

接口标准和接口种类

接口标准

下面我们来看一下接口标准。

串口通信的结构标准有很多:RS232C、RS232、RS422A、RS485等等,常用的是这种RS232和RS485。

RS232其实就是在RS232C的基础上的改进版本,它的原理是一样的,那所以这里我们就以RS232C这个接口进行讲解。

RS232C是美国电子工业协会在1969年修订的RS232C的标准,定义了数据终端设备与数据通信设备之间的物理接口标准,规定了使用25帧的连接器,我们简称DB25。 连接器的尺寸以及每个插针的排列位置,都有明确的定义,这个就是DB25的接口标准的图。

这个针脚的排序在途中已经标出来了,第一行从左1号开始到13号,第二行从左往右是14~25号。

现在还有一种九针的RS232C非标准连接接口,我们通常也称为DB9。

我们都见到的大多数设备是使用DB9的这种接口,DB25和DB9这种接口的接头有公头和母头之分,其中带针状的是公头,带孔状的这个接头是母头,下面这张图我们可以看到。

公头和母头它的管脚顺序是不一样的,从这张图当中我们可以看得到排序方式正好是相反的。所以,自己在做这个封装图的时候,要注意你的设备是使用公头还是母头。这种接口现在多见于台式电脑。

接口种类

其实现在还有一种常见的接口,叫做VGA接口。VGA接口共有15针,分成3排,每排5个孔,显卡上应用最为广泛的接口类型。VGA接口是传输视频的,英文名叫做Video Graphics Array视频图形阵列和DB9(用来传输数据的)外观长得有点像,但是完全不同的接口,不要搞混了。

现在笔记本电脑大部分都是USB接口

左边插USB,右边就是串口线路,就可以和单片机连接

我们开发板上的这个位置就是USB和串口之间电平的相互转换,转换之后就可以在电脑上使用串口这样的功能了。

然后电脑端也就是STC那个软件上有一个东西叫串口助手来帮助我们收发数据显示。

常见通信接口

在这里总结一下常见通信接口,相互比较一下:

PS:

UART:通用异步收发器串口;异步串口。

可挂载多个设备特点的接口都可以称为总线:

IIC一般都读作 I方C总线

SPI总线

1-Wire读作one-wire(单总线)

CAN总线一般应用在汽车领域(把很多连在一起的传感器用CAN总线挂起来,用差分信号传输,传输距离很远,稳定性也很好)同步的通信方式一般都带有一个时钟线SCL/SCLK,异步的通信方式一般都不带时钟线。

下面分别介绍表格中的几种通信接口:

51单片机的UART:

STC89C52有1个UART

STC89C52的UART有四种工作模式:

模式0:同步移位寄存器

模式1:8位UART,波特率可变(常用)

模式2:9位UART,波特率固定

模式3:9位UART,波特率可变

接口上的引脚定义

接口上的脚都有明确的定义,我们来看一下。

下面这张图是RS-232C接口标准的引脚定义。

图中带括号的是DB9的脚位,而没有带括号的是DB25的脚位。 这么多脚是不是所有的脚位都用上了?在串口通信当中,我们通常一般只会用到三个脚,哪三个脚?串行发送和接收肯定是必不可少的,2脚和3脚都会用到,然后还有GND,也就是信号地脚(5脚)。

所以通常我们在串口通信当中应用的比较多的三个脚就是2、3、5,也就是TXD、RXD和GND。

尤其是GND,如果由于在做串口通信的时候,它只顾发送和接收这两个脚位的连接,忽略了GND直接会导致通信两设备之间没有共地,通信可能就会出现错误,所以在串口通信当中一定要记住设备之间要进行共地,也就是要连接这个GND 5脚。

逻辑电平

在RS-232C标准当中,它对逻辑电平也进行了规定。

比如,在TXD和RXD数据线上面,

逻辑1电平范围是-3~15V的电压范围。 逻辑0的话,它是3V到15V的电压。

这个跟我们前面学习单片机的高电平1是5V,0是0V是不一样的。

我们单片机通常是TTL的电平,所以我们在使用51单片机的时候,要将TTL电平跟RS-232的电平进行转换的话,它需要转换的东西,就是MAX232电平转换芯片。

因为我们的串口通信是RS232的电平,而我们单片机的串口电平是TTL的电平,所以通过MAX232这个芯片可以将RS232电平跟TTL的电平进行转换,这样就可以实现通信了。

电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:

TTL电平:+5V表示1,0V表示0(单片机走的电平)

RS232电平:-3~-15V表示1,+3~+15V表示0(比如DB9接口走的电平)

以上两种电平的传输距离也才十多米。

RS485电平:两线压差(两根线之间的电压差)+2~+6V表示1,-2~-6V表示0(差分信号)

RS485电平能传一千米以上。

串口数据收发线:交叉连接

在串口通信当中,我们还要注意的一点是串口数据收发线要进行交叉的连接。 何为交叉连接?

是指在发送方和接收方发送方的TXD(Transmit exchange data)要连接接收方的接收管脚RXD,我发送的数据才能到达接收设备的接收引脚。

同样的,我们发送方的接收引脚要连接接收方的发送引脚。发送数据就直接传到我们的接收设备当中。

这就是交叉的连接。

还有一点就是要注意:两个设备之间要进行共GND。

简单双向串口通信有两根通信线(发送端TXD和接收端RXD)

TXD与RXD要交叉连接

当只需单向的数据传输时,可以直接一根通信线

当电平标准不一致时,需要加电平转换芯片

PS:VCC是供电的(电源的供电电压),如果设备1和设备2都有独立电源的话,可以不接VCC,如果比如说设备2是一个模块的话,它不会独立供电,那么设备1需要向设备2供电,也就是接个VCC。VCC和GND其实就是电源的正负极,通信就是中间两根线。

通信协议

在前面我们介绍了,RS-232C没有规定协议的标准,但是通常我们做串口通信的时候是按照96-N-8-1的格式。

这个96是代表我们的通信波特率是9600BPS,也就是每秒钟传输的二进制的位数9600 bps。因为通常使用的是异步串口通信,也就是说没有时钟线,两个设备要进行通信的话,必须要保持一致的波特率当然波特率不一定必须要9600,也可以是4800,还可以是115200。当然51单片机它也跑不到这么高,我们是只举例子。比如我们发送方使用的是9600,我们在写程序的时候,接收方的波特率也必须是9600。保持波动率是一致的。

然后这个N代表的是无校验位,由于在串口通信当中,相对更容易受到外部的干扰,导致传输数据出现偏差,可以在传输过程当中加上这个校验位来解决这个问题。

校验方法有奇校验,还有偶校验,以及0校验(也是无校验)。

通常我们在串口通信当中用的比较多的是无校验,也就是N。 然后,

这个8是指传输的数据位,通常是8位,也就是一个字节。在数据格式前面,我们介绍过异步通信有有5位,也有6位、7位,当然我们用的比较多的是8位,也正好对应我们一个字节。   

然后这个1代表的是停止位,串口通信的数据包从起始信号开始直到停止信号结束,数据包的起始信号是由逻辑电平0这个数据位表示,数据包停止位信号可以是0.511.52两个逻辑1的数据位表示只要双方约定一致就可以了。

我们通常使用的是一个停止位,所以,通常的这个协议标准我们是按照这个96-N-8-1的这种格式。其中96,我们通常可以更改它的波动率,后面的几种我们通常是按照N-8-1。

没讲完下一篇继续.....

单片机学习笔记---串口通信(2)-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C#(C Sharp)学习笔记_If条件判断语句【五】

前言: 本期学习的是编程语言中的主要语句:if-条件判断语句。在这里我们会学到:if语法,if-else,和if嵌套。话不多说,我们开始吧! 什么是条件判断语句? 条件语句是用来判断给定的条件…

数据库学习案例20240206-ORACLE NEW RAC agent and resource关系汇总。

1 集群架构图 整体集群架构图如下: 1 数据库启动顺序OHASD层面 操作系统进程init.ohasd run启动ohasd.bin init.ohasd run 集群自动启动是否被禁用 crsctl enable has/crsGIHOME所在文件系统是否被正常挂载。管道文件npohasd是否能够被访问, cd /var/t…

Android14音频进阶:MediaPlayerService如何启动AudioTrack 下篇(五十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…

AttributeError: module ‘PIL.Image‘ has no attribute ‘ANTIALIAS‘

因为PIL版本升级 # image image.resize((int(image.size[0] * (64 / image.size[1])), 64), Image.ANTIALIAS).convert(L) image image.resize((int(image.size[0] * (64 / image.size[1])), 64), Image.LANCZOS).convert(L)

Vue源码系列讲解——变化侦测篇【下】(Array的变化侦测)

目录 1. 前言 2. 在哪里收集依赖 3. 使Array型数据可观测 3.1 思路分析 3.2 数组方法拦截器 3.3 使用拦截器 4. 再谈依赖收集 4.1 把依赖收集到哪里 4.2 如何收集依赖 4.3 如何通知依赖 5. 深度侦测 6. 数组新增元素的侦测 7. 不足之处 8. 总结 1. 前言 上一篇文…

Unity类银河恶魔城学习记录3-4 EnemyBattleState P50

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Enemy.cs using System.Collections; using System.Collections.Generic; …

【RT-DETR有效改进】计算训练好权重文件对应的FPS、推理每张图片的平均时间(科研必备)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本文给大家带来的改进机制是利用我们训练好的权重文件计算FPS,同时打印每张图片所利用的平均时间,模型大小(以MB为单位),同时支持batch_size功能的选择,对于轻量化模型的读者来说,本文的内容对你一定有…

网络基础(三)

网络层与数据链路层 1.网络层2.IP2.1 基本概念2.2 协议头格式2.3 网段划分2.4 特殊的IP地址2.5IP地址的数量限制2.6 私有IP地址和公网IP地址2.7 路由 3.数据链路层4.以太网(MAC帧协议)4.1 认识以太网4.2 以太网帧格式4.3 认识MAC地址4.4 对比理解MAC地址…

【Unity游戏设计】跳一跳Day1

一、创建场景 Assets/Secnes:GameAssets创建游戏资源Prefabs存放预制体,Scripts脚本,Sounds声音,Textures图片资源,Materiais材质资源分类存放意识 二、场景建模 注意:alt鼠标左键切换视角 视角与摄像机视角保持一致:Main CameraGameObjectAlign Vie…

RabbitMQ-4.MQ的可靠性

MQ的可靠性 4.MQ的可靠性4.1.数据持久化4.1.1.交换机持久化4.1.2.队列持久化4.1.3.消息持久化 4.2.LazyQueue4.2.1.控制台配置Lazy模式4.2.2.代码配置Lazy模式4.2.3.更新已有队列为lazy模式 4.MQ的可靠性 消息到达MQ以后,如果MQ不能及时保存,也会导致消…

Asp .Net Core 集成 NLog

简介 NLog是一个基于.NET平台编写的日志记录类库,它可以在应用程序中添加跟踪调试代码,以便在开发、测试和生产环境中对程序进行监控和故障排除。NLog具有简单、灵活和易于配置的特点,支持在任何一种.NET语言中输出带有上下文的调试诊断信息…

相机图像质量研究(3)图像质量测试介绍

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…

用python编写爬虫,爬取房产信息

题目 报告要求 工程报告链接放在这里 https://download.csdn.net/download/Samature/88816284使用 1.安装jupyter notebook 2.用jupyter notebook打开工程里的ipynb文件,再run all就行 注意事项 可能遇到的bug 暂无,有的话私信我

Kafka 生产调优

Kafka生产调优 文章目录 Kafka生产调优一、Kafka 硬件配置选择场景说明服务器台数选择磁盘选择内存选择CPU选择 二、Kafka Broker调优Broker 核心参数配置服役新节点/退役旧节点增加副本因子调整分区副本存储 三、Kafka 生产者调优生产者如何提高吞吐量数据可靠性数据去重数据乱…

智慧城市:打造低碳未来,引领城市数字化转型新篇章

在“万物皆可数字化”的新时代浪潮下,智慧城市作为未来城市发展的先锋方向,正在以前所未有的速度和规模重塑我们的城市面貌。 智慧城市不仅是一个技术革新的标志,更是城市治理、民生服务等领域全面升级的重要引擎。 一、智慧城市的多元应用领…

Bootstrap5 导航组件和面包屑

Bootstrap5 导航组件和面包屑 Bootstrap5 提供了一种简单快捷的方法来创建基本导航,它提供了非常灵活和优雅的选项卡和Pills等组件。 Bootstrap5 的所有导航组件,包括选项卡和Pills,都通过基本的 .nav 类共享相同的基本标记和样式。 使用 B…

2024Node.js零基础教程(小白友好型),nodejs新手到高手,(六)NodeJS入门——http模块

047_http模块_获取请求行和请求头 hello,大家好,那第二节我们来介绍一下如何在这个服务当中来提取 HTT 请求报文的相关内容。首先先说一下关于报文的提取的方法,我在这个文档当中都已经记录好了,方便大家后续做一个快速的查阅。 …

springboot集成easypoi导出多sheet页

pom文件 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.1.0</version> </dependency> 导出模板&#xff1a; 后端代码示例&#xff1a; /*** 导出加油卡进便利店大额审批列…

洛谷_P1464 Function_python写法

目录 1.错误解法 2.学习记忆化搜索算法 2.1简介 2.2案例学习 3.解法 4.总结 1.错误解法 a 0 b 0 c 0 def w(a,b,c):if a<0 or b<0 or c<0:return 1elif a>20 or b>20 or c>20:return w(20,20,20)elif a<b and b<c:return w(a-1,b,c) w(a-1,…

Python程序员面试题精选及解析(2)

本文精心挑选了10道Python程序员面试题&#xff0c;覆盖了Python的多个核心领域&#xff0c;包括装饰器、lambda函数、列表推导式、生成器、全局解释器锁(GIL)、单例模式以及上下文管理器等。每道题都附有简洁的代码示例&#xff0c;帮助读者更好地理解和应用相关知识点无论是对…