培训销售网站建设/关键词大全
学习使用的开发板:STC89C52RC/LE52RC
编程软件:Keil5
烧录软件:stc-isp
开发板实图:
文章目录
- 串口
- 硬件电路
- UART
- 串口相关寄存器
- 编码
- 单片机通过串口发送数据
- 电脑通过串口发送数据控制LED灯
串口
- 串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信
- 单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力
51单片机内部自带UART
(Universal Asynchronous Receiver Transmitter,通用异步收发器
),可实现单片机的串口通信
硬件电路
简单双向串口通信有两根通信线(发送端TXD
(Transmit Exchange Data)和接收端RXD
(Receive Exchange Date))
TXD和RXD要交叉连接
,设备1的TXD连接设备2的RXD,设备1的RXD连接设备2的TXD
当只要单向传输数据时,可以只有一根通信线
GND是一定要连接的,若两个设备都可以各自供电,则不需要连接VCC
当电平标准
不一致时,还需要加电平转换芯片
电平标准
电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:
- TTL电平:+5V表示1,0V表示0,一般用于单片机
- RS232电平:-3 ~ -15V 表示1,+3 ~ +15V 表示0,一般用于电脑
- RS485电平:两线压差 +2 ~ +6V 表示1,-2 ~ -6V 表示0(差分信号),一般用于CAN总线
前两个通信距离都较近,一般只有十几米,距离过远传输的数据就很容易出错;而RS485
通信距离远,信号可靠性高,传输距离可达1KM以上
相关术语
- 全双工:通信双方可以在同一时刻互相传输数据
- 半双工:通信双方可以互相传输数据,但同时间只能有一段发送,另一端接收,必须分时复用一根数据线
- 单工:通信双方只能一方发送到另一方,不能反向传输。比如遥控器控制电视,只能遥控器向电视发送数据
- 异步:通信双方各自约定通信速率
- 同步:通信双方靠一根时钟线来约定通信速率
数据传输是依靠高低电平的,也就是电平协议。比如如下两个数据
看电平都是从高电平变为低电平,但是如果通信速率不一样,则获取的数据不一样
通信速率快,10可能会被解析为1100;通信速率慢,1100也可能会被解析为10。
所以约定好通信速率很重要
- 总线:连接各个设备的数据传输线路(类似一条马路,把路边的住户连接起来,使住户可以相互交流)
常见通信接口比较
- UART:为本节学习的串口通信接口
- I2C:板子上的
C24C02
使用该串口 - SPI:板子上的
DS1302
使用非标准SPI - 1-Wire:板子上的
DS18B20
使用该串口
常见的还有CAN总线
和USB
,CAN总线常用于汽车领域
UART
51单片机的UART
STC89C52有1个UART,RXD和TXD分别和P3.0和P3.1这两个I/O口共用同一个引脚
STC89C52的UART有四种工作模式:
模式0:同步移位寄存器
模式1:8位UART,波特率可变(常用)
模式2:9位UART,波特率固定
模式3:9位UART,波特率可变
串口参数及时序图
波特率
:串口通信的速率(发送和接收各数据位的间隔时间)- 校验位:用于数据验证,一定程序可以知道数据是否错误,也需要双方提前协商统一校验。常用的校验如01校验,奇偶校验。
9位UART就是多了一位校验位
- 停止位:用于数据帧间隔,发送多个数据,如何间隔两个数据,就使用停止位
波特率就是上述异步双方要约定好的如何对数据进行采样
串口收发数据,都是从低位开始
串口模式图
简单的串口模式图
UART是集成在单片机内部的,通过TXD引脚发送数据,RXD引脚接收数据
UART可以分为三个部分,中间为定时器T1
——控制波特率;左侧绿框的SBUF
用于收发数据;右侧为中断系统
SBUF:串口数据缓存寄存器,物理上是两个独立的寄存器,但占用相同的地址。写操作时,写入的是发送寄存器,读操作时,读出的是接收寄存器
完整的串口和中断系统模式图如下:
下面通过介绍相关寄存器来讲述串口通信的原理
串口相关寄存器
串行口控制寄存器SCON和PCON
STC89C52系列单片机的串行口设有两个控制寄存器:串行控制寄存器SCON和波特率选择特殊功能寄存器PCON
PCON
电源控制寄存器,可能是电源控制还有剩下比特位,所以波特率选择和帧错误控制位也集成其中,减少资源消耗
格式如下:
我们只要关注SMOD
和 SMOD0
即可
- SMOD:
波特率选择位
。当软件置SMOD = 1时,使串行通信方式1、2、3的波特率加倍;SMOD = 0,则不加倍。复位时SMOD = 0 - SMOD0:
帧错误检测有效控制位
。当SMOD = 1,SCON寄存器中的SM0/FE
位于 FE(帧错误检测)功能;当SMOD0 = 0,SCON的SM0/FE
用于 和SM1
组合指定串行口的工作模式。复位时 SMOD0 = 0
SCON
用于选择串行通信的工作方式和某些控制功能,格式如下:
- SM0/FE:当PCON寄存器的
SMOD0/FE
= 1时,该位用于帧错误检测。当检测到一个无效停止位时,通过UART接收器设置该位,必须由软件清零;当SMOD0/FE
= 0,该位和SM1
组合指定工作模式
-
REN:
允许/禁止串行接收控制位
。由软件置位,若REN = 1即允许串行接收数据;REN = 0则禁止接收 -
SM2:
允许方式2或方式3多机通信控制位
。 -
TB8:
在方式2或方式3,为要发送的第9位数据
,按需要由软件置位或清0。可用作数据的校验位或多机通信中表示地址帧/数据帧的标志位。 -
RB8:
在方式2或方式3,是接收到的第9位数据
。在方式1,若SM2=0,则RB8是接收到的停止位。方式0不用RB8。 -
TI:
发送中断请求标志位
。在方式0,当串行发送数据第8位结束时,由内部硬件置TI = 1,向主机请求中断,响应中断后必须用软件复位,即TI = 0。在其他方式中,则在停止位开始发送时由内部硬件置位,必须用软件复位TI = 0
-
RI:
接收中断请求标志位
。在方式0,当串行接收到第8位结束时由内部硬件自动置位 RI = 1 ,向主机请求中断,响应中断后必须用软件复位,即RI=0。在其他方式中,串行接收到停止位的中间时刻由内部硬件置位,即RI=1,必须由软件复位,即RI=0
IE
中断允许寄存器
其中我们只关注EA
和 ES
- EA:CPU的总中断允许控制位,EA = 1,CPU开放中断;EA = 0,CPU屏蔽所有中断请求
- ES:串行口中断允许位,ES = 1,允许串行口中断;ES = 0,禁止串行口中断
注意:
接收中断和发送中断共用一个中断,在中断处理函数中还需要通过RI
和 TI
的置位判断本次中断是接收中断还是发送中断
最后我们回归模式图,讲解一下串口通信的流程
发送数据
通过总线将数据写入SBUF
,定时器1控制波特率。通过TXD发送数据,当发送数据结束时(方式0为发完8位数据,其他方式为发送停止位时),将 TI = 1,发送中断请求
接收数据
RXD接收数据,通过定时器1控制波特率,对接收数据进行采样,存放在SBUF
,当接收数据结束(方式0当串行发送数据第8位结束时,在其他方式中,则在停止位开始发送时由内部硬件置位),将 RI = 1,发出中断请求
注意
:TI
和 RI
都需要由软件置0
编码
经过上述学习,我们已经对串口有了一定的了解,接下来就是实现串口通信
单片机通过串口发送数据
我们使用UART串口通信,首先要进行初始化,如:选择工作方式,初始化中断系统,设置波特率,初始化定时器
选择工作模式
涉及到SCON
和 PCON
首先是PCON的SMOD0
,当 SMOD0 = 0 时,SMOD 的 SM0 才会被用来选择工作方式
其次,我们选择 8位UART,波特率可变模式,即方式1,SCON的SM0 = 0,SM1 = 1
最后,如果要允许串口接收数据,还需要置SCON的REN = 1
初始化中断系统
首先,初始化串口收发数据的中断请求标志位,SCON的 TI
和 RI
,由硬件置1,我们初始化时清零即可:TI = 0, RI = 0
到此,SCON的设置就结束了
总结一下,SM0 = 0, SM1 = 1, REN = 1/0, TI = 0, RI = 0,其他默认为0即可,所以SCON = 0x40/0x50
然后是中断开关
ES = 1, EA = 1
SCON = 0x50; //选择工作方式 & 允许串口接收数据
PCON |= 0x80; //使SM0为选择工作方式
//中断开关
ES = 1; //串口中断开关
EA = 1; //总中断开关
初始化定时器
初始化定时器可参看【51单片机】定时器
此处定时器1选择工作模式2——8位自动重装
8位自动重装
一次只对TL1或TH1计数加一
当一个溢出后,直接使用另一个计数单元的初值
//设置定时器1
TMOD &= 0x0F; //高4位清零
TMOD |= 0x20; //0010,模式3——8位自动重载
TR1 = 1; //启用定时器T1
ET1 = 0; //禁止定时器T1中断
//定时器初值
TL1 = 0xF3; //设定定时初值
TH1 = 0xF3; //设定定时器重装值
设置波特率
我们设置波特率为4800
设置波特率需要通过设置定时器1的初始值
TL1 = 0xF3; //设定定时初值
TH1 = 0xF3; //设定定时器重装值
讲解一下为什么定时器初值是这个
假设系统频率为12MHz,使用12T模式,则定时器频率为12 / 12 = 1MHz,即每1us,计数单元加1。
使用8位自动重装,256时会溢出,0xF3 = 243,256 - 243 = 13。所以定时器溢出需要13us
溢出率:1 / 13 = 0.07692
使用SMOD = 1,波特率加倍(不除2)
还需要 0.07692 / 16 = 0.0048076923MHz
转化为Hz:4807.6923Hz,这个就是波特率
会存在一定误差
也可参看如下计算
到此,串口的初始化就完成了
完整代码如下:
/*** @brief 初始化串口* @parm 无* @retval 无*/
void UART_Init()
{//SCON高4位分别为SM0、SM1、SM2、REN//SM0和SM1控制串口模式,选择01——8位UART,波特率可变//REN接收使能,REN = 0禁止接收,REN = 1允许接收//所以设置0101 0000SCON = 0x50;//PCON包含波特率和电源设置//前两位为SMOD和SMOD0//SMOD = 1波特率加倍,SMOD = 0,波特率不加倍//SMOD0是帧错误的,此处不用//所以设置1000 0000PCON |= 0x80;//设置定时器1TMOD &= 0x0F; //高4位清零TMOD |= 0x20; //0010,模式3——8位自动重载TR1 = 1; //启用定时器T1ET1 = 0; //禁止定时器T1中断 //定时器初值TL1 = 0xF4; //设定定时初值TH1 = 0xF4; //设定定时器重装值//中断开关ES = 1; //串口中断开关EA = 1; //总中断开关
}
博主的单片机系统频率为11.0592MHz
可以使用STC-ICP
生成波特率设置代码
注意:
配置一定要选择正确;代码中的AUXR寄存器
为高版本单片机才有的,低版本不认识这个寄存器,可以直接删掉
串口发送数据通过赋值SBUF
,数据发送完后,硬件置位TI = 1
,需要我们手动对TI清零
代码如下:
/*** @brief 通过串口发送一个字节数据* @parm Byte:要发送字节数据* @retval 无*/
void UART_SendByte(unsigned char Byte)
{SBUF = Byte;while(TI == 0);//数据发送完,硬件置1TI = 0; //软件置0
}
模块化编程,完整代码如下:
延时模块——控制串口发送数据速率
Delay.h
#ifndef __DELAY_H__
#define __DELAT_H__void Delayms(unsigned int xms);//等待指定毫秒#endif
Delay.c
#include <INTRINS.h>
/*** @brief 延迟一定时间* @parm 延迟的时间,单位是毫秒,范围:0 ~ 65535* @retval 无*/
void Delayms(unsigned int xms) //@11.0592MHz
{while(xms--){unsigned char i, j;_nop_();i = 2;j = 199;do{while (--j);} while (--i);}
}
UART串口模块
UART.h
#ifndef __UART_H__
#define __UART_H__void UART_Init();
void UART_SendByte(unsigned char Byte);#endif
UART.c
#include <REGX52.H>
/*** @brief 初始化串口* @parm 无* @retval 无*/
void UART_Init()
{//SCON高4位分别为SM0、SM1、SM2、REN//SM0和SM1控制串口模式,选择01——8位UART,波特率可变//REN接收使能,REN = 0禁止接收,REN = 1允许接收//所以设置0101 0000SCON = 0x50;//PCON包含波特率和电源设置//前两位为SMOD和SMOD0//SMOD = 1波特率加倍,SMOD = 0,波特率不加倍//SMOD0是帧错误的,此处不用//所以设置1000 0000PCON |= 0x80;//设置定时器1TMOD &= 0x0F; //高4位清零TMOD |= 0x20; //0010,模式3——8位自动重载TR1 = 1; //启用定时器T1ET1 = 0; //禁止定时器T1中断 //定时器初值TL1 = 0xF4; //设定定时初值TH1 = 0xF4; //设定定时器重装值//中断开关ES = 1; //串口中断开关EA = 1; //总中断开关
}
/*** @brief 通过串口发送一个字节数据* @parm Byte 要发送字节数据* @retval 无*/
void UART_SendByte(unsigned char Byte)
{SBUF = Byte;while(TI == 0);//数据发送完,硬件置1TI = 0; //软件置0
}///**
// * @brief 接收数据 模版
// * @parm 无
// * @retval 无
// */
//void UART_Routine() interrupt 4
//{
// if(RI == 1)//检测是否是接收数据中断
// {
// RI = 0;//软件置0
// }
//}
主程序——每隔一秒通过串口发送递增数据
#include <REGX52.H>
#include "UART.h"
#include "Delay.h"
/*** @brief 通过串口每隔1s发送递增的数据 范围:0 ~ 255* @parm 无* @retval 无*/
void SendIncreasingNum()
{static unsigned char num;UART_SendByte(num++);Delayms(1000);
}void main()
{UART_Init();while(1){SendIncreasingNum();}
}
使用STC-IST
的 串口助手 查看效果
注意
:下面一行的配置要正确
电脑通过串口发送数据控制LED灯
电脑发送数据给单片机需要USB转串口,自带的USB线就已经实现了这一转换,所以我们直接编写单片机通过串口接收数据的逻辑即可。
串口接收数据会存放在SBUF
,接收完毕后会将RI置1
,发出中断请求,中断号为4,然后需要手动清零RI
代码如下:
void UART_Routine() interrupt 4
{if(RI == 1)//检测是否是接收数据中断{P2 = SBUF;RI = 0;//软件置0}
}
注意
:P2
寄存器用于控制LED亮灭,为0亮起,为1熄灭
还可以将数据重新返回给电脑,同样使用Delay
和 UART
模块,只有main.c不同
main.c
#include <REGX52.H>
#include "UART.h"
#include "Delay.h"
/*** @brief 接收数据,亮相应的灯,并返回数据* @parm 无* @retval 无*/
void UART_Routine() interrupt 4
{if(RI == 1)//检测是否是接收数据中断{P2 = SBUF;UART_SendByte(SBUF);RI = 0;//软件置0}
}
void main()
{UART_Init();while(1){}
}
效果如下:
我们通过串口助手,发送 0xAA = 1010 1010
LED灯效果如下:
以上就是本篇博客的所有内容,感谢你的阅读
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
相关文章:

【51单片机】UART串口通信原理 + 使用
学习使用的开发板:STC89C52RC/LE52RC 编程软件:Keil5 烧录软件:stc-isp 开发板实图: 文章目录 串口硬件电路UART串口相关寄存器 编码单片机通过串口发送数据电脑通过串口发送数据控制LED灯 串口 串口是一种应用十分广泛的通讯接…...

高性能分布式缓存Redis-高可用部署
一、主从架构搭建 为什么要进行主从架构搭建,一台redis不行吗? ①、持久化后的数据只在一台机器上,因此当硬件发生故障时,比如主板或CPU坏了,这时候无法重启服务器,有什么办法可以保证服务器发生故障时数…...

如何使用XSL-FO生成PDF格式的电子发票的技术博文示例
目录 使用 XSL-FO 生成电子发票 PDF:从布局设计到优化为什么选择 XSL-FO?1. 初始设置2. 标题区块3. 买卖方信息4. 商品明细表格5. 合计信息6. 优化代码结构与布局7. 生成 PDF 文件8. 示例总结 使用 XSL-FO 生成电子发票 PDF:从布局设计到优化…...

TDengine 签约山东港,赋能港口数字化转型
随着全球港口物流数字化进程的加速,港口运营面临日益复杂的数据管理挑战,从能源管理、设备监控到运营安全保障,各类数据需要及时存储并高效分析。山东港在信息化建设过程中,数字化综合管理平台的性能和查询功能一度受到瓶颈制约。…...

