10:【stm32】USART与串口通信一:USART(上)

news2024/11/15 8:37:59

USART(上)

  • 1、串口通信
    • 1.1、简介
    • 1.2、数据帧
      • 1.2.1、简介
      • 1.2.2、校验规则
      • 1.2.3、停止位的长度
    • 1.3、异步通信的波特率
      • 1.3.1、同步通信
      • 1.3.2、异步通信
      • 1.3.3、硬件流控
  • 2、USART
    • 2.1、简介
    • 2.2、工作的原理
    • 2.3、相关寄存器
  • 3、标准库编程
    • 3.1、编程接口
    • USART_Init()
    • USART_Cmd
    • USART_SendData
    • USART_ReceiveData
    • USART_GetFlagStatus
  • 4、程序代码
    • 4.1、使用串口发送数据
    • 4.2、使用串口接收数据

1、串口通信

1.1、简介

   通过串口接收/发送数据。其中串口拥有TX(发送数据)和RX(接收数据)引脚。2个设备通过串口接收/发送数据时,这2个引脚需要交替连接。

在这里插入图片描述

1.2、数据帧

1.2.1、简介

   串口接收/发送的数据是以数据帧进行传输的,那什么是数据帧呢?数据帧 = 起始位+数据位+停止位。起始位是低电平0,停止位是高电平1,而数据位可以是8位/9位。其中数据位中还包含1位校验位(有程序员自己规定)。而传输的时候是先传输数据帧的低位,在传高位

在这里插入图片描述
数据进行传输时,如果不是连续传输时,则2个数据帧之间还有空闲位,它为高电平。

在这里插入图片描述

1.2.2、校验规则

   校验规则分为:奇校验和偶校验,就是查询1的个数。

在这里插入图片描述
例如:发送方设定为奇校验,并且是9位数据位。当发送时,前8位数据位中有偶数个1,那么最后1位校验位则是1,这样就凑成了奇数个1。如果传输时出现了错误,接收方进行校验时,则检测到了偶数个1,则代表传输出现了错误。都是不能检测出是那一位出现了错误。

在这里插入图片描述

1.2.3、停止位的长度

   停止位的长度可以是0.5位/1位/1.5位 /2位。可以由程序员规定。

在这里插入图片描述

1.3、异步通信的波特率

1.3.1、同步通信

   2个设备进行同步通信时,则2个设备之间拥有1个时钟线(CLK)和1个数据线,例如 I2C。当时钟线位低电平时,主设备给数据线上写数据,当位高电平时,不能在写数据,从设备进行数据的读取。从设备读取成功后,给主设备返回一个应答信号,主设备继续写数据。这就是同步通信。

在这里插入图片描述

1.3.2、异步通信

   异步通信和同步通信不同,没有时钟线,拥有2个数据线进行发送(TX)和接收(RX)数据。控制串口通信发送数据的速度是波特率和硬件流控。波特率就是没1s发送码元的个数(9600代表1s传输了9600个码元,传输1个码元占用了0.104ms),在计算机中每一位都代表一个码元。波特率越大,传输速率越快。

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

异步通信没有时钟线,那么通信是怎样数据传输的喃?答案是:进行数据的采集,例如当接收方采用相同的9600的波特率0时,就代表它采集间隔时间是0.104ms。接收方在空闲时进行高密度采集,当采集到一个下降沿时,代表后面的是数据了,所以间隔1.5个码元进行采集(也是高密度采集),刚好采集到数据位第一个码元的正中间,然后后面就每隔0.104ms进行采集。

1.3.3、硬件流控

   硬件流控的作用主要是防止传输的数据丢失,当传输一个数据帧时,等待接收方返回一个反馈信号。如果反馈的是一个低电平,代表接收方可以继续接收数据,然后发送方继续发送数据。

在这里插入图片描述

2、USART

