2.4G通信

2023-05-16

文章目录

  • 2.4G无线通信实验
  • 一、模块简介
  • 二、Enhanced ShockBurstTM模式介绍
  • 三. 编程
    • 1.初始化IO口
    • 2.Enhanced ShockBurstTM发送流程
    • 3.Enhanced ShockBurstTM发送模式初始化
    • 4.Enhanced ShockBurstTM接收流程
    • 5.Enhanced ShockBurstTM接收模式初始化
    • 6.读函数
    • 7.写函数
    • 8.主函数
  • 总结


2.4G无线通信实验

2.4G无线通信一般是通过两个设备进行通信,最高速率可达到2Mbps,抗干扰能力强。一般的可以进行1对6的通信,一般是1个接收,6个发送。


一、模块简介

本次2.4G通信使用的是NRF24L01,如图所示
在这里插入图片描述
CE:模式控制线。在 CSN为低的
情况下,CE 协同CONFIG 寄存器
共同决定NRF24L01 的状态(参照
NRF24L01 的状态机)
CSN:SPI片选线
SCK:SPI时钟线
MOSI:SPI数据线(主机输出,从机输入)
MISO:SPI数据线(主机输入,从机输出)
IRQ:中断信号线。中断时变为低电平,在以下三种情况变低:Tx FIFO 发完并且收到ACK(使能ACK情况下)、Rx FIFO 收到数据、达到最大重发次数。
在这里插入图片描述
空闲状态SCK为0,CPOL=0;数据在时钟第一个时间边沿采集,CPHA=0;
Cn:SPI命令位
Sn:STATUS寄存器位
Dn:数据位( MSB,多字节传输时,低字节在前)

在这里插入图片描述
其中,收发模式又有: Enhanced ShockBurstTM收发模式和ShockBurstTM收发模式,只有Enhanced ShockBurstTM收发模式支持自动ACK和自动重发。开启自动ACK,则默认选择Enhanced模式。一般的都是用的 Enhanced ShockBurstTM收发模式。
PS:在接收数据时,自动把字头和CRC校验码移去。在发送数据时,自动加上字头和CRC校验码,在发送模式下,置CE为高,至少10us,将使能发送过程。也就是发送模式时,PWR_UP由高变低时,需要有个至少10us的延时。

二、Enhanced ShockBurstTM模式介绍

Enhanced ShockBurst TM 模式:发送方要求终端设备在接收到数据后有应答信号,以便发送方检测有无数据丢失,一旦丢失则重发数据。重发数据设置在地址为 0X04 的数据重发设置寄存器 用于设置其重发次数及设置在未收到应答信号后等待重发的时间。
在接收模式下,最多可以接收6路不通的数据。每一个数据通道使用不同的地址,但是共用相同的频道。也就是说6 个不同的NRF24L01 设置为发送模式后可以与同一个设置为接收模式的NRF24L01 进行通讯,而设置为接收模式的NRF24L01可以对这6 个发射端进行识别。数据通道0 是唯一的一个可以配置为40 位自身地址的数据通道。1~5 数据通道都为8 位自身地址和32 位公用地址(由通道1设置)。所有的数据通道都可以设置为Enhanced ShockBurst 模式。
在这里插入图片描述
在接收端,确认收到数据后记录地址,并以此地址为目标地址发送应答信号。

在发送端,通道0被用作接收应答信号,因此通道0的接收地址要与发送地址端地址相等,以确保接收到正确的应答信号。
PS:通道0的地址不能更改,通道1-5的地址只有最后两位能进行更改。

三. 编程

1.初始化IO口

//初始化24L01的IO口

void NRF24L01_Init(void)
{  
	GPIO_InitTypeDef GPIO_InitStructure;
	SPI_InitTypeDef  SPI_InitStructure; 
	
 	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE );	
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOC, &GPIO_InitStructure); 
	GPIO_SetBits(GPIOC,GPIO_Pin_4);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU  ;   //上拉输入
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4);
	SPI1_Init();    		//初始化SPI
		
	SPI_Cmd(SPI1, DISABLE); // 
	
	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;		//设置SPI工作模式:设置为主SPI
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;		//设置SPI的数据大小:SPI发送接收8位帧结构
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;		//选择了串行时钟的稳态:时钟悬空低电平
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;	//数据捕获于第一个时钟沿
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;		//NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;		//定义波特率预分频的值:波特率预分频值为256
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;	//指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
	SPI_InitStructure.SPI_CRCPolynomial = 7;	//CRC值计算的多项式
	SPI_Init(SPI1, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器

	
	NRF24L01_CE=0; 	//使能24L01
	NRF24L01_CSN=1;	//SPI片选取消	 	
}

