STM32串口原理、结构体、库函数、串口发送字符(串)、重定向printf串口发送、串口中断接收控制灯、接收不定长数据

参考:串口的结构体 重定向printf串口发送stm32等博文
作者:点灯小哥
发布时间: 2021-03-06 21:46:33
网址:https://blog.csdn.net/weixin_46016743/article/details/114458698

目录

  • 串口相关知识
    • 定义
    • 通信概念
      • 1.通讯结构
      • 2.电平标准
      • 3.同步异步传输方式(USART与UART)
      • 4.串口数据包组成
      • 5.速率类型
      • 6.通信类型(串行、并行)
      • 7.通信方式(单工、半双工、全双工)
      • 8.概念补充
  • 串口的引脚
  • 结构体
  • 库函数(状态标志位)
  • 串口的发送配置
  • 串口发送字符(STM32发送到上位机)
  • 串口发送字符串
  • 重定向printf串口发送
  • 串口的中断接收(控制灯)
    • 方法:在usart.c上增加配置NVIC中断控制器,中断源为串口1
    • 串口中断不属于EXTI外部中断,所以不用配置EXTI结构体
    • usart.c
    • main.c -- USART1_IRQHandler(void)
  • 串口接收不定长数据

串口相关知识

定义

串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,其通讯协议可分层为协议层和物理层。

  • 物理层规定通信协议中具有机械、电子功能的特性,从而确保原始数据在物理媒体的传播
  • 协议层主要规定通讯逻辑,统一双方的数据打包、解包标准。通俗的讲物理层规定我们用嘴巴还是肢体交流,协议层规定我们用中文还是英文交流。

通信概念

1.通讯结构

串口通讯的物理层的主要标准是RS-232标准,其规定了信号的用途、通讯接口及信号的电平标准,其通讯结构如下:

在这里插入图片描述
在设备内部信号是以TTL电平标准传输的,设备之间是通过RS-232电平标准传输的,而且TTL电平需要经过电平转换芯片才能转化为RS-232电平,RS-232电平转TTL电平也是如此。

2.电平标准

根据使用的电平标准不同,串口通讯可分为 RS-232标准及TTL标准,具体标准如下:
在这里插入图片描述

在电子电路中常使用TTL的电平标准,但其抗干扰能力较弱,为了增加串口的通讯距离及抗干扰能力,使用RS-232电平标准在设备之间传输信息,经常使用MAX232芯片对TTL电平及RS-232电平进行相互转换。

3.同步异步传输方式(USART与UART)

  • A同步:
    传输以数据块为核心,在一个数据块内,字符间无间隔,接受发送同步,有sclk时钟,双方sclk(串行时钟)连在一起,提供同步
    特点:效率高,无间隔
  • B异步:
    字符为传输单位,每发一个字符,都得发送一个起始位,(告诉对方我开始发了)结束发送停止位。(我发完了)
    特点:效率低,间隔任意

在这里插入图片描述

在这里插入图片描述

  • USART(通用同步异步收发器)是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。

  • UART,它是在 USART 基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是 UART。

USART 在 STM32 应用最多莫过于“打印”程序信息,一般在硬件设计时都会预留一USART 通信接口连接电脑,用于在调试程序是可以把一些调试信息“打印”在电脑端的串口调试助手工具上,从而了解程序运行是否正确、如果出错哪具体哪里出错等等。

4.串口数据包组成

在这里插入图片描述
在这里插入图片描述

起始位、数据位(8位或者9位)、奇偶校验位(第9位)、起始停止位(1,15,2位)、波特率设置

校验方式 :
奇偶校验需要一位校验位,即使用串口通信的方式2或方式3(8位数据位+1位校验位)。
奇校验(odd parity):让传输的数据(包含校验位)中1的个数为奇数。
即:如果传输字节中1的个数是偶数(不包含校验位),则校验位为“1”,奇数相反。

5.速率类型