2.1、简介

   USART也是STM32中的一个片上外设,用于异步串口通信。STM32F103C8T6一共有3个USART,分别为USART1,USART2,USART3。其中USART1挂载在RCC_APB2时钟总线上,所以使用时需要打开时钟。而2和3挂载在RCC_APB1时钟总线上面。

在这里插入图片描述

2.2、工作的原理

   当单片机通过串口向外发送数据时,CPU向发送数据寄存器TDR写入数据,写入的时候是并行写入,然后进入并行转串行。打开发送控制器,通过TX引脚进行数据的串行发送。当单片机进行数据的接收时,RX接收来的串行数据,通过串行转并行,写入到接收寄存器RDR,然后CPU进行数据的读取。

在这里插入图片描述

2.3、相关寄存器

  如下图为USART的结构图,他拥有如此多的寄存器,那这些寄存器拥有上面作用喃?交具体我们分析下

在这里插入图片描述

  • CR:配置寄存器
    在这里插入图片描述

    UE:USART的总开关,为0,USART禁止,为1,USART打开。需要配置波特率时,也需要打开这个开关。
    TXE: 数据传输开关
    RXE:数据接收开关
    M:数据位长度选择,M = 0:数据位为8位,M = 1:数据位为9位
    STOP:停止位长度选择,00为1位,01为0.5位,10为2位,11为1.5位
    PE/PCE:奇偶校验使能,0关闭校验位,1打开校验位
    PS:奇偶选择位,0偶校验,1奇校验
    
  • BRR:波特率寄存器

    在这里插入图片描述
    主要是用来配置分频器的系数,波特率 = RCC时钟/(分频系数 * 16)。例如需要9600波特率,选用72MHz时钟时,算出分频系数为468.75。
    在这里插入图片描述

  • SR:状态寄存器

在这里插入图片描述

   TXE:发送数据寄存器空,当发送数据寄存器TDR为空时,TXE为1,代表可以向TDR写入数据
   RXNE:接收数据寄存器非空,为0,代表接收数据寄存器RDR没有数据,为1,代表接收数据寄存器有数据,可以把数据读出来
   TC(TDR空&&移位寄存器空):发送完成寄存器,为0代表还在发送,为1代表发送完成
   PE:奇偶校验错,为1,代表传输有出差
   FE:帧格式错,为1,代表帧格式出错
   NE:噪声错,为1,代表信号里面有噪声
   ORE:过载错,为1,代表没有及时的将RDR里面的数据读出来,导致里面的数据被覆盖丢失。

3、标准库编程

3.1、编程接口

   如下图所示,为常用的标准库编程接口。

在这里插入图片描述

  • USART_Init()

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

    USART_InitTypeDef USARTInitStruct;
    USARTInitStruct.USART_WordLength = USART_WordLength_8b;
    USARTInitStruct.USART_Parity = USART_Parity_No;
    USARTInitStruct.USART_StopBits = USART_StopBits_1;
    USARTInitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
    USARTInitStruct.USART_BaudRate = 9600;
    USARTInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_Init(USART1 ,&USARTInitStruct);
    
  • USART_Cmd

    在这里插入图片描述
    其实就是CR寄存器中的UE,USART的使能开关。

    USART_Cmd(USART1 ,ENABLE);//使能USART1
    
  • USART_SendData

    在这里插入图片描述

    USART_SendData(USART1,0x5a);//数据是16位,2个字节
    
  • USART_ReceiveData

    在这里插入图片描述

    uint8_t a = USART_ReceiveData(USART1); //将读取到的数据存储在变量a中
    
  • USART_GetFlagStatus

    在这里插入图片描述

    while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
    while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET);
    if(USART_GetFlagStatus(USART1,USART_FLAG_PE)==SET)
    {
    }
    

4、程序代码

  我们使用USART1让STM32和上位机进行串口通信。

4.1、使用串口发送数据

   USART1的Tx连接的引脚是PA9,Rx连接的引脚是PA10,我们为了增加一下难度,我们使用USART1引脚的重映射。查阅数据手册如下。