注意:NRF24L01与W25Q64和SD卡共用SPI1,注意要分时复用!!

2.Enhanced ShockBurstTM发送流程

  1. 把地址和要发送的数据按时序送入NRF24L01;
  2. 配置CONFIG寄存器,使之进入发送模式;
  3. 微控制器把CE置高(至少10us),激发Enhanced ShockBurstTM发射;
  4. Enhanced ShockBurstTM发射:① 给射频前端供电;②射频数据打包(加字头、CRC校验码); ③ 高速发射数据包; ④发射完成,NRF24L01进入空闲状态。
//启动NRF24L01发送一次数据
//txbuf:待发送数据首地址
//返回值:发送完成状况
u8 NRF24L01_TxPacket(u8 *txbuf)
{
	u8 sta;
 	SPI1_SetSpeed(SPI_BaudRatePrescaler_8);//spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)   
	NRF24L01_CE=0;
  	NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF  32个字节
 	NRF24L01_CE=1;//启动发送	   
	while(NRF24L01_IRQ!=0);//等待发送完成
	sta=NRF24L01_Read_Reg(STATUS);  //读取状态寄存器的值	   
	NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中断标志
	if(sta&MAX_TX)//达到最大重发次数
	{
		NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器 
		return MAX_TX; 
	}
	if(sta&TX_OK)//发送完成
	{
		return TX_OK;
	}
	return 0xff;//其他原因发送失败
}

3.Enhanced ShockBurstTM发送模式初始化

1)写Tx 节点的地址 TX_ADDR
2)写Rx 节点的地址(主要是为了使能Auto Ack) RX_ADDR_P0
3)使能AUTO ACK EN_AA
4)使能PIPE 0 EN_RXADDR
5)配置自动重发次数 SETUP_RETR
6)选择通信频率 RF_CH
7)配置发射参数(低噪放大器增益、发射功率、无线速率) RF_SETUP
8)配置24L01 的基本参数以及切换工作模式 CONFIG。

//该函数初始化NRF24L01到TX模式
//设置TX地址,写TX数据宽度,设置RX自动应答的地址,填充TX发送数据,选择RF频道,波特率和LNA HCURR
//PWR_UP,CRC使能
//当CE变高后,即进入RX模式,并可以接收数据了		   
//CE为高大于10us,则启动发送.	 
void NRF24L01_TX_Mode(void)
{														 
	NRF24L01_CE=0;	    
  	NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);//写TX节点地址 
  	NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK	  

  	NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01);     //使能通道0的自动应答    
  	NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址  
  	NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
  	NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);       //设置RF通道为40
  	NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);  //设置TX发射参数,0db增益,2Mbps,低噪声增益开启   
  	NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e);    //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
	NRF24L01_CE=1;//CE为高,10us后启动发送
}

4.Enhanced ShockBurstTM接收流程

  1. 配置接收地址和要接收的数据包大小;
  2. 配置CONFIG寄存器,使之进入接收模式,把CE置高。
  3. 130us后,NRF24L01进入监视状态,等待数据包的到来;
  4. 当接收到正确的数据包(正确的地址和CRC校验码),NRF2401自动把字头、地址和CRC校验位移去;
  5. NRF24L01通过把STATUS寄存器的RX_DR置位(STATUS一般引起微控制器中断)通知微控制器;
  6. 微控制器把数据从FIFO读出(0X61指令);
  7. 所有数据读取完毕后,可以清除STATUS寄存器。NRF2401可以进入
    四种主要的模式之一;
