news 2026/4/3 4:34:00

STM32学习_GPIO简介

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32学习_GPIO简介

STM32学习_GPIO简介

一、GPIO输出部分

- 实现 LED 点亮的代码:

#include"stm32f10x.h"// Device headerintmain(void){// 开启 RCC 时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);// 配置结构体,用于初始化 GPIOGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;// 初始化GPIOAGPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_ResetBits(GPIOA,GPIO_Pin_0);// 设置 GPIOA,GPIO_Pin_0 为低电平,灯亮GPIO_SetBits(GPIOA,GPIO_Pin_0);// 设置 GPIOA,GPIO_Pin_0 为高电平,灯灭GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);// 设置 GPIOA,GPIO_Pin_0 为低电平,灯亮GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);// 设置 GPIOA,GPIO_Pin_0 为低电平,灯灭while(1){}}

- 实现 LED 闪烁的代码:

#include"stm32f10x.h"// Device header#include"Delay.h"intmain(void){// 开启 RCC 时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);// 配置结构体,用于初始化 GPIOGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;// 初始化GPIOAGPIO_Init(GPIOA,&GPIO_InitStructure);while(1){GPIO_ResetBits(GPIOA,GPIO_Pin_0);// 设置 GPIOA,GPIO_Pin_0 为低电平,灯亮Delay_ms(500);GPIO_SetBits(GPIOA,GPIO_Pin_0);// 设置 GPIOA,GPIO_Pin_0 为低电平,灯灭Delay_ms(500);GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);// 设置 GPIOA,GPIO_Pin_0 为低电平,灯亮Delay_ms(500);GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);// 设置 GPIOA,GPIO_Pin_0 为低电平,灯灭Delay_ms(500);}}

- 实现 LED 流水灯的代码:

#include"stm32f10x.h"// Device header#include"Delay.h"intmain(void){// 开启 RCC 时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);// 配置结构体,用于初始化 GPIOGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | ···;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;// 选择全部的端口GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;// 初始化GPIOAGPIO_Init(GPIOA,&GPIO_InitStructure);while(1){GPIO_Write(GPIOA,~0x0001);// 0000 0000 0000 0001Delay_ms(500);GPIO_Write(GPIOA,~0x0002);// 0000 0000 0000 0010Delay_ms(500);GPIO_Write(GPIOA,~0x0004);// 0000 0000 0000 0100Delay_ms(500);GPIO_Write(GPIOA,~0x0008);// 0000 0000 0000 1000Delay_ms(500);GPIO_Write(GPIOA,~0x0010);// 0000 0000 0001 0000Delay_ms(500);GPIO_Write(GPIOA,~0x0020);// 0000 0000 0010 0000Delay_ms(500);GPIO_Write(GPIOA,~0x0040);// 0000 0000 0100 0000Delay_ms(500);GPIO_Write(GPIOA,~0x0080);// 0000 0000 1000 0000Delay_ms(500);}}

- 实现 蜂鸣器的代码:

#include"stm32f10x.h"// Device header#include"Delay.h"intmain(void){// 开启 RCC 时钟,易错点:时钟没有从 GPIOA 换成 GPIOB,导致蜂鸣器不响RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);// 配置结构体,用于初始化 GPIOGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;// 初始化GPIOAGPIO_Init(GPIOB,&GPIO_InitStructure);while(1){// 输出低电平,蜂鸣器响GPIO_ResetBits(GPIOB,GPIO_Pin_12);Delay_ms(100);GPIO_SetBits(GPIOB,GPIO_Pin_12);Delay_ms(100);GPIO_ResetBits(GPIOB,GPIO_Pin_12);Delay_ms(100);GPIO_SetBits(GPIOB,GPIO_Pin_12);Delay_ms(700);}}

二、GPIO输入部分

目录结构,创建代码前先完善目录,并在魔术棒内添加路径配置

- 按键控制代码展示:

main.c 主函数代码:

#include"stm32f10x.h"// Device header#include"Delay.h"#include"LED.h"#include"Key.h"uint8_tKeyNum;intmain(void){LED_Init();Key_Init();while(1){KeyNum=Key_GetNum();if(KeyNum==1){LED1_Turn();}if(KeyNum==2){LED2_Turn();}}}

LED.c 和 LED.h 代码:

#include"stm32f10x.h"// Device headervoidLED_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);// 开启时钟,并完成配置GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2);}voidLED1_ON(void)// 点亮 Led1{GPIO_ResetBits(GPIOA,GPIO_Pin_1);}voidLED1_OFF(void)// 熄灭 Led1{GPIO_SetBits(GPIOA,GPIO_Pin_1);}voidLED1_Turn(void)// 翻转 Led1 GPIO,实现按下点亮,再按下熄灭{if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1)==0)// 关于这个函数,下面会给个表格{GPIO_SetBits(GPIOA,GPIO_Pin_1);}else{GPIO_ResetBits(GPIOA,GPIO_Pin_1);}}// 和上面一样,这里不赘述voidLED2_ON(void){GPIO_ResetBits(GPIOA,GPIO_Pin_2);}voidLED2_OFF(void){GPIO_SetBits(GPIOA,GPIO_Pin_2);}voidLED2_Turn(void){if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2)==0){GPIO_SetBits(GPIOA,GPIO_Pin_2);}else{GPIO_ResetBits(GPIOA,GPIO_Pin_2);}}
#ifndef__LED_H#define__LED_HvoidLED_Init(void);voidLED1_ON(void);voidLED1_OFF(void);voidLED2_ON(void);voidLED2_OFF(void);voidLED1_Turn(void);voidLED2_Turn(void);#endif

Key.c 和 Key.h 代码:

#include"stm32f10x.h"// Device header#include"Delay.h"/** * 函 数:按键初始化 * 参 数:无 * 返 回 值:无 */voidKey_Init(void){/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GPIOB的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);//将PB1和PB11引脚初始化为上拉输入}/** * 函 数:按键获取键码 * 参 数:无 * 返 回 值:按下按键的键码值,范围:0~2,返回0代表没有按键按下 * 注意事项:此函数是阻塞式操作,当按键按住不放时,函数会卡住,直到按键松手 */uint8_tKey_GetNum(void){uint8_tKeyNum=0;//定义变量,默认键码值为0if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0)//读PB1输入寄存器的状态,如果为0,则代表按键1按下{Delay_ms(20);//延时消抖while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0);//等待按键松手Delay_ms(20);//延时消抖KeyNum=1;//置键码为1}if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0)//读PB11输入寄存器的状态,如果为0,则代表按键2按下{Delay_ms(20);//延时消抖while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0);//等待按键松手Delay_ms(20);//延时消抖KeyNum=2;//置键码为2}returnKeyNum;//返回键码值,如果没有按键按下,所有if都不成立,则键码为默认值0}
#ifndef__KEY_H#define__KEY_HvoidKey_Init(void);uint8_tKey_GetNum(void);#endif

表格只保留小白最常用的操作,用**PA1(通用引脚)PC13(LED常用)**做示例,重点标注你提到的GPIO_ReadOutputDataBit