在这里插入图片描述
代码①:发送一个字节

/*发送一个字节*/
#include "stm32f10x.h"
#include "stm32f10x_pal.h"

int main(void)
{
	//1 对PB6,PB7进行配置
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	GPIO_InitTypeDef GPIOInitStruct;
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_6;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//Tx
	GPIOInitStruct.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(GPIOB,&GPIOInitStruct);
	
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_7;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_IPU;//Rx
	GPIO_Init(GPIOB,&GPIOInitStruct );
	
	//2 使能AFIO的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	//3 USART1的复用重映射
	GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);//对USART1进行重映射
	
	//4 使能USART1的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 ,ENABLE);//打开RCC时钟上面的USART1
	//5 对USART1进行配置
	USART_InitTypeDef USARTInitStruct;
	USARTInitStruct.USART_WordLength = USART_WordLength_8b;//数据位为8位
	USARTInitStruct.USART_Parity = USART_Parity_No;        //没有校验位
	USARTInitStruct.USART_StopBits = USART_StopBits_1;     //1位停止位
	USARTInitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//输入输出
	USARTInitStruct.USART_BaudRate = 9600;										//9600波特率
    USARTInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//没有硬件流控
	
	USART_Init(USART1 ,&USARTInitStruct);

	USART_Cmd(USART1 ,ENABLE);                                 //使能USART1
	
	
	//1. 等待TDR清空
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);//TDR非空,TXE为0,则卡在这个循环
	
	//2. 写入要发送的数据
	USART_SendData(USART1,0x50);
	
	//3. 等待数据发送完成
	while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET); //发送完毕后,TC为1
	while(1)
	{
		
	}
}

在这里插入图片描述

代码②:发送一个字节数组

#include "stm32f10x.h"
#include "stm32f10x_pal.h"

int main(void)
{
	//1 对PB6,PB7进行配置
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	GPIO_InitTypeDef GPIOInitStruct;
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_6;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//Tx
	GPIOInitStruct.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(GPIOB,&GPIOInitStruct);
	
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_7;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_IPU;//Rx
	GPIO_Init(GPIOB,&GPIOInitStruct );
	
	//2 使能AFIO的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	//3 USART1的复用重映射
	GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);//对USART1进行重映射
	
	//4 使能USART1的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 ,ENABLE);//打开RCC时钟上面的USART1
	//5 对USART1进行配置
	USART_InitTypeDef USARTInitStruct;
	USARTInitStruct.USART_WordLength = USART_WordLength_8b;//数据位为8位
	USARTInitStruct.USART_Parity = USART_Parity_No;        //没有校验位
	USARTInitStruct.USART_StopBits = USART_StopBits_1;     //1位停止位
	USARTInitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//输入输出
	USARTInitStruct.USART_BaudRate = 9600;										//9600波特率
    USARTInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//没有硬件流控
	
	USART_Init(USART1 ,&USARTInitStruct);

	USART_Cmd(USART1 ,ENABLE);                                 //使能USART1
	
	
//	//1. 等待TDR清空
//	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);//TDR非空,TXE为0,则卡在这个循环
//	
//	//2. 写入要发送的数据
//	USART_SendData(USART1,0x50);
//	
//	//3. 等待数据发送完成
//	while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET); //发送完毕后,TC为1

		uint8_t a[] = {0,1,2,3,4,5};
		uint8_t i;
		for(i = 0 ;i < (sizeof(a)/sizeof(uint8_t));i++)
		{
			while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
			USART_SendData(USART1,a[i]);
		}
		while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);
		
	while(1)
	{
		
	}
}

在这里插入图片描述代码③:发送一个字符数组

#include "stm32f10x.h"
#include "stm32f10x_pal.h"

