stm32入门-----EXTI外部中断(下——实践篇)
目录
前言
一、硬件介绍
1.对射红外线传感器
2.旋转编码器
二、EXTI外部中断C编程
1.开启RCC时钟
2.配置GPIOK口初始化
3.配置AFIO
4.配置EXIT
5.配置NVIC
三、EXIT外部中断项目实操
1.对射红外传感器计数
2.选择编码器计数
前言
本期接着上一期的内容继续学习stm32的外部中断系统(上一期链接:stm32入门-----EXTI外部中断(上 ——理论篇)-CSDN博客)。本期的主要是进行实践操作stm32的外部中断,分为两个部分:红外线传感器进行计数和转动旋转编码器进行计数。(视频:[5-2] 对射式红外传感器计次&旋转编码器计次_哔哩哔哩_bilibili)
一、硬件介绍
1.对射红外线传感器
工作电压:3.3V-5V
输出形式:数字开关量D0输出(0 和 1),模拟输出A0引脚无效使用方式: 接好VCC和GND,模块电源指示灯会亮,模块槽中无遮挡时,接收管导通,模块DO输出低电平,开关指示灯亮;遮挡时,DO输出高电平,开关指示灯灭。模块DO可与继电器相连,组成限位开关等功能,也可以与有源蜂鸣器模块相连,组成报警器。DO输出接口可以与单片机I0口直接相连,一般接外部中断,检测传感器是否有遮档,如用电机码盘则可检测电机的转速。


硬件电路:
2.旋转编码器
- 旋转编码器:用来测量位置、速度或旋转方向的装置,当其旋转轴旋转时,其输出端可以输出与旋转速度和方向对应的方波信号,读取方波信号的频率和相位信息即可得知旋转轴的速度和方向
- 类型:机械触点式/霍尔传感器式/光栅式

硬件电路:
这里可以看到旋转编码器有两个输出口分别是A和B口,当没有进行旋转的时候此时两个输出口都会被拉升为高电平,当逆时针转动的时候A口的电路与GND导通,此时A口拉倒低电平,输出为低电平,但B处不变,顺时针就刚好反过来。(想了解详细可查看:江协科技STM32——旋转编码器计次(软件消抖)_旋转编码器消抖-CSDN博客)
二、EXTI外部中断C编程
我们可以用C语言的库函数来取调用这些外部中断,实际上只需要按照上一期理论的知识去进行相关的初始化设置就行了。大体上分为5步。
EXIT外部中断结构图:

1.开启RCC时钟
设置时钟包括GPIO口的时钟和AFIO的时钟,GPIO的时钟我们前面学习GPIO口的时候就已经学习过了,如果没有去指定开启GPIO的时钟,那么这个GPIO口是无法使用的。同样的AFIO的时钟如果不开的话也是无法使用的。
对于EXIT外部中断,这两个时钟都要开启,GPIO是作为输入口,二AFIO是作为中断引脚的选择口。这里我们就使用APB2外设的时钟
示例如下:
// 1.开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
2.配置GPIOK口初始化
这个的我们之前就已经学习过了,这里就不多讲了,不过要注意的是配置GPIOK口的工作方式最好选择上拉输入或者下拉输入或者浮空输入,以保证输入的电平是保持稳定的,当且仅当外部硬件输入变化才产生变化。
示例如下:
//2.配置GPIO口GPIO_InitTypeDef GPIO_initstruct;GPIO_initstruct.GPIO_Mode=GPIO_Mode_IPU;//选择上拉输入GPIO_initstruct.GPIO_Pin=GPIO_Pin_14; //选用14号引脚GPIO_initstruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_initstruct); //GPIOB口初始化
3.配置AFIO
这里要用到void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)这个函数,这个函数是用来去配置AFIO,不过这个函数的名称连AFIO都没出现反而出现了EXIT,我觉得也挺奇怪的,但是这个函数的内部是实际对AFIO进行操作的。
AFIO配置GPIO线路关系图如下:

相关定义如下:

示例如下:
//3.配置AFIOGPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14); //AFIO打到GPIOB处的14号引脚
4.配置EXIT
配置EXIT包括配置工作方式(中断模式还是事件模式)、触发方式、以及配置外部中断的中断线路,上面我们配置好了AFIO与GPIO之间的线路,这里我们只需要去配置AFIO与EXIT之间的线路就行了。如下图所示:

下图是EXIT在C语言中的结构体定义:

代码的写法跟配置GPIO口的基本上是一模一样的,示例如下:
//4.配置EXTIEXTI_InitTypeDef EXTI_initstruct;//定义EXIT结构体EXTI_initstruct.EXTI_Line=EXTI_Line14;//选择中断线,这里选择外部中断14号线EXTI_initstruct.EXTI_LineCmd=ENABLE;//设置上面选择好的中断线是否使用,进行使能操作,这里是设置ENABLE,进行使能EXTI_initstruct.EXTI_Mode=EXTI_Mode_Interrupt;//配置模式,中断模式还是事件模式,这里选择中断模式EXTI_initstruct.EXTI_Trigger=EXTI_Trigger_Falling;//选择触发方式,上升沿触发还是下降沿触发等等,这里选择下降沿触发EXTI_Init(&EXTI_initstruct);//初始化
5.配置NVIC
配置NVIC包括配置优先级(抢占优先级和响应优先级)、EXIT通道(也就是NVIC与上面配置好的EXIT之间的通道)、分组情况。
NVIC是分为5组的,不同的分组指定的抢占优先级和响应优先级的个数是不同的,分组配置的注释如下:

代码示例如下:
//5.配置NVICNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置分组,可放到主函数去分NVIC_InitTypeDef NVIC_initstruct;//定义结构体NVIC_initstruct.NVIC_IRQChannel= EXTI15_10_IRQn ; //选择通道,EXTI通道EXTI15_10_IRQnNVIC_initstruct.NVIC_IRQChannelCmd=ENABLE;//指定上面通道是否开启,同理//由于当前只有一个中断,优先级可以根据当前分组随便设置,如果多个的话才涉及这个NVIC_initstruct.NVIC_IRQChannelPreemptionPriority=1;//设置抢占优先级NVIC_initstruct.NVIC_IRQChannelSubPriority=1;//设置响应优先级NVIC_Init(&NVIC_initstruct);//初始化
三、EXIT外部中断项目实操
1.对射红外传感器计数
先看现象:
对射红外传感器计数
硬件连线图:

工程文件:
可以看到我们要编写的是下图两个箭头指向的文件,然后将结果在OLED显示屏上显示出来。