基于YOLO11/v10/v8/v5深度学习的煤矿传送带异物检测系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】
《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...

mysql-workbench 导入csv格式数据报错:Unhandled exception: Could not determine delimiter
xlsx文件中第二行某个单元格有换行符,csv文件中用双引号包起来了,但是python 在采样的时候,只读了前两行,readline可不认识csv的规则。csv文件可以识别双引号包起来的换行符是单元格内部的换行,python的readline识别不…...

使用Python简单实现客户端界面
服务端实现 import threading import timeimport wx from socket import socket, AF_INET, SOCK_STREAMclass LServer(wx.Frame):def __init__(self):wx.Frame.__init__(self, None, id1002, titleL服务器端界面, poswx.DefaultPosition, size(400, 450))# 窗口中添加面板pl …...

15分钟学 Go 第 43 天:前端与Go的结合
第43天:前端与Go的结合 目标:了解Go如何与前端交互,前端使用Vue.js 在现代Web开发中,Go语言常用于后端开发,而Vue.js是一个流行的前端框架,用于构建用户界面。结合二者,可以构建高效、可维护的…...

解决SRS推送webrtc流卡顿问题
目录 1.问题描述2.原因分析3.ffmpeg去掉B帧的方法3.1 命令行推流3.2 ffmpeg源码推流 1.问题描述 使用ffmpeg通过rtmp协议推流给SRS,然后浏览器通过webrtc拉取播放流,经多次测试发现webrtc播放流总是卡顿,而拉取rtmp流是正常的。 2.原因分析…...