int main(void)
{
	//1 对PB6,PB7进行配置
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	GPIO_InitTypeDef GPIOInitStruct;
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_6;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//Tx
	GPIOInitStruct.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(GPIOB,&GPIOInitStruct);
	
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_7;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_IPU;//Rx
	GPIO_Init(GPIOB,&GPIOInitStruct );
	
	//2 使能AFIO的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	//3 USART1的复用重映射
	GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);//对USART1进行重映射
	
	//4 使能USART1的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 ,ENABLE);//打开RCC时钟上面的USART1
	//5 对USART1进行配置
	USART_InitTypeDef USARTInitStruct;
	USARTInitStruct.USART_WordLength = USART_WordLength_8b;//数据位为8位
	USARTInitStruct.USART_Parity = USART_Parity_No;        //没有校验位
	USARTInitStruct.USART_StopBits = USART_StopBits_1;     //1位停止位
	USARTInitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//输入输出
	USARTInitStruct.USART_BaudRate = 9600;										//9600波特率
    USARTInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//没有硬件流控
	
	USART_Init(USART1 ,&USARTInitStruct);

	USART_Cmd(USART1 ,ENABLE);                                 //使能USART1
	
/*发送一个字节*/	
//	//1. 等待TDR清空
//	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);//TDR非空,TXE为0,则卡在这个循环
//	
//	//2. 写入要发送的数据
//	USART_SendData(USART1,0x50);
//	
//	//3. 等待数据发送完成
//	while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET); //发送完毕后,TC为1

/*发送一个字节数组*/
//		uint8_t a[] = {0,1,2,3,4,5};
//		uint8_t i;
//		for(i = 0 ;i < (sizeof(a)/sizeof(uint8_t));i++)
//		{
//			while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
//			USART_SendData(USART1,a[i]);
//		}
//		while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);
/*发送一个字符*/
//	//1. 等待TDR清空
//	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);//TDR非空,TXE为0,则卡在这个循环
//	
//	//2. 写入要发送的数据
//	USART_SendData(USART1,'a');
//	
//	//3. 等待数据发送完成
//	while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET); //发送完毕后,TC为1

		uint8_t a[] = "hello world";
		uint8_t i;
		for(i = 0 ;i < sizeof(a)/sizeof(uint8_t) ;i++)
		{
			while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
			USART_SendData(USART1,a[i]);
		}
		while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);

		
	while(1)
	{
		
	}
}

在这里插入图片描述

4.2、使用串口接收数据

/*通过接收到的数据进行对LED灯的控制*/
#include "stm32f10x.h"
#include "stm32f10x_pal.h"

int main(void)
{
	//1 对PB6,PB7进行配置
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	GPIO_InitTypeDef GPIOInitStruct;
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_6;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//Tx
	GPIOInitStruct.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(GPIOB,&GPIOInitStruct);
	
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_7;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_IPU;//Rx
	GPIO_Init(GPIOB,&GPIOInitStruct );
	
	//2 使能AFIO的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	//3 USART1的复用重映射
	GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);//对USART1进行重映射
	
	//4 使能USART1的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 ,ENABLE);//打开RCC时钟上面的USART1
	//5 对USART1进行配置
	USART_InitTypeDef USARTInitStruct;
	USARTInitStruct.USART_WordLength = USART_WordLength_8b;//数据位为8位
	USARTInitStruct.USART_Parity = USART_Parity_No;        //没有校验位
	USARTInitStruct.USART_StopBits = USART_StopBits_1;     //1位停止位
	USARTInitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//输入输出
	USARTInitStruct.USART_BaudRate = 9600;										//9600波特率
    USARTInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//没有硬件流控
	
	USART_Init(USART1 ,&USARTInitStruct);

	USART_Cmd(USART1 ,ENABLE);                                 //使能USART1
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_13;
	GPIOInitStruct .GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_Init(GPIOC,&GPIOInitStruct);
	
	uint8_t a;
	
	while(1)
	{
		while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) == RESET);//RXNE为0代表没有数据
	    a = USART_ReceiveData(USART1);
		if(a == '1')
		{
			GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET);//开灯
		}
		if(a == '0')
		{
			GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);//关灯
		}
	}
}

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

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