操作类型标准库函数功能说明(大白话)示例代码(直接能用)
开启GPIO时钟RCC_APB2PeriphClockCmd()给GPIO端口“通电”,必须第一步做开启GPIOA时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
开启GPIOC时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO引脚初始化GPIO_Init()配置引脚的工作模式(比如输出/输入)配置PA1为推挽输出:
c<br>GPIO_InitTypeDef GPIO_InitStruct;<br>GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;<br>GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;<br>GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;<br>GPIO_Init(GPIOA, &GPIO_InitStruct);<br>
设置引脚为高电平GPIO_SetBits()把引脚拉成高电平(比如让PC13的LED熄灭)PA1设为高电平:
GPIO_SetBits(GPIOA, GPIO_Pin_1);
PC13设为高电平:
GPIO_SetBits(GPIOC, GPIO_Pin_13);
设置引脚为低电平GPIO_ResetBits()把引脚拉成低电平(比如让PC13的LED点亮)PA1设为低电平:
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
PC13设为低电平:
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
读取引脚的输出电平GPIO_ReadOutputDataBit()查“软件设置的引脚电平”(不是实际外部电平)读取PA1的输出电平:
c<br>// 返回SET(1)表示高电平,RESET(0)表示低电平<br>uint8_t level = GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1);<br>
读取引脚的实际输入电平GPIO_ReadInputDataBit()查“引脚实际接的外部电平”(比如读按键)读取PA0的实际电平:
uint8_t key_level = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
读取整个端口的输出数据GPIO_ReadOutputData()一次性读整个GPIO口的所有引脚输出电平(少用)读取GPIOA所有引脚输出电平:
uint16_t data = GPIO_ReadOutputData(GPIOA);
读取整个端口的输入数据GPIO_ReadInputData()一次性读整个GPIO口的所有引脚实际电平(少用)读取GPIOA所有引脚实际电平:
uint16_t data = GPIO_ReadInputData(GPIOA);

- GPIO操作的3个核心步骤

无论控制LED还是读按键,都要按这个流程来,少一步都不行

步骤1:开启GPIO时钟
// 以操作PC13(LED)为例,开启GPIOC时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

小白提醒:忘记开时钟是最常见的错误,代码写了也没反应!

步骤2:初始化GPIO引脚