//启动NRF24L01发送一次数据
//txbuf:待发送数据首地址
//返回值:0,接收完成;其他,错误代码
u8 NRF24L01_RxPacket(u8 *rxbuf)
{
	u8 sta;		    							   
	SPI1_SetSpeed(SPI_BaudRatePrescaler_8); //spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)   
	sta=NRF24L01_Read_Reg(STATUS);  //读取状态寄存器的值    	 
	NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中断标志
	if(sta&RX_OK)//接收到数据
	{
		NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据
		NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器 
		return 0; 
	}	   
	return 1;//没收到任何数据
}					    

5.Enhanced ShockBurstTM接收模式初始化

1)写Rx 节点的地址 RX_ADDR_P0
2)使能AUTO ACK EN_AA
3)使能PIPE 0 EN_RXADDR
4)选择通信频率 RF_CH
5)选择通道0 有效数据宽度 RX_PW_P0
6)配置发射参数(低噪放大器增益、发射功率、无线速率) RF_SETUP
7)配置24L01 的基本参数以及切换工作模式 CONFIG。

//该函数初始化NRF24L01到RX模式
//设置RX地址,写RX数据宽度,选择RF频道,波特率和LNA HCURR
//当CE变高后,即进入RX模式,并可以接收数据了		   
void NRF24L01_RX_Mode(void)
{
	NRF24L01_CE=0;	  
  	NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址
	  
  	NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01);    	//使能通道0的自动应答    
  	NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01);	//使能通道0的接收地址  	 
  	NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);	    	//设置RF通信频率		  
  	NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度 	    
  	NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);	//设置TX发射参数,0db增益,2Mbps,低噪声增益开启   
  	NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f);		//配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式 
  	NRF24L01_CE = 1; //CE为高,进入接收模式 
}						 

6.读函数

//读取SPI寄存器值
//reg:要读的寄存器
u8 NRF24L01_Read_Reg(u8 reg)
{
	u8 reg_val;	    
 	NRF24L01_CSN = 0;          //使能SPI传输		
  	SPI1_ReadWriteByte(reg);   //发送寄存器号
  	reg_val=SPI1_ReadWriteByte(0XFF);//读取寄存器内容
  	NRF24L01_CSN = 1;          //禁止SPI传输		    
  	return(reg_val);           //返回状态值
}	
//在指定位置读出指定长度的数据
//reg:寄存器(位置)
//*pBuf:数据指针
//len:数据长度
//返回值,此次读到的状态寄存器值 
u8 NRF24L01_Read_Buf(u8 reg,u8 *pBuf,u8 len)
{
	u8 status,u8_ctr;	       
  	NRF24L01_CSN = 0;           //使能SPI传输
  	status=SPI1_ReadWriteByte(reg);//发送寄存器值(位置),并读取状态值   	   
 	for(u8_ctr=0;u8_ctr<len;u8_ctr++)pBuf[u8_ctr]=SPI1_ReadWriteByte(0XFF);//读出数据
  	NRF24L01_CSN=1;       //关闭SPI传输
  	return status;        //返回读到的状态值
}

7.写函数

//SPI写寄存器
//reg:指定寄存器地址
//value:写入的值
u8 NRF24L01_Write_Reg(u8 reg,u8 value)
{
	u8 status;	
   	NRF24L01_CSN=0;                 //使能SPI传输
  	status =SPI1_ReadWriteByte(reg);//发送寄存器号 
  	SPI1_ReadWriteByte(value);      //写入寄存器的值
  	NRF24L01_CSN=1;                 //禁止SPI传输	   
  	return(status);       			//返回状态值
}
//在指定位置写指定长度的数据
//reg:寄存器(位置)
//*pBuf:数据指针
//len:数据长度
//返回值,此次读到的状态寄存器值
u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 len)
{
	u8 status,u8_ctr;	    
 	NRF24L01_CSN = 0;          //使能SPI传输
  	status = SPI1_ReadWriteByte(reg);//发送寄存器值(位置),并读取状态值
  	for(u8_ctr=0; u8_ctr<len; u8_ctr++)SPI1_ReadWriteByte(*pBuf++); //写入数据	 
  	NRF24L01_CSN = 1;       //关闭SPI传输
  	return status;          //返回读到的状态值
}				   