GDPU Andriod移动应用 Broadcast Receiver
聆听广播,跟着节拍吧。 计时器 新建一个名为PhoneStateMonitor的工程; 实现一个应用运行时长的计时器,并在界面上刷新计数器,要求包括: (1)在Layout中包含两个TextView控件,横向分…...

CSP/信奥赛C++刷题训练:经典例题 - 栈(1):洛谷P3056 :[USACO12NOV] Clumsy Cows S
CSP/信奥赛C刷题训练:经典例题 - 栈(1):洛谷P3056 :[USACO12NOV] Clumsy Cows S 题目描述 Bessie the cow is trying to type a balanced string of parentheses into her new laptop, but she is sufficiently clums…...

WiFi一直获取不到IP地址是怎么回事?
在当今这个信息化时代,WiFi已成为我们日常生活中不可或缺的一部分。无论是家庭、办公室还是公共场所,WiFi都为我们提供了便捷的无线互联网接入。然而,有时我们可能会遇到WiFi连接后无法获取IP地址的问题,这不仅影响了我们的网络使…...

蓝牙BLE开发——iOS 每次写入数据超过200字节报错?
iOS 写入数据超过200字节报错 文章目录 iOS 写入数据超过200字节报错官方建议:报错问题解决 writeblecharacteristicvalue 官方建议: 并行调用多次会存在写失败的可能性。APP不会对写入数据包大小做限制,但系统与蓝牙设备会限制蓝牙4.0单次…...