需要用一个叫GPIO_InitTypeDef结构体来配置引脚参数,小白只需关注3个参数:

  • GPIO_Pin:选要操作的引脚(比如GPIO_Pin_13
  • GPIO_Mode:引脚模式(常用2种:
    • GPIO_Mode_Out_PP:推挽输出(适合驱动LED、继电器,最常用)
    • GPIO_Mode_IPU:上拉输入(适合读按键,避免引脚悬空)
  • GPIO_Speed:输出速度(选GPIO_Speed_50MHz就行,对LED、按键无影响)

示例(配置PC13为推挽输出):

GPIO_InitTypeDef GPIO_InitStruct;// 定义配置结构体GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13;// 选择PC13引脚GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;// 推挽输出模式GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;// 输出速度50MHzGPIO_Init(GPIOC,&GPIO_InitStruct);// 执行初始化
步骤3:用函数操作引脚(电平设置/读取)
// 比如让PC13点亮(低电平)GPIO_ResetBits(GPIOC,GPIO_Pin_13);// 读取PC13的输出电平uint8_tlevel=GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_13);

- 关键函数详解:GPIO_ReadOutputDataBit

小白最容易搞混“读取输出电平”和“读取输入电平”,用表格对比一下:

函数读取的是什么?举个例子(PC13)
GPIO_ReadOutputDataBit()读取软件设置的电平(输出寄存器ODR的值)你用GPIO_SetBits()把PC13设为高电平,即使外部电路把PC13拉低,这个函数仍返回高电平(SET)
GPIO_ReadInputDataBit()读取引脚实际的外部电平(输入寄存器IDR的值)你用GPIO_SetBits()把PC13设为高电平,但外部电路把PC13拉低,这个函数返回低电平(RESET)

小白总结

  • 想知道“我让引脚输出什么电平”,用GPIO_ReadOutputDataBit()
  • 想知道“引脚实际接的是什么电平”,用GPIO_ReadInputDataBit()

- 光敏电阻控制蜂鸣器

main.c 主函数代码

#include"stm32f10x.h"// Device header#include"Delay.h"#include"Buzzer.h"#include"LightSensor.h"uint8_tKeyNum;intmain(void){Buzzer_Init();LightSensor_Init();while(1){if(LightSensor_Get()==1){Buzzer_ON();}else{Buzzer_OFF();}}}

蜂鸣器代码:

#include"stm32f10x.h"// Device headervoidBuzzer_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_12);}voidBuzzer_ON(void){GPIO_ResetBits(GPIOB,GPIO_Pin_12);}voidBuzzer_OFF(void){GPIO_SetBits(GPIOB,GPIO_Pin_12);}voidBuzzer_Turn(void){if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_12)==0){GPIO_SetBits(GPIOB,GPIO_Pin_12);}else{GPIO_ResetBits(GPIOB,GPIO_Pin_12);}}
#ifndef__BUZZER_H#define__BUZZER_HvoidBuzzer_Init(void);voidBuzzer_ON(void);voidBuzzer_OFF(void);voidBuzzer_Turn(void);#endif

光敏传感器代码:

#include"stm32f10x.h"// Device headervoidLightSensor_Init(void){/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GPIOB的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);}uint8_tLightSensor_Get(void){returnGPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13);}
#ifndef__LIGHT_SENSOR_H#define__LIGHT_SENSOR_HvoidLightSensor_Init(void);uint8_tLightSensor_Get(void);#endif
对比项有源蜂鸣器无源蜂鸣器备注(STM32使用建议)
核心结构内置振荡电路(含三极管、振荡芯片)仅电磁线圈+振膜,无振荡电路有源的“源”指内置振荡源,并非“电源”
驱动方式直接接直流电压(如3.3V/5V)即可发声需输入一定频率的方波信号(如1kHz~5kHz)才能发声有源:STM32用GPIO输出高低电平就能控制;无源:需用PWM或延时翻转GPIO产生方波
声音控制只能控制响/不响,音调固定可通过改变方波频率控制音调(如不同频率出不同声音)做音乐播放选无源,仅做报警提示选有源
工作电压有固定电压(如3V、5V,错压易烧毁)电压范围宽(如3V~5V),由方波幅值决定需匹配STM32引脚输出电平(3.3V)
引脚标识通常标“+”“-”(正负极性,反接不响)无正负极(两根引脚可互换)有源反接不会烧,但不工作;无源无极性限制
外观特征顶部盖板多为黑色/红色,底部电路板可见芯片顶部盖板多为白色/透明,内部可见线圈和振膜肉眼可快速区分(新手实用技巧)
STM32驱动示例GPIO_ResetBits(GPIOB, GPIO_Pin_0);(低电平响,需看接线)用延时生成方波:
c<br>while(1){<br>GPIO_SetBits(GPIOB, GPIO_Pin_0);<br>Delay_us(500);<br>GPIO_ResetBits(GPIOB, GPIO_Pin_0);<br>Delay_us(500);<br>}<br>(1kHz方波)
有源驱动代码简单,无源需生成方波
成本与适用场景成本稍高,适合简单报警(如按键提示、故障报警)成本稍低,适合音乐播放、复杂音效(如电子琴)新手入门先玩有源,易上手

- 光敏电阻模块工作原理

光敏模块是STM32入门常用的环境光检测模块,核心是光敏电阻,配合简单的电路实现“光强→电信号”的转换,新手易上手。

1. 核心元件:光敏电阻的工作原理

光敏电阻(也叫光导管)是一种半导体光敏元件,基于光电导效应工作:

  • 当光线照射到光敏电阻表面时,其内部的半导体材料会产生更多的载流子,导致电阻值急剧减小(光线越强,电阻越小);
  • 当无光线(黑暗环境)时,光敏电阻的电阻值很大(可达数兆欧)。

简单说:光强 ↗ → 电阻 ↘;光弱 ↗ → 电阻 ↗

2. 光敏模块的电路结构(两种常见类型)

市面上的光敏模块主要分数字输出型模拟输出型,新手常用数字输出型(接线简单)。

- 数字输出型光敏模块(最常用)
电路组成:
  • 光敏电阻 + 固定电阻 → 分压电路;
  • 比较器(如LM393)→ 将分压电压与参考电压比较,输出高低电平。
工作过程:
  1. 模块上有一个电位器,可调节参考电压(即灵敏度);
  2. 当环境光强超过设定值时,光敏电阻阻值变小,分压后的电压低于参考电压,比较器输出低电平
  3. 当环境光强低于设定值时,光敏电阻阻值变大,分压后的电压高于参考电压,比较器输出高电平
关键特点:

输出只有高/低两种电平,可直接接STM32的GPIO输入引脚,用GPIO_ReadInputDataBit()读取。

- 模拟输出型光敏模块
电路组成:

仅由光敏电阻 + 固定电阻组成的分压电路,无比较器。

工作过程:

输出端直接输出分压后的模拟电压(范围0~3.3V/5V),电压值随光强连续变化(光越强,电压越高;光越弱,电压越低)。

关键特点:

需接STM32的ADC引脚(如PA0),通过ADC采集电压值,计算出具体的光强大小(精度更高)。


写在最后

  1. 有源蜂鸣器和无源蜂鸣器的核心区别是是否内置振荡电路,新手入门选有源更易实现;
  2. 光敏模块通过光敏电阻的阻值变化将光强转为电信号,数字输出型适合简单的开关控制,模拟输出型适合高精度的光强检测。
    结合STM32的GPIO和ADC操作,能快速实现对这两种模块的控制,是新手练手的好案例。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/2 21:22:15

如何理解CNN的归纳偏置

什么是归纳偏置&#xff1f;在探讨卷积神经网络&#xff08;CNN&#xff09;的归纳偏置之前&#xff0c;我们先理解“归纳偏置”这个概念。简而言之&#xff0c;归纳偏置是机器学习模型在学习过程中内置的“假设”或“偏好”&#xff0c;它引导模型以特定的方式理解数据&#x…

作者头像 李华
网站建设 2026/3/28 17:53:23

24、文本处理工具:tr、sed与aspell的实用指南

文本处理工具:tr、sed与aspell的实用指南 1. 即时编辑与tr工具 在文本编辑的世界里,我们通常习惯使用交互式的文本编辑器,手动移动光标并输入更改内容。但实际上,还有非交互式的文本编辑方式,比如可以用一个命令对多个文件进行一系列更改。 1.1 tr工具简介 tr(Transl…

作者头像 李华
网站建设 2026/3/28 5:33:35

32、高效 shell 脚本:从用户输入到循环控制的全面指南

高效 shell 脚本:从用户输入到循环控制的全面指南 1. 读取用户输入 在 shell 脚本中, read 命令是获取用户输入的重要工具。它可以从标准输入读取数据,并将其赋值给变量。以下是一个简单的示例: #!/bin/bash # read-single: read multiple values into default vari…

作者头像 李华
网站建设 2026/4/1 17:10:18

37、Bash 编程高级特性与技巧详解

Bash 编程高级特性与技巧详解 在 Bash 编程中,数组、组命令、子 shell、进程替换、信号捕获、临时文件处理、异步执行和命名管道等都是非常实用的特性。下面将详细介绍这些特性及其使用方法。 1. 数组操作 在 Bash 中,数组的使用非常灵活,但也有一些特殊的操作需要掌握。…

作者头像 李华
网站建设 2026/4/2 2:29:09

字符串移位包含问题与删除单词后缀问题

字符串移位包含问题由于最多有字符串长度个移位&#xff0c;所以我利用字符串添加&#xff08;即复制自身并添加到自己末尾&#xff09;形成新的字符串&#xff0c;再在行的字符串中利用“.find&#xff08;&#xff09;”函数寻找另一个字符串。再由题意反着来一遍即可。#incl…

作者头像 李华
网站建设 2026/3/14 10:30:43

28、Linux网络故障排除指南

Linux网络故障排除指南 1. 常见网络问题及初步排查 网络故障在各类组织中都难以避免,从小型企业到大型机构均是如此。在解决网络问题时,通常需要先进行一系列基础检查,再运用更复杂的技术手段。 1.1 基础检查步骤 设备状态 :检查设备是否通电、是否正确插入,以及线缆…

作者头像 李华