相关文章

day16-测试自动化之selenium的PO模式

一、PO模式介绍 PO&#xff08;Page Object&#xff09;模式是一种在自动化测试中常用的设计模式&#xff0c;将页面的每个元素封装成一个对象&#xff0c;通过操作对象来进行页面的交互。 一般分为六个版本&#xff0c;现在大部分企业都用的V4版本&#xff0c;三层结构…

redis面试(十六)公平锁释放和排队加锁

锁释放 RedissonFairLock.unlockInnerAsync()方法 这和加锁的逻辑没有太大区别 也就是说在客户端A他释放锁的时候&#xff0c;也会走while true的脚本逻辑&#xff0c;看一下有序集合中的元素的timeout时间如果小于了当前时间&#xff0c;就认为他的那个排队就过期了&#xf…

Spring自动注册-<bean>标签和属性解析

xml文件中最常见也最核心的就是<bean>,<Import>,<beans>,<alias>标签,关于它们的解析主要是BeanDefinitionParserDelegate类中.<bean>标签的解析最为复杂和重要. <bean>标签 processBeanDefinition(ele, delegate)方法中,主要是是对…

数据库管理-Redis

数据库管理-Redis 一、关系型数据库和非关系型数据库1、关系型数据库&#xff08;Relational Database Management System, RDBMS&#xff09;&#xff1a;2、非关系型数据库&#xff08;NoSQL Database Management System&#xff09;&#xff1a; 二、redis简述 redis是把数据…

苦WPS云盘已久矣

主要因为软件更新后&#xff0c;设置位置都会跑到其他地方 打开wps客户端后&#xff0c;点击电脑底部任务栏的云朵图标。 2. 找到存储位置后&#xff0c;点击“更换位置”。 来自https://www.wps.cn/mlearning/question/detail/id/333165.html

Java | Leetcode Java题解之第328题奇偶链表

题目&#xff1a; 题解&#xff1a; class Solution {public ListNode oddEvenList(ListNode head) {if (head null) {return head;}ListNode evenHead head.next;ListNode odd head, even evenHead;while (even ! null && even.next ! null) {odd.next even.nex…

编程学习笔记秘籍:开启高效学习之旅

引言&#xff1a; “计算机科学教育不能使人成为程序员&#xff0c;就像学画笔和颜料不能使人成为画家一样。”——埃里克雷蒙德。在当今数字化的时代&#xff0c;编程如同一把神奇的钥匙&#xff0c;能够打开无数机遇的大门。然而&#xff0c;编程知识的海洋广阔无垠&#xff…

正也科技:医药营销管理数字化建设的重要性及其迭代方向

第三届MAH合作与创新大会暨浙江省医药产业博览会于上周在杭州圆满结束。会议汇集了众多医药领域的专家、行业领袖和企业家&#xff0c;共同探讨医药行业的转型之路与实战经验。在中国医药新趋势分论坛&#xff0c;与会人员重点讨论了当前中国医药产业在新环境下所面临的挑战、变…

文心快码 Baidu Comate 前端工程师观点分享:行业现状(二)

本系列视频来自百度工程效能部的前端研发经理杨经纬&#xff0c;她在由开源中国主办的“AI编程革新研发效能”OSC源创会杭州站105期线下沙龙活动上&#xff0c;从一款文心快码&#xff08;Baidu Comate&#xff09;前端工程师的角度&#xff0c;分享了关于智能研发工具本身的研…

Hackademic.RTB1靶机复现

查看靶机的MAC地址 使用nmap进行扫描 使用dirsearch进行目录扫描 网站登录 点击紫色字体 进一步进行目录扫描 进行拼接 拼接wp-content 拼接wp-includes 点击Got root 测试发现不存在SQL注入 点击posted in Uncategorized 测试发现存在SQL注入 测试数据库 python sqlmap.py…

Linux-Shell三剑客grep,awk,sed-08