8.主函数

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "key.h"
#include "spi.h"
#include "24l01.h"   
//ALIENTEK Mini STM32开发板范例代码24
//无线通信实验  
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司  

 int main(void)
 { 
	u8 key,mode;
	u16 t=0;			 
	u8 tmp_buf[33]; 
	delay_init();	    	 //延时函数初始化	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
	uart_init(9600);	 	//串口初始化为9600
	LED_Init();		  		//初始化与LED连接的硬件接口
	LCD_Init();			   	//初始化LCD 	
 	KEY_Init();				//按键初始化
 	NRF24L01_Init();    	//初始化NRF24L01  
 	POINT_COLOR=RED;//设置字体为红色 
	LCD_ShowString(60,50,200,16,16,"Mini STM32");	
	LCD_ShowString(60,70,200,16,16,"NRF24L01 TEST");	
	LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
	LCD_ShowString(60,110,200,16,16,"2014/3/12");		  
 	while(NRF24L01_Check())	//检查NRF24L01是否在位.	
	{
		LCD_ShowString(60,130,200,16,16,"NRF24L01 Error");
		delay_ms(200);
		LCD_Fill(60,130,239,130+16,WHITE);
 		delay_ms(200);
	}								   
	LCD_ShowString(60,130,200,16,16,"NRF24L01 OK");
 	while(1)//在该部分确定进入哪个模式!
	{
		key=KEY_Scan(0);
		if(key==KEY0_PRES)
		{
			mode=0;   
			break;
		}else if(key==KEY1_PRES)
		{
			mode=1;
			break;
		}
		t++;
		if(t==100)LCD_ShowString(10,150,230,16,16,"KEY0:RX_Mode  KEY1:TX_Mode"); //闪烁显示提示信息
 		if(t==200)
		{	
			LCD_Fill(10,150,230,150+16,WHITE);
			t=0; 
		}
		delay_ms(5);	  
	}   
 	LCD_Fill(10,150,240,166,WHITE);//清空上面的显示		  
 	POINT_COLOR=BLUE;//设置字体为蓝色	   
	if(mode==0)//RX模式
	{
		LCD_ShowString(60,150,200,16,16,"NRF24L01 RX_Mode");	
		LCD_ShowString(60,170,200,16,16,"Received DATA:");	
		NRF24L01_RX_Mode();		  
		while(1)
		{	  		    		    				 
			if(NRF24L01_RxPacket(tmp_buf)==0)//一旦接收到信息,则显示出来.
			{
				tmp_buf[32]=0;//加入字符串结束符
				LCD_ShowString(0,190,239,32,16,tmp_buf);    
			}else delay_us(100);	   
			t++;
			if(t==10000)//大约1s钟改变一次状态
			{
				t=0;
				LED0=!LED0;
			} 				    
		};	
	}else//TX模式
	{							    
		LCD_ShowString(60,150,200,16,16,"NRF24L01 TX_Mode");	
		NRF24L01_TX_Mode();
		mode=' ';//从空格键开始  
		while(1)
		{	  		   				 
			if(NRF24L01_TxPacket(tmp_buf)==TX_OK)
			{
				LCD_ShowString(60,170,239,32,16,"Sended DATA:");	
				LCD_ShowString(0,190,239,32,16,tmp_buf); 
				key=mode;
				for(t=0;t<32;t++)
				{
					key++;
					if(key>('~'))key=' ';
					tmp_buf[t]=key;	
				}
				mode++; 
				if(mode>'~')mode=' ';  	  
				tmp_buf[32]=0;//加入结束符		   
			}else
			{										   	
 				LCD_ShowString(60,170,239,32,16,"Send Failed "); 
				LCD_Fill(0,188,240,218,WHITE);//清空上面的显示			   
			};
			LED0=!LED0;
			delay_ms(1500);				    
		};
	} 
}

总结