比特(bit):每秒传输的二进制位
波特(byte):每秒传输的码源个数(串口常用),一个二进制位表示一个码源(0V——0;3.3V——1)

注:这俩本质上其实是一样的

6.通信类型(串行、并行)

  • 串行:一个一个传输 如:fsmc
  • 特点:占用资源多,速度慢,看干扰强
  • 并行:多个一起传输 如:spi usart
  • 特点:占用资源少,速度快。抗干扰能力弱,距离近

7.通信方式(单工、半双工、全双工)

在这里插入图片描述

  • 单工:数据传输只支持数据在一个方向上传输;如:打印机

  • 半双工:允许数据在两个方向上传输。但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;它不需要独立的接收端和发送端,两者可以合并一起使用一个端口。如:对讲机,spi

  • 全双工:允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,需要独立的接收端和发送端。如:spi,usart

8.概念补充

  • 1.数据包
    串口通讯的数据包由发送设备通过自身的TXD接口传输到接收设备得RXD接口,在协议层中规定了数据包的内容,具体包括起始位、主体数据(8位或9位)、校验位以及停止位,通讯的双方必须将数据包的格式约定一致才能正常收发数据。

  • 2.波特率
    由于异步通信中没有时钟信号,所以接收双方要约定好波特率,即每秒传输的码元个数,以便对信号进行解码,常见的波特率有4800、9600、115200等。STM32中波特率的设置通过串口初始化结构体来实现。

  • 3.起始和停止信号
    数据包的首尾分别是起始位和停止位,数据包的起始信号由一个逻辑0的数据位表示,停止位信号可由0.5、1、1.5、2个逻辑1的数据位表示,双方需约定一致。STM32中起始和停止信号的设置也是通过串口初始化结构体来实现。

  • 4.有效数据
    有效数据规定了主题数据的长度,一般为8或9位,其在STM32中也是通过串口初始化结构体来实现的。

  • 5.数据校验
    在有效数据之后,有一个可选的数据校验位。由于数据通信相对更容易受到外部干扰导致传输数据出现偏差,可以在传输过程加上校验位来解决这个问题。校验方法有奇校验(odd)、偶校验(even)、 0 校验(space)、 1 校验(mark)以及无(noparity)。这些也都可以在串口初始化结构体中实现的。
    在这里插入图片描述

串口的引脚

在这里插入图片描述

下面是最小板原理图,UART4和UART5并没有引出来。在这里插入图片描述

结构体

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

库函数(状态标志位)

在这里插入图片描述

在这里插入图片描述

串口标志位,用于说明串口发送接收状态,是否都发/收完了
在这里插入图片描述
在这里插入图片描述

串口的发送配置

在这里插入图片描述

串口发送字符(STM32发送到上位机)

新建一个usart文件夹,里面新建usart.c和usart.h两个文件,将usart.c添加到工程里面(user一栏下),编译一下usart.h会自动添加进工程。
在这里插入图片描述
usart.h

#include "stm32f10x.h" 
void Usart_Init(void);

usart.c

#include "stm32f10x.h"                  // Device header
#include "usart.h"void Usart_Init(void)
{//2. 配置GPIO的结构体GPIO_InitTypeDef GpioInitStructure; //初始化GPIO结构体命名//3. 配置USART的结构体(另外一个结构体是带时钟的串口)USART_InitTypeDef UsartInitStructure;//初始化USART结构体命名//1. 时钟使能: GPIOA的时钟,引脚复用(成串口)的时钟,串口的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//开启APB2总线复用时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//2.1 配置PA9 TX(输出)GpioInitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;//复用推挽输出(因为复用成串口)GpioInitStructure.GPIO_Pin   = GPIO_Pin_9;GpioInitStructure.GPIO_Speed = GPIO_Speed_50MHz;//任意选择,影响不大GPIO_Init(GPIOA,&GpioInitStructure);//2.2 配置PA10 RX(接收)GpioInitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;//浮空输入GpioInitStructure.GPIO_Pin   = GPIO_Pin_10;GPIO_Init(GPIOA,&GpioInitStructure); //3.配置串口结构体   这是不带时钟的结构体  还有一个是带时钟的结构体UsartInitStructure.USART_BaudRate =   115200;   //波特率UsartInitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  //硬件流(没有使用)UsartInitStructure.USART_Mode = USART_Mode_Rx| USART_Mode_Tx;//模式(输入输出都选择)UsartInitStructure.USART_Parity = USART_Parity_No;			//校验位(不用)UsartInitStructure.USART_StopBits =	USART_StopBits_1;		//停止位(1位)UsartInitStructure.USART_WordLength =	USART_WordLength_8b;//有效字节长度(8位)//串口1USART_Init(USART1, &UsartInitStructure);USART_Cmd(USART1, ENABLE);//打开串口 比配置GPIO多这一步	
}