awk、grep、sed是linux操作文本的三大利器&#xff0c;合称文本三剑客&#xff0c;也是必须掌握的linux命令之一。三者的功能都是处理文本&#xff0c;但侧重点各不相同&#xff0c;其中属awk功能最强大&#xff0c;但也最复杂。grep更适合单纯的查找或匹配文本&#xff0c;sed…

UDP通信如何测试使用

用户数据报协议(User Datagram Protocol,UDP)是一种无连接的传输层通信协议,用于互联网应用程序。与TCP(传输控制协议)不同,UDP提供了较少的服务并且不保证数据的可靠传输,但它以更少的系统资源消耗和更低的延迟作为交换,这使得UDP非常适合那些对速度要求高而对数据丢…

【LLM之RAG】GraphRAG论文阅读笔记

研究背景 本文探讨了大型语言模型&#xff08;LLM&#xff09;如何通过从外部知识源检索相关信息来回答关于私有或之前未见过的文档集合的问题。特别指出&#xff0c;传统的检索增强生成&#xff08;RAG&#xff09;系统在处理全局问题时存在局限性&#xff0c;例如问整个文本…

四种应用层协议——MQTT、CoAP、WebSockets和HTTP——在工业物联网监控系统中的性能比较

目录 摘要(Abstract) 实验设置 实验结果 节选自《A Comparative Analysis of Application Layer Protocols within an Industrial Internet of Things Monitoring System》&#xff0c;作者是 Jurgen Aquilina、Peter Albert Xuereb、Emmanuel Francalanza、Jasmine Mallia …

java计算机毕设课设—CRM客户关系管理系统((附源码、文章、相关截图、部署视频)

这是什么系统&#xff1f; java计算机毕设课设—CRM客户关系管理系统&#xff08;(附源码、文章、相关截图、部署视频) CRM客户关系管理系统是一种基于Java开发的系统&#xff0c;旨在帮助企业更有效地管理与客户的互动。该系统通过优化客户信息的组织和分析&#xff0c;增强…

【Electron】npm安装Electron项目失败报错问题和解决办法

前言 闲来无事&#xff0c;便想着研究一下Electron&#xff0c;没想到安装直接就卡住了 问题 npm ERR! RequestError: Hostname/IP does not match certificates altnames: Host: npm.taobao.org. is not in the certs altnames: DNS:*.tbcdn.cn, DNS:*.taobao.com, DNS:*.al…

pygame小游戏

代码存在一些bug&#xff0c;感兴趣可自行修改&#xff0c;游戏运行后玩法与吃金币游戏类似。&#xff08;代码及结果比较粗糙&#xff0c;仅供参考&#xff09; 注&#xff1a;&#xff08;图片、音乐、音效文件老是上传上传不上&#xff0c;想要可私&#xff0c;也可以自己找…

CentOS 7 安装详细教程

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; CentOS 7 是一个稳定的企业级 Linux 发行版&#xff0c;广泛用于服务器环境。CentOS 7 是基于 Red Hat Enterprise Linux (RHEL) 构建的企业级 Linux 发行版&#xff0c;提供免费的、开源的操作系统&#xf…

JVM-Java虚拟机-一文读懂-小白秒懂,老鸟进阶,必考面经

目录 JVM定义 Java Virtual Machine组成结构 各部分详解 0、类加载器 1、栈是运行的单位&#xff0c;堆是存储的单位 2、栈中存放各个栈帧 3、方法区——多线程共享区域 JVM定义 运行Java程序的平台内存结构、 垃圾回收、 类加载、 性能调优、 JVM 自身优化技术、 执行引…

【Web前端】vue3整合eslint约束代码格式

一、整合eslint 整合eslint的两种方式&#xff1a; 在已有项目中整合eslint&#xff1a;# 安装eslint及其vue插件即可 npm i -D eslint eslint-plugin-vue创建项目时整合eslint&#xff1a; 提示 是否引入ESLint用于代码质量检测 时选择 是# 创建vue3项目 npx create-vue # 下…