总的来说,2.4G无线通信的原理和其他通信原理大同小异,基本就是几大步骤:发信息,收信息,读信息,写信息。然后2.4G无线通信还加了一个模式选择,一般选择是Enhanced ShockBurstTM这个模式,这个模式可以支持自动ACK和自动重发。然后,博主的代码是对于stm32mini板的程序,1-7步骤主要是对2.4G通信的初始化,要注意的是NRF24L01与W25Q64和SD卡共用SPI1,注意要分时复用。然后8就是主函数,能实现的功能就是通过按键0和按键1,来控制是接受模式还是发送模式,然后就进行发送或者接受。如果为发送模式,发送的是32个ASCLL码,从空格开始,一直到~。对于2.4G通信博主也只是初了解,这个程序也是从别处白嫖过来的,如有错误,请指正。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2.4G通信 的相关文章

  • FPGA学习笔记(七)——定时器设计、蜂鸣器驱动、变音蜂鸣器

    这篇文章主要讲解两个知识点 xff1a 驱动蜂鸣器 xff08 定时器设计 xff09 变音蜂鸣器 xff08 层次化系统设计 xff09 定时器与计数器的区别不大 定时器 xff1a 核心单元本质上是个计数器 xff0c 设置一个定时值
  • FPGA学习笔记(八)——3-8译码器的设计与验证

    一 3 8译码器介绍 3 8译码器是三输入 xff0c 八输出 当输入信号按二进制方式的表示值为N时 xff0c 输出端标号为N的输出端输出高电平表示有信号产生 xff0c 而其它则为低电平表示无信号产生 因为三个输入端能产生的组合状态有八
  • 引入axios,写个ajax发送到 通过post发送给百度

    axios post 39 http www baidu com 39 then function response console log response data data catch function error ajax中的err
  • Git学习笔记(二)——Git的分支管理、储藏和标签

    分支管理 开始的时候 xff0c 只有一条主分支 xff0c 即master分支 xff0c master分支是一条线 xff0c git用master指向最新的提交 xff0c 再用HEAD指向master 创建 合并分支 创建新的分支时
  • 【SLAM学习笔记】12-ORB_SLAM3关键源码分析⑩ Optimizer(七)地图融合优化

    2021SC 64 SDUSC 目录 1 前言2 代码分析 1 前言 这一部分代码量巨大 xff0c 查阅了很多资料结合来看的代码 xff0c 将分为以下部分进行分析 单帧优化局部地图优化全局优化尺度与重力优化sim3优化地图回环优化地图融
  • 13个能快速开发android的经典项目

    正文 一 okhttp一个让网络请求更简单的框架 项目地址 https github com jeasonlzy okhttp OkGo 二 TwinklingRefreshLayout 下拉刷新和上拉加载的RefreshLayout 自带
  • Linux 编译C++程序的四种方法

    1 使用G 43 43 编译 你有一个test cpp文件 在终端输入 g 43 43 helloSLAM cpp 然后就会得到一个a out 文件 在终端输入 a out 就可以执行 在Linux系统下编译并执行C 43 43 程序 Jo
  • 基于TCP的多线程双向通信

    基于TCP的多线程双向通信 今天我们来简单实现一下TCP的双向通信 1 服务器端的搭建流程 1 先获取套接字 xff08 socket xff09 2 绑定套接字 bind xff0c 公布自己的网路信息 xff08 IP地址 xff0c
  • Linux网络编程----http

    Linux网络编程 http 面经 xff1a 基础知识http的请求方法http的应答方法服务器代码 xff1a 一 HTTP1 HTTP的概念2 HTTP的操作过程3 HTTP存在的问题 二 HTTPS1 HTTPS的概念2 HTTPS
  • C++进阶之路---STL---vector

    vector 一 xff1a vector简介二 vector的初始化方式三 vector的常见问题1 size 和capacity 的区别2 元素的构建方式3 访问容器内部元素的方式方式一 xff1a 方式二 xff1a error 有可
  • albumentations数据增强学习

    albumentations数据增强学习 96 96 文章目录 albumentations数据增强学习原图 xff1a CLAHE xff08 限制对比度自适应直方图均衡化 xff09 数据增强RandomRotate90 xff08 随
  • C++:STL迭代器

    11 23 STL迭代器 STL迭代器 顺序迭代器 遍历型迭代器 iterator 正向迭代器 reverse iterator 反向迭代器 span class token macro property span class token
  • 约瑟夫环C语言链表实现

    约瑟夫环 xff1a 设编号分别为1 2 3 n的n个人围坐一圈 xff0c 提前约定编号为k 1 k n 的人从1开始计数 xff0c 数到m的那个人淘汰出局 xff0c 他的下一个人又从1开始计数 xff0c 数到m的人再淘汰出局 xf
  • 链表C语言实现--单向链表

    线性结构的链式存储也称为链表 xff0c 相比于顺序表 xff0c 链表能够解决顺序表中空间资源浪费问题以及空间不足的问题 链表的每一个结点包含数据域和指针域 xff0c 而每一个结点在内存中的地址是不连续的 xff0c 且能适应动态变化
  • 循环链表C语言实现

    本文介绍循环链表中的单向循环链表 xff0c 双向循环链表两种 第一种 xff1a 单向循环链表 xff0c 是在单向链表的基础上 xff0c 尾结点不再指向NULL xff0c 而是指向头结点从而构成循环 如下图 xff1a 所以相比单向
  • 那些只有程序员才能看懂的冷笑话,用餐时间请勿点开。。。

    0 客户被绑 xff0c 蒙眼 xff0c 惊问 xff1a 想干什么 xff1f 对方不语 xff0c 鞭笞之 xff0c 客户求饶 xff1a 别打 xff0c 要钱 xff1f 又一鞭 xff0c 十万够不 xff1f 又一鞭 xff
  • TCP服务器/客户端的Linux下的代码实现,单向通信、双向通信

    tcp流程 服务器 xff1a socket gt bind gt listen gt accept gt read write or recv send gt close 客户端 xff1a socket gt connect gt re
  • UNIX域套接字的网络编程实现

    UNIX域套接字 socket同样可以用于本地通信 xff0c 即主机内的进程间通信 创建套接字时使用本地协议AF UNIX 或AF LOCAL 关于socket函数接口的介绍可参考我的另一篇博客 xff1a 链接 Linux网络基础介绍和
  • 堆排序、堆的定义、代码实现

    一 堆排序的定义 堆排序 xff08 Heapsort xff09 是指利用堆这种数据结构所设计的一种排序算法 二 堆的一些概念 1 堆的定义 堆是计算机科学中一类特殊的数据结构的统称 堆的逻辑结构 采用树形结构 xff0c 一般当做完全二
  • C++基础学习笔记

    说明 xff1a 此版只是C 43 43 基础学习的笔记 xff0c 涵盖内容有限 xff0c 知识点细节上也有所欠缺 xff0c 并未深入探讨各类机制的实现原理 所以在学习到相关知识点时建议参考其他博主的专门介绍的文章来深入学习 xff0