Ascend Extension for PyTorch是个what?
1 Ascend Extension for PyTorch Ascend Extension for PyTorch 插件是基于昇腾的深度学习适配框架,使昇腾NPU可以支持PyTorch框架,为PyTorch框架的使用者提供昇腾AI处理器的超强算力。 项目源码地址请参见Ascend/Pytorch。 昇腾为基于昇腾处理器和软…...

学习docker第五弹-----高级篇start-Dockerfile
docker目录 1 Dockerfile是什么2 Dockerfile能干嘛3 如何书写Dockerfile3.1 Dockerfile构建过程解析3.2 小总结3.3 Dockerfile的基本知识3.5 保留字FROMMAINTAINERRUN 有两种方式EXPOSEWORKDIRENVUSERVOLUMEADDCMDENTRYPOINT 4 后记 1 Dockerfile是什么 Dockerfile顾名思义就是…...

【Elasticsearch】Elasticsearch集成Spring Boot
Elasticsearch集成Spring Boot 概述 Spring Data Elasticsearch 介绍一、环境初始化二、实战入门1、定义数据实体类2、定义Dao层3、框架集成-SpringData-集成测试-索引操作4、框架集成-SpringData-集成测试-文档操作5、框架集成-SpringData-集成测试-文档搜索 概述 Spring Data…...

HarmonyOS 移
什么是HarmonyOS HarmonyOS 中文名字是 鸿蒙操作系统 中国神话传说盘古在昆仑山开天辟地之前,世界是一团混沌状的元气,这种自然的元气叫做鸿蒙,那个时代成为鸿蒙时代华为公司的操作系统以鸿蒙取名,是不是有开天辟地之寓意&#x…...