main.c

#include "stm32f10x.h" 
#include "usart.h"//头文件是单独创建的文件 main函数找不到 要去手工添加路径(点击魔术棒...)void delay(uint16_t time)
{uint16_t i = 0;while(time--){i=12000;while(i--);}
}int main(void)
{Usart_Init(); while(1){						USART_SendData(USART1, 'O'); //发送一个字符   //数据寄存器空标志位   RESET状态说明上面字符发送成功了!while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //USART_GetFlagStatus是判断标志位 USART_SendData(USART1, 'K');                     while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);   USART_SendData(USART1, '\n');while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);  //右键USART_GetFlagStatus去goto找到RESETdelay(1000); }
}

在这里插入图片描述

串口发送字符串

上一节串口只能一个一个发送字符,可以自己写一个串口发送字符串函数,然后main函数调用即可。

usart.c

//发送字符函数  (自己定义的 注意形参要和固件库里面串口发送字符的形参要一样) 
//调用这个函数不用每次都去判断标志位
void USARTSendByte(USART_TypeDef* USARTx, uint16_t Data)//main函数调用这个函数的方法:USARTSendByte(USART1, 'A');
{USART_SendData( USARTx,  Data);//固件库本身的串口发送函数//判断数据寄存器是否为空    						字符标志位while( USART_GetFlagStatus( USARTx,  USART_FLAG_TXE) == RESET);//USART_GetFlagStatus是判断标志位 USART_FLAG_TXE 去usart.h  FLAG找
}//发送字符串函数(自己定义的)
void USARTSendString( USART_TypeDef* USARTx, char *str)
{uint16_t i = 0;do{USARTSendByte(USART1,*(str+i));i++;}while(*(str+i) != '\0');//字符串结束标识//字符串标志位 上面是字符标志位while( USART_GetFlagStatus( USARTx,  USART_FLAG_TC) == RESET);//USART_GetFlagStatus是判断标志位 USART_FLAG_TC(这是判断字符串) 去usart.h  FLAG找}      //main函数里这样调用USARTSendByte( USART1, 'O');USARTSendByte( USART1, 'K');USARTSendString( USART1, "你好STM32");      

重定向printf串口发送

在C语言标准库中,printf()拥有十分强大的输出能力,可以输出各种类型的数据,整型、浮点型、8进制、16进制、换行符,缩进符等等。

printf()是把数据输出到屏幕,但是ARM芯片中没有屏幕,我们设想将printf()打印到串口,这样我们就可以通过printf()和串口实时的观察ARM芯片内部的工作情况,运行结果。

先来认识一个关键字:__weak

weak的字面意思就是“微弱”的意思,其主要作用就是可以重新定义重名函数或变量而编译时不报错。笔者最开始注意到这个关键字是在使用 STM32 HAL 库的时候注意到的,比如这张图片所示:
在这里插入图片描述

在上图我们可以看到左边的 HAL_MspInit 函数前面用 __weak 进行修饰,而图片右边又定义了 HAL_MspInit函数,这时整个工程就定义了两个 HAL_MspInit 函数,声明可以有多个,但是定义只能存在一个,因为 __weak的存在,所以不会报错,并且真正起作用的函数是没有用 __weak 修饰的函数。

printf函数其实就是调用了fputc,我们来重写fputc达到重定向printf的目的

在这里插入图片描述

实现过程:在usart.c 的后面增加两个函数

usart.c

int fputc(int ch, FILE *f)//(串口发送)重写fputc,供printf调用
{                            USARTSendByte( USART1,  (uint8_t)ch);while( USART_GetFlagStatus( USART1,  USART_FLAG_TXE) == RESET);return (ch);
}int fgetc(FILE *f)//(串口接收)重写fgetc
{		                                     //标志位选择接收while( USART_GetFlagStatus( USART1,  USART_FLAG_RXNE) == RESET);return (int) USART_ReceiveData(USART1); 
}

usart.h

#include "stm32f10x.h" 
#include <stdio.h>//标准输入输出printfvoid Usart_Init(void);
void USARTSendByte(USART_TypeDef* USARTx, uint16_t Data);
void USARTSendString( USART_TypeDef* USARTx, char *str);
int fputc(int ch, FILE *f);

注意:在使用printf等C语言标准库函数要包含头文件stdio.h,并且勾选Target中的use MicroLIB使用标准库。

在这里插入图片描述

main.c

#include "stm32f10x.h"                  // Device header
#include "usart.h"void delay(uint16_t time)
{uint16_t i = 0;while(time--){i=12000;while(i--);}
}int main(void)
{ Usart_Init(); printf("你好STM32");//printf调用重写的fputc  这样单片机就可以通过串口发送字符串"你好STM32"		putchar('X');      //putchar调用重写的fputc  这样单片机就可以通过串口发送字符'X'   while(1){}
}

串口的中断接收(控制灯)

参考:串口 stm32 实现中断接收 打开板子上的led灯
作者:点灯小哥
发布时间: 2021-03-07 11:55:35
网址:https://blog.csdn.net/weixin_46016743/article/details/114481125

注:板子上的LED灯看电路图连接的是PC13引脚,前面博文led.c文件里配置好了。

方法:在usart.c上增加配置NVIC中断控制器,中断源为串口1

串口中断不属于EXTI外部中断,所以不用配置EXTI结构体

	NVIC_InitTypeDef Nvic_init;	 //misc.hNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //配置NVIC中断组//3.配置NVIC中断控制器  中断源(通道)选择串口1Nvic_init.NVIC_IRQChannel = USART1_IRQn; Nvic_init.NVIC_IRQChannelCmd = ENABLE; //使能  找到FunctionalState字眼 右键gotoNvic_init.NVIC_IRQChannelPreemptionPriority = 1; //因为只配置了一个中断  不考虑优先级 所以只有1个Nvic_init.NVIC_IRQChannelSubPriority = 1;//抢占优先级与子优先级NVIC_Init(&NvicInitStructure);

usart.c

#include "stm32f10x.h"                  // Device header
#include "usart.h"
//#include "stdio.h"void Usart_Init(void)
{//2. 配置GPIO的结构体GPIO_InitTypeDef GpioInitStructure; //初始化GPIO结构体命名USART_InitTypeDef UsartInitStructure;//初始化USART结构体命名	NVIC_InitTypeDef	NvicInitStructure; //加入NVICNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置NVIC中断分组  目前一个中断随便配置就好了 //1. 配置时钟:GPIO的时钟,引脚复用的时钟,串口的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//2.1 配置PA9 TXGpioInitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;//复用推挽输出GpioInitStructure.GPIO_Pin   = GPIO_Pin_9;GpioInitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GpioInitStructure);//2.2 配置PA10 RXGpioInitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;//浮空输入GpioInitStructure.GPIO_Pin   = GPIO_Pin_10;GPIO_Init(GPIOA,&GpioInitStructure);//3.配置串口结构体UsartInitStructure.USART_BaudRate =   115200;        //波特率UsartInitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   //硬件流UsartInitStructure.USART_Mode = USART_Mode_Rx| USART_Mode_Tx;					//模式UsartInitStructure.USART_Parity = USART_Parity_No;						//校验位UsartInitStructure.USART_StopBits =	USART_StopBits_1;					//停止位UsartInitStructure.USART_WordLength =	USART_WordLength_8b;				//字节长度USART_Init(USART1, &UsartInitStructure);							//串口中断配置函数		//接收数据寄存器非空标志位 作为串口发生中断的标志USART_ITConfig( USART1,  USART_IT_RXNE, ENABLE ); USART_Cmd(USART1, ENABLE);//打开串口 比配置GPIO多这一步//配置NVIC中断控制器    中断源(通道)选择串口1NvicInitStructure.NVIC_IRQChannel = USART1_IRQn;NvicInitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级NvicInitStructure.NVIC_IRQChannelSubPriority = 1;//子优先级NvicInitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NvicInitStructure);	
}//发送字符
void USARTSendByte(USART_TypeDef* USARTx, uint16_t Data)
{USART_SendData( USARTx,  Data);while( USART_GetFlagStatus( USARTx,  USART_FLAG_TXE) == RESET);//USART_GetFlagStatus是判断标志位 USART_FLAG_TXE 去usart.h  FLAG找
}
//发送字符串
void USARTSendString( USART_TypeDef* USARTx, char *str)
{uint16_t i = 0;do{USARTSendByte(USART1,*(str+i));i++;}while(*(str+i) != '\0');while( USART_GetFlagStatus( USARTx,  USART_FLAG_TC) == RESET);//USART_GetFlagStatus是判断标志位 USART_FLAG_TC(这是判断字符串) 去usart.h  FLAG找 
}

main.c – USART1_IRQHandler(void)

#include "stm32f10x.h"                  // Device header
#include "usart.h"
#include "led.h"
#include "exti.h"void delay(uint16_t time)
{uint16_t i = 0;while(time--){i=12000;while(i--);}
}int main(void)
{ Usart_Init();LED_Init();GPIO_SetBits( GPIOC,  GPIO_Pin_13);//初始化C13电平为高电平 灯不亮while(1){}
}//4. 中断服务函数(在启动头文件里 有weak标志 属于重定向函数)
void USART1_IRQHandler(void)
{char temp;//获得串口中断标志位         接收数据寄存器非空标志位if( USART_GetITStatus( USART1,  USART_IT_RXNE) != RESET) //发生了中断 开始接收数据{			 temp = USART_ReceiveData( USART1);if(temp == 'O'){GPIO_ResetBits( GPIOC,  GPIO_Pin_13);//串口助手发送过来字符'O' 开灯USARTSendString(  USART1, "LED IS OK");//调用自己写的串口发送字符串函数			}if(temp == 'C'){GPIO_SetBits( GPIOC,  GPIO_Pin_13);//关灯USARTSendString(  USART1, "LED IS DOWN"); }		}
}

在这里插入图片描述

串口接收不定长数据

STM32串口USART1接收字符串

串口接收不定长数据的几种方式

STM32串口接收一帧数据方法(处理一帧数据中所需内容)

STM32单片机串口空闲中断接收不定长数据

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32通用定时器(原理、结构体、库函数、定时器中断每秒闪烁一次灯) —— 时钟源、分频值、重装载值

参考&#xff1a;stm32定时器与定时器中断 作者&#xff1a;打酱油的 发布时间&#xff1a; 2021-04-11 01:04:09 网址&#xff1a;https://blog.csdn.net/weixin_46098612/article/details/115493737 参考&#xff1a;stm32通用定时器结构体函数定时器实现led闪烁 作者&#x…

关于错误error C4430 error C2365 error C2078 error C2440 error C2143的处理。

关于错误error C4430 error C2365 error C2078 error C2440 error C2143的处理。 楼主在公司接手了一段代码。编译的时候发现一个很奇怪的问题&#xff0c;就是获取最新代码的时候能编译通过&#xff0c;然后下次就编译不通过了&#xff0c;提示如下错误。 后来发现问题出在std…

STM32端口复用和端口重映射

参考&#xff1a;stm32 端口复用和重映射 作者&#xff1a;点灯小哥 发布时间&#xff1a; 2021-03-09 13:49:19 网址&#xff1a;https://blog.csdn.net/weixin_46016743/article/details/114581032 目录端口复用1.什么是端口复用2. 如何配置端口复用(以PA9、PA10串口为例)端口…

Scala学习:Curry化的函数

2019独角兽企业重金招聘Python工程师标准>>> 在第1章&#xff0c;我们说过Scala允许你创建新的“感觉像是原生语言支持”的控制抽象。尽管到目前你已经看到的例子都的确是控制抽象&#xff0c;不过任何人都不会 误以为它们是原生语言支持的。为了搞明白如何让控制抽…

js 获取session_Python实战案例:这是你见过的最详细的JS加密登录某博

0x00 抓包分析简单的搜索之后发现&#xff0c;很多参数都是登陆上面这个请求返回的值&#xff0c;这个请求在输入完账号光标到达密码框时就会生成!0x01 加密逻辑分析搜索su可以很快找到加密的位置&#xff0c;上图看到e.su和e.sp都是由sinaSSOEncoder这个函数生成的&#xff0c…

STM32通用定时器输出PWM控制舵机 —— 重装载值、比较值、当前值

参考&#xff1a;stm32 定时器输出PWM原理及工作原理控制舵机 作者&#xff1a;点灯小哥 发布时间&#xff1a; 2021-03-09 23:17:52 网址&#xff1a;https://blog.csdn.net/weixin_46016743/article/details/114606662 参考&#xff1a;stm32之pwm输出 作者&#xff1a;打酱油…

STM32系统定时器SysTick(只能向下递减)延时闪烁灯

参考&#xff1a;stm32 系统定时器 SysTick 作者&#xff1a;点灯小哥 发布时间&#xff1a; 2021-03-10 13:46:00 网址&#xff1a;https://blog.csdn.net/weixin_46016743/article/details/114633245 参考&#xff1a;stm32之系统定时器 作者&#xff1a;打酱油的&#xff1b…

WMS学习笔记:1.尝试加载WMS

1.首先找一个可用的WMS栅格地图服务&#xff1a;http://demo.cubewerx.com/demo/cubeserv/cubeserv.cgi 获取GetCapabilities&#xff1a; http://demo.cubewerx.com/demo/cubeserv/cubeserv.cgi?serviceWMS&requestGetCapabilities 2.在ArcGIS中添加GIS空间服务 2.在ArcC…

mysqli 扩展_MySQLi的优势

1. 功能增加了2&#xff0c;效率大大增加(以后的PHP项目改成mysqli)3&#xff0c;更稳定mysqli使用面向对象技术&#xff0c;但也支持过程化的使用方式mysqli扩展中给我提供了三个类&#xff1a;1. mysqli和连接有关的类2. mysqli_result表达了对数据库的查询所返回的结果集。 …

STM32F4开发板硬件简介

更多干货推荐可以去牛客网看看&#xff0c;他们现在的IT题库内容很丰富&#xff0c;属于国内做的很好的了&#xff0c;而且是课程刷题面经求职讨论区分享&#xff0c;一站式求职学习网站&#xff0c;最最最重要的里面的资源全部免费&#xff01;&#xff01;&#xff01;点击进…

演示:EIGRP非等价负载均衡(故障分析与解决篇)

演示&#xff1a;EIGRP非等价负载均衡的故障分析与排除故障背景&#xff1a;在如下图14.20所示的网络环境&#xff0c;工程师完成了环境中所有路由器的接口地址配置有EIGRP动态路由协议的启动&#xff0c;目前每台EIGRP路由器邻居关系正常&#xff0c;路由学习正常&#xff0c;…

STM32超声波模块测距串口输出/通用定时器中断并输出PWM控制舵机/系统定时器延时

参考&#xff1a;stm32 超声波模块 原理 实现测距 舵机使用 作者&#xff1a;点灯小哥 发布时间&#xff1a; 2021-03-10 19:37:16 网址&#xff1a;https://blog.csdn.net/weixin_46016743/article/details/114643703 目录效果展示超声波传感器原理超声波测距编程步骤代码编写…

STM32F103五分钟入门系列(二)GPIO的七大寄存器+GPIOx_LCKR作用和配置

摘自&#xff1a;STM32F103五分钟入门系列&#xff08;二&#xff09;GPIO的七大寄存器GPIOx_LCKR作用和配置 作者&#xff1a;自信且爱笑‘ 发布时间&#xff1a; 2021-05-01 12:08:32 网址&#xff1a;https://blog.csdn.net/Curnane0_0/article/details/116276876?spm1001.…

STM32使用IIC总线通讯协议在OLED屏幕上显示字符串、汉字、图像(硬件IIC)

参考&#xff1a;基于STM32-Oled&#xff08;IIC&#xff09;的使用 作者&#xff1a;奋斗的小殷 发布时间&#xff1a; 2021-05-07 13:09:26 网址&#xff1a;https://blog.csdn.net/boybs/article/details/116465668 目录IIC总线简介IIC协议简介IIC总线系统结构IIC总线物理层…

推送公司今日菜单内容到手机

此文已由作者张耕源授权网易云社区发布。欢迎访问网易云社区&#xff0c;了解更多网易技术产品运营经验。自从公司的易信公众服务号有了查询今日菜单的功能&#xff0c;自己慢慢养成了每次去吃饭前查一 下各个窗口的菜谱&#xff0c;再决定去哪吃饭的习惯。不过这个功能使用的越…

Android开发中如何创建自定义对话框

背景&#xff1a; 无论是Android&#xff0c;还是其他什么平台&#xff0c;对话框的主要形式都是弹出&#xff0c;或者我们可以说是一个在当前活动中打开的提示&#xff0c;来执行一些操作或实现一些功能。 你可以用一个对话框来问用户以确认一个行动&#xff0c;向用户通告一个…

树莓派接入公网(花生壳)

参考&#xff1a;树莓派接入公网 作者&#xff1a;图触靓 发布时间&#xff1a; 2020-12-22 17:28:19 网址&#xff1a;https://blog.csdn.net/bhbhhyg/article/details/107994829 目录为什么要接入公网接入公网的方法&#xff08;花生壳&#xff09;1、下载工具huashenke2、安…

cant find module express

安装express成功&#xff0c;测试一个应用如下&#xff1a;但是&#xff0c;运行却报错&#xff0c;如下图&#xff1a;说是express找不到&#xff0c;不应该啊&#xff01;命令都能用啊&#xff01;表面的原因是因为我install express用的是-g。参考链接如下&#xff1a;http:…

Linux虚拟机sqlite数据库安装教程、命令实现sqlite

参考&#xff1a;Linux虚拟机sqlite数据库安装教程 作者&#xff1a;图触靓 发布时间&#xff1a; 2021-04-08 19:07:56 网址&#xff1a;https://blog.csdn.net/bhbhhyg/article/details/115528254 一、在官网下载压缩包到window里面 SQLite官网下载地址 如图我们下载sqlite-a…

SecureCRT 使用 rz命令提示waiting to receive.**B0100000023be50

SecureCRT 远程连接Linux服务器&#xff0c;使用 rz命令提示waiting to receive.**B0100000023be50&#xff0c;或者使用sz命令提示&#xff1a; **B0100000023be50 解决方法设置如下&#xff1a; 转载于:https://www.cnblogs.com/pandaly/p/9898173.html