随机推荐

  • Qt基础介绍部分

    Qt是挪威一个团队开发的多平台C 43 43 图像用户界面应用程序框架 Qt是面向对象的框架 xff0c 使用特殊的代码生成扩展 Qt Creator是一个用于Qt开发的轻量级跨平台集成开发环境 支持跨平台开发 1 QT的优势 xff1a
  • UART协议讲解

    UART协议讲解 一 什么是UART协议二 通信方式的分类1 串行通信 xff08 一 xff09 同步通信和异步通信 xff08 二 xff09 单工和半双工以及全双工 2 并行通信 三 UART协议具体介绍1 UART数据传输的格式2
  • 常用的get、post请求有哪些

    常见的get post请求有哪些呢 常见的get请求有 form标签中method 61 get 发起的是get请求 a标签发起的是get请求 link标签引入css发起的是get请求 Script标签引入js文件发起的是get请求 img
  • 串口通信整理:二、数据发送之多位数据发送

    本文基于前一篇串口模块基础版进一步对串口发送数据整理 xff0c 并通过仿真进行验证 xff0c 所有代码都可直接跑通 xff0c 注意各个模块名字 首先再次回顾一下通信协议UART 本质就是并行数据转串行数据 关键参数 xff1a 起始位
  • HTTP协议解析

    文章目录 一 HTTP协议基础1 定义2 工作原理3 特点4 与Https的区别 x1f435 HTTPS简介 xff1a 两者区别 xff1a 二 HTTP请求协议1 HTTP请求结构 xff1a 2 请求方法3 举例4 Post和Get
  • Java httpUtil工具类

    需要导入的依赖 xff1a span class token generics span class token punctuation lt span dependency span class token punctuation gt
  • 博士申请 | 浙江大学孙优贤院士课题组招收智能无人系统方向硕士生/博士生

    合适的工作难找 xff1f 最新的招聘信息也不知道 xff1f AI 求职为大家精选人工智能领域最新鲜的招聘信息 xff0c 助你先人一步投递 xff0c 快人一步入职 xff01 浙江大学 网络传感与控制研究组 xff08 Group o
  • 文件解析__JSON解析

    一 JSON解析 1 简介 xff1a JSON是一种轻量级的数据交换格式 2 Java解析JSON 序列化 xff1a 将Java对象转换成JSON格式的数据 反序列化 xff1a 将JSON格式的数据转换成Java对象 import c
  • XSSFWorkbook,SXSSFWorkbook以及EasyExcel读取Excel文件的比较

    同时读取30w数据 xff0c 比较运行时间及CPU 内存占比 1 EasyExcel package com apesource import java util ArrayList import java util List impor
  • 基于FTP协议的文件上传与下载

    一 什么是FTP FTP 是File Transfer Protocol xff08 文件传输协议 xff09 的英文简称 xff0c 而中文简称为 文传协议 用于Internet上的控制文件的双向传输 同时 xff0c 它也是一个应用程序
  • MyBatis

    目录 优点 缺点 重难点问题 xff1a 1 传递多个参数 2 与 的区别 3 resultMap 元素 4 批处理 MyBatis 是一个开源 轻量级的数据持久化框架 xff0c 是 JDBC 和 Hibernate 的替代方案 MyBa
  • TCP协议的拥塞控制

    一 什么是拥塞控制 发送方需要维护一个状态变量 拥塞窗口cwnd 来决定发送方同时可以发送多少数据包 二 控制算法 1 慢开始 当主机开始传送数据时 xff0c 如果把大量数据注入 xff0c 可能会造成网络堵塞 所有 xff0c 为了避免
  • Autowired实现原理

    一 认识 64 Autowired 64 Autowired 替换 xff1a autowire属性 自动装配 xff08 按照类型装配 xff0c 通过set方法 xff0c 且方法可以省略 xff09 位置 xff1a 修饰属性 xff
  • JavaScript常用事件

    目录 鼠标 键盘事件 1 onclick 事件 2 onmouseover 事件 3 onmouseout 事件 4 onkeyup 事件 表单事件 1 onchange 事件 2 onfocus 事件 3 onblur 事件 鼠标 键盘事
  • 2020年电赛总结

    前言 前几天电赛的成绩公布了 xff0c 跟师哥们混了个省三等奖 xff0c 不管怎么说 xff0c 还是想写点东西 xff0c 来纪念一下这一年来的经历 正文 参加电赛可以说本来没有在我预料的范围之内 xff0c 基本上准备电赛所学习的知
  • 「C/C++」一些值得学习的C++开源库

    目录 说明BoostPocoOpenCVEigenSQLiteQtTensorFlow 说明 学习这些 C 43 43 开源库不仅可以提高我们的编程水平 xff0c 同时也可以提高我们的编程效率 xff0c 加速我们的应用程序开发 当然 x
  • Python中的__file__

    在Python项目开发过程中 xff0c 有的时候会获取程序文件的相对路径或者绝对路径 因此经常会见到如下的语句 xff1a import os os path dirname file 因此本文件这里的 file 是指明什么呢 xff1f
  • 记一下 Windows11 安装与配置 node.js 的标准步骤

    1 首先随便下载个 node js 的x86或x64 msi安装包 xff0c 双击直接安装 xff0c 安装的路径如 34 C Program Files nodejs 34 xff1b 2 安装完成后 xff0c 打开 cmd 命令控制
  • 什么是结构体内存对齐,有什么好处

    什么是结构体内存对齐 xff0c 有什么好处 下面先看一个例子 xff1a span class token macro property span class token directive keyword include span sp
  • 2.4G通信

    文章目录 2 4G无线通信实验一 模块简介二 Enhanced ShockBurstTM模式介绍三 编程1 初始化IO口2 Enhanced ShockBurstTM发送流程3 Enhanced ShockBurstTM发送模式初始化4 E