C编程代码如下
Countsensor.c代码:
#include "stm32f10x.h" // Device header
#include "Delay.h"
uint16_t count;//初始化
void Countsensor_init(){// 1.开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//2.配置GPIO口GPIO_InitTypeDef GPIO_initstruct;GPIO_initstruct.GPIO_Mode=GPIO_Mode_IPU;GPIO_initstruct.GPIO_Pin=GPIO_Pin_14;GPIO_initstruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_initstruct);//3.配置AFIOGPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14); //AFIO打到GPIOB处的14号引脚//4.配置EXTIEXTI_InitTypeDef EXTI_initstruct;//定义EXIT结构体EXTI_initstruct.EXTI_Line=EXTI_Line14;//选择中断线,这里选择外部中断14号线EXTI_initstruct.EXTI_LineCmd=ENABLE;//设置上面选择好的中断线是否使用,进行使能操作EXTI_initstruct.EXTI_Mode=EXTI_Mode_Interrupt;//配置模式,中断模式还是事件模式,这里选择中断模式EXTI_initstruct.EXTI_Trigger=EXTI_Trigger_Falling;//选择触发方式,上升沿触发还是下降沿触发等等,这里选择下降沿触发EXTI_Init(&EXTI_initstruct);//初始化//5.配置NVICNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置分组,可放到主函数去分NVIC_InitTypeDef NVIC_initstruct;//定义结构体NVIC_initstruct.NVIC_IRQChannel= EXTI15_10_IRQn ; //选择通道,EXTI通道EXTI15_10_IRQnNVIC_initstruct.NVIC_IRQChannelCmd=ENABLE;//指定上面通道是否开启,同理//由于当前只有一个中断,优先级可以根据当前分组随便设置,如果多个的话才涉及这个NVIC_initstruct.NVIC_IRQChannelPreemptionPriority=1;//设置抢占优先级NVIC_initstruct.NVIC_IRQChannelSubPriority=1;//设置响应优先级NVIC_Init(&NVIC_initstruct);//初始化}//返回count的值
uint16_t count_get()
{return count;
}
//中断函数,其函数的名字是固定的,参数为空
void EXTI15_10_IRQHandler(){//中断标志位判断,这个中断是EXTI 10~15的,我们要的是EXTI14的,所以要去判断一下是不是当前需要的中断if(EXTI_GetITStatus(EXTI_Line14)==SET){ //判断,返回值为set就表示确定当前没有错误是执行这个if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0)//消抖count++;//程序进入到中断的时候会产生中断标志位,强制进入中断//执行完成了之后要去清除中断的标志位,不然就会一直执行中断函数EXTI_ClearITPendingBit(EXTI_Line14);}}
Countsensor.h代码 :
#ifndef __COUNT_SENSOR_H
#define __COUNT_SENSOR_H
void Countsensor_init();
uint16_t count_get();#endif // !__COUNT_
main.c代码:
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Countsensor.h"int main(void)
{ Countsensor_init();OLED_Init();OLED_ShowString(1,1,"count:");while(1){OLED_ShowNum(1,7,count_get(),4);Delay_ms(500);}
}
2.选择编码器计数
还是一样,我们先看现象:
选择编码器读取
电路连接图:

工程文件:

C语言代码如下
Encode.c代码
#include "stm32f10x.h"
int16_t count;
int16_t turn;//转动方向void Encode_init(){// 1.开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//2.配置GPIO口GPIO_InitTypeDef GPIO_initstruct;GPIO_initstruct.GPIO_Mode=GPIO_Mode_IPU; //默认设置为高电平GPIO_initstruct.GPIO_Pin=GPIO_Pin_1 | GPIO_Pin_0;GPIO_initstruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_initstruct);//3.配置AFIOGPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);//4.配置EXTIEXTI_InitTypeDef EXTI_initstruct;EXTI_initstruct.EXTI_Line=EXTI_Line1 | EXTI_Line0;//选择中断线EXTI_initstruct.EXTI_LineCmd=ENABLE;//设置上面选择好的中断线是否使用EXTI_initstruct.EXTI_Mode=EXTI_Mode_Interrupt;//配置模式,中断模式还是事件模式EXTI_initstruct.EXTI_Trigger=EXTI_Trigger_Falling;//选择触发方式,上升沿触发还是下降沿触发等等EXTI_Init(&EXTI_initstruct);//初始化//5.配置NVICNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置分组,可放到主函数去分NVIC_InitTypeDef NVIC_initstruct;NVIC_initstruct.NVIC_IRQChannel= EXTI0_IRQn ; //选择通道,EXTI通道EXTI15_10_IRQnNVIC_initstruct.NVIC_IRQChannelCmd=ENABLE;//指定上面通道是否开启,同理//由于当前只有一个中断,优先级可以根据当前分组随便设置,如果多个的话才涉及这个NVIC_initstruct.NVIC_IRQChannelPreemptionPriority=1;//设置抢占优先级NVIC_initstruct.NVIC_IRQChannelSubPriority=1;//设置响应优先级NVIC_Init(&NVIC_initstruct);NVIC_initstruct.NVIC_IRQChannel= EXTI1_IRQn ; //选择通道,EXTI通道EXTI15_10_IRQnNVIC_initstruct.NVIC_IRQChannelCmd=ENABLE;//指定上面通道是否开启,同理//由于当前只有一个中断,优先级可以根据当前分组随便设置,如果多个的话才涉及这个NVIC_initstruct.NVIC_IRQChannelPreemptionPriority=1;//设置抢占优先级NVIC_initstruct.NVIC_IRQChannelSubPriority=2;//设置响应优先级NVIC_Init(&NVIC_initstruct);
}
//返回转动方向的值,0表示逆时针,1表示顺时针
int16_t Turn_get(){return turn;
}
//返回数值的变化值
int16_t Encode_get(){int16_t temp=count;count=0;return temp;
}void EXTI0_IRQHandler(){if(EXTI_GetITStatus(EXTI_Line0)==SET){if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0&&GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0){count--;turn=0; //0表示逆时针旋转}EXTI_ClearITPendingBit(EXTI_Line0);}
}void EXTI1_IRQHandler(){if(EXTI_GetITStatus(EXTI_Line1)==SET){if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0&&GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0){count++;turn=1; //1表示顺时针}EXTI_ClearITPendingBit(EXTI_Line1);}
}
Encode.h代码:
#ifndef __ENCODE_H
#define __ENCODE_H
void Encode_init();
int16_t Encode_get();
int16_t Turn_get();#endif // !__ENCODE_H
main.c代码:
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Encode.h"int16_t num;int main(void)
{ OLED_Init();Encode_init();OLED_ShowString(1,1,"time:");while(1){num+=Encode_get();OLED_ShowSignedNum(1,6,num,4);OLED_ShowSignedNum(2,1,Turn_get(),1);}
}
相关的问题可查看:问题详情 (jiangxiekeji.com)
以上就是本期的全部内容了,我们下次见!
今日壁纸:

相关文章:
stm32入门-----EXTI外部中断(下——实践篇)
目录 前言 一、硬件介绍 1.对射红外线传感器 2.旋转编码器 二、EXTI外部中断C编程 1.开启RCC时钟 2.配置GPIOK口初始化 3.配置AFIO 4.配置EXIT 5.配置NVIC 三、EXIT外部中断项目实操 1.对射红外传感器计数 2.选择编码器计数 前言 本期接着上一期的内容继续学习stm3…...
深度学习落地实战:基于UNet实现血管瘤超声图像分割
前言 大家好,我是机长 本专栏将持续收集整理市场上深度学习的相关项目,旨在为准备从事深度学习工作或相关科研活动的伙伴,储备、提升更多的实际开发经验,每个项目实例都可作为实际开发项目写入简历,且都附带完整的代码与数据集。可通过百度云盘进行获取,实现开箱即用 …...
Python进阶(4)--正则表达式
正则表达式 在Python中,正则表达式(Regular Expression,简称Regex)是一种强大的文本处理工具,它允许你使用一种特殊的语法来匹配、查找、替换字符串中的文本。 在这之前,还记得之前我们是通过什么方法分割…...
RCA连接器是什么?一文读懂
RCA连接器,也就是我们在电视机、DVD播放器、通讯设备、立体声设备和游戏设备后面常见的彩色插头,其历史可以追溯到近一个世纪以前。这种现今广泛使用的电缆接口,最初是由美国无线电公司(RCA)开发并命名的,在…...
【linux】服务器安装NVIDIA驱动
【linux】服务器安装NVIDIA驱动 【创作不易,求点赞关注收藏】😀 文章目录 【linux】服务器安装NVIDIA驱动一、关闭系统自带驱动nouveau二、下载英伟达驱动三、安装英伟达驱动1、禁用X服务器和相关进程2、在TTY终端安装驱动3、验证是否安装成功4、重新启…...
【达梦数据库】关于用户、模式、表空间等如何理解?
与MySQL的用户有所区别,MySQL是单实例多库,DM7以上版本是单库多实例架构, MySQL访问方式: 一个root访问多个库,访问前切换一下就ok 比如MySQL到DM的迁移是,MySQL的一个库对应dm中的一个表空间和一个用户。比…...
一篇就够mysql高阶知识总结
一、事务的ACID原则 序号原则说明1原子性(Atomicity)事务是数据库的逻辑工作单位,事务中包括的诸操作要么都做,要么都不做2一致性(Consistency)事务执行的结果必须是使数据库从一个一致性状态变到另一个一…...
CTF-Web习题:[BJDCTF2020]ZJCTF,不过如此
题目链接:[BJDCTF2020]ZJCTF,不过如此 解题思路 访问靶场链接,出现的是一段php源码,接下来做一下代码审阅,发现这是一道涉及文件包含的题 主要PHP代码语义: file_get_contents($text,r); 把$text变量所…...
【IEEE出版】第四届能源工程与电力系统国际学术会议(EEPS 2024)
第四届能源工程与电力系统国际学术会议(EEPS 2024) 2024 4th International Conference on Energy Engineering and Power Systems 重要信息 大会官网:www.iceeps.com 大会时间:2024年8月9-11日 大会…...
浅谈Vue:text-align: center、align-items: center、justify-content: center三种居中的区别和用法
text-align: center、align-items: center 和 justify-content: center 是用于不同布局场景下的CSS属性。它们在水平和垂直居中元素方面有所不同,具体取决于你使用的布局模型(如块级元素、Flexbox、Grid)。以下是它们的区别和适用场景&#x…...
理解UI设计:UI设计师的未来发展机遇
UI设计师的出现是互联网时代的设计变革。随着移动互联网的快速发展,移动产品设计师非常短缺。高薪资让许多其他行业的设计师已经转向了UI设计。那么什么是UI设计呢?UI设计师负责什么?UI设计的发展趋势和就业前景如何?这些都是许多…...
关键字 internal
在C#中,internal 关键字是一个访问修饰符,它用于限制类型或类型成员的访问性。当一个类型(类、结构体、接口、枚举等)或类型成员(字段、属性、方法、事件等)被声明为 internal 时,它只能在同一程…...
C学习(数据结构)-->单链表习题
目录 一、环形链表 题一:环形链表 思路: 思考一:为什么? 思考二:快指针一次走3步、4步、......n步,能否相遇 step1: step2: 代码: 题二: 环形链表 I…...
MATLAB6:M文件和控制流
文章目录 一、实验目的二、实验内容三、仿真结果四、实践中遇到的问题及解决方法 一、实验目的 1. 熟悉运用MATLAB的控制指令。 2. 理解M脚本文件和函数文件的本质区别。 3. 能够运用所学知识,编制程序解决一般的计算问题。 二、实验内容 1.for循环结构及注…...
网页数据抓取:融合BeautifulSoup和Scrapy的高级爬虫技术
网页数据抓取:融合BeautifulSoup和Scrapy的高级爬虫技术 在当今的大数据时代,网络爬虫技术已经成为获取信息的重要手段之一。Python凭借其强大的库支持,成为了进行网页数据抓取的首选语言。在众多的爬虫库中,BeautifulSoup和Scrap…...
Linux应用——网络基础
一、网络结构模型 1.1C/S结构 C/S结构——服务器与客户机; CS结构通常采用两层结构,服务器负责数据的管理,客户机负责完成与用户的交互任务。客户机是因特网上访问别人信息的机器,服务器则是提供信息供人访问的计算机。 例如&…...
白骑士的C++教学实战项目篇 4.3 多线程网络服务器
系列目录 上一篇:白骑士的C教学实战项目篇 4.2 学生成绩管理系统 在这一节中,我们将实现一个多线程网络服务器项目,通过该项目,我们将学习套接字编程的基础知识以及如何使用多线程处理并发连接。此外,我们还将实现一个…...
Go语言并发编程-Context上下文
Context上下文 Context概述 Go 1.7 标准库引入 context,译作“上下文”,准确说它是 goroutine 的上下文,包含 goroutine 的运行状态、环境、现场等信息。 context 主要用来在 goroutine 之间传递上下文信息,包括:取…...
React@16.x(62)Redux@4.x(11)- 中间件2 - redux-thunk
目录 1,介绍举例 2,原理和实现实现 3,注意点 1,介绍 一般情况下,action 是一个平面对象,并会通过纯函数来创建。 export const createAddUserAction (user) > ({type: ADD_USER,payload: user, });这…...
【Qt】QTcpServer/QTcpSocket通信
这里写目录标题 1.pro文件2.服务器3.客户端 1.pro文件 QT network2.服务器 h文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QTcpServer> #include <QTcpSocket>QT_BEGIN_NAMESPACE namespace Ui { class MainW…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