跨子网的WinCC客户机/服务器如何实现通讯?
为了更有效地利用有限的IP地址,为了减少广播对网络带宽的占用从而提高带宽,为了实现在不同子网中应用不同的安全策略从而提高网络安全性,现场通常要求划分子网,将安全等级要求不同的计算机安置在不同的子网中,分开管理…...

java 面向对象高级
1.final关键字 class Demo{public static void main(String[] args) {final int[] anew int[]{1,2,3};// anew int[]{4,5,6}; 报错a[0]5;//可以,解释了final修饰引用性变量,变量存储的地址不能被改变,但地址所指向的对象的内容可以改变} }什…...

递推经典例题 - 爬楼梯
一、题目阅读 题目描述 一段楼梯有n级台阶。你每次可以跨一个、两个或者三个台阶。 请问走上n级台阶有几种方案?答案对998244353取模。 输入格式 一行一个数n。 输出格式 一行一个数,表示方案数。 样例 Input 1 3 Output 1 4 样例解释 1 1 1 3 1 2 …...

OpenCV视觉分析之目标跟踪(12)找到局部的最大值函数meanShift()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在反向投影图像上找到一个对象。 meanShift 是一种用于图像处理和计算机视觉领域的算法,特别适用于目标跟踪、图像分割等任务。该算…...

《数据治理精选案例集2.0(2024版)》592页PDF(已授权分享)
《亿信华辰数据治理精选案例集2.0》是北京亿信华辰软件有限责任公司倾力打造的专业数据治理案例集,汇集了100个一线政企数据治理实践案例,覆盖13大行业和500业务场景,通过深入剖析数据治理难题,提供了新思路和实战经验,…...

【51单片机】LED点阵屏 原理 + 使用
学习使用的开发板:STC89C52RC/LE52RC 编程软件:Keil5 烧录软件:stc-isp 开发板实图: 文章目录 LED点阵屏显示原理74HC595 编码LED点阵屏显示笑脸LED点阵屏显示动画 LED点阵屏 点阵屏在开发板的右上角,注意使用前需要…...

Java基于SpringBoot+Vue的宠物共享平台的设计与实现(附源码,文档)
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...

【案例】Excel使用宏来批量插入图片
一、场景介绍 我有一个excel文件,需要通过一列的文件名称,按照规则给批量上传图片附件。 原始文件: 成功后文件: 二、实现方法 1. 使用【wps】工具打开Excel文件,将其保存为启用宏的文件。 2.找到编辑宏的【VB编辑器…...

报名开启|开放原子大赛“Rust数据结构与算法学习赛”
开放原子大赛“Rust数据结构与算法学习赛”报名进行中,报名截止时间为11月17日。 为了进一步促进开源技术的发展,提升国内开源社区的创新能力和国际影响力,开放原子开源基金会与清华大学开源操作系统训练营等单位,共同举办本次Rus…...

[翻译] 创始人模式(Founder Mode)
Founder Mode 上周在一次YC活动中,Brian Chesky发表了一场在场的每个人都难以忘怀的演讲。会后,我与大多数创始人交流时,他们都表示这是他们听过的最好的演讲。连Ron Conway也第一次忘记了记笔记。我不会试图在这里复述演讲内容,…...

拓扑排序(C++类封装+数组模拟队列和邻接表)
拓扑序列 对于任何无回路的AOV网,其顶点均可排成拓扑序列,并且其拓扑序列未必唯一。步骤如下: 1.从网中选择一个入度为0的顶点且输出。 2.从网中删除该顶点及其所有出边。 3.执行1,2,直至所有顶点已输出࿰…...

FP独立站引流革命:GG斗篷技术解锁流量新策略
在跨境电商领域,FP独立站的运营者们面临着一个共同的挑战:如何在遵守平台规则的同时,有效地吸引和保持流量。传统的引流方法如SEM、SEO、邮件推广和社交媒体营销,对于FP独立站来说,往往效果有限。但现在,一…...

管道(Pipes)、过滤器(Filters)和拦截器(Interceptors)
在Java中,管道(Pipes)、过滤器(Filters)和拦截器(Interceptors)是三种不同的概念,它们在应用中的作用和实现方式有所不同。以下是它们之间的主要区别: 一、管道…...