(38)STM32——NRF24L01无线通信

news/2024/2/27 22:13:05

目录

学习目标

成果展示 

介绍

引脚

时序

模式

Enhanced ShockBurstTM收发模式

发送流程 

接收流程 

SPI指令

寄存器

配置寄存器 

自动使能寄存器

RX地址使能寄存器

自动重发寄存器

射频频率设置寄存器

射频设置寄存器 

状态寄存器

发送地址设置寄存器

硬件连接

代码 

总结 


学习目标

        本节我们要学习的是NRF24L01无线通信,NRF24L01无线通信采用的是SPI通信,SPI的内容我们之前学过,也算是一个加强的过程吧。然后我们会使用两个单片机来实现通信过程,最后的结果会通过串口打印到电脑上。

成果展示 

nrf24l01

介绍

NRF24L01 无线模块,采用的芯片是 NRF24L01,该芯片的主要特点如下:

  1. 2.4G 全球开放的 ISM 频段,免许可证使用。
  2. 最高工作速率 2Mbps,高校的 GFSK 调制,抗干扰能力强。
  3. 125 个可选的频道,满足多点通信和调频通信的需要。
  4. 内置 CRC 检错和点对多点的通信地址控制。
  5. 低工作电压(1.9~3.6V)。
  6. 可设置自动应答,确保数据可靠传输。 该芯片通过 SPI 与外部 MCU 通信,最大的 SPI 速度可以达到 10Mhz。本章我们用到的模块是深圳云佳科技生产的 NRF24L01,该模块已经被很多公司大量使用,成熟度和稳定性都是相当不错的。

引脚

我们简单介绍一下这些引脚:

  • CE:模式控制线。在CSN为低的情况下,CE协同CONFIG寄存器共同决定NRF24L01的状态
  • CSN: SPI片选线
  • SCK: SPI时钟线
  • MOSI: SPI数据线(主机输出,从机输入)
  • MISO: SPI数据线(主机输入,从机输出)
  • IRQ:中断信号线。中断时变为低电平,在以下三种情况变低: TxFIFO 发完并且收到ACK (使能ACK情况下)、Rx FIFO收到数据、达到最大重发次数。

时序

空闲状态SCK为0,CPOL=0;数据在时钟第一个时间边沿采集,CPHA=0;

  • Cn: SPI命令位
  • Sn: STATUS寄存 器位
  • Dn:数据位(MSB,多字节传输时,低字节在前)

就是我们之前介绍的SPI通讯,在此不再赘述。 

模式

        其中,收发模式又有: Enhanced ShockBurstTM收发模式和ShockBurstTM收发模式,只有Enhanced ShockBurstTM收发模式支持自动ACK和自动重发。开启自动ACK,则默认选择Enhanced模式

Enhanced ShockBurstTM收发模式

        增强型ShockBurstTM模式可以使得双向链接协议执行起来更为容易、有效。典型的双向链接为:发送方要求终端设备在接收到数据后有应答信号,以便于发送方检测有无数据丢失。一旦数据丢失,则通过重新发送功能将王失的数据恢复、增强型的ShockBurst模式可以同时控制应答及重发功能而无需增加MCU工作量。Enhanced ShockBurstTM收发模式有六路通道,1号通道地址固定,其他地址可以自行设定。如下图所示,后面只能设置后两位。

        在Enhanced ShockBurstTM收发模式下,NRF24L01 自动处理字头和CRC校验码。在接收数据时,自动把字头和CRC校验码移去。在发送数据时,自动加上字头和CRC校验码,在发送模式下,置CE为高,至少10us, 将使能发送过程。

  1. 在接收端,确认收到数据后记录地址,并以此地址为目标地址发送应答信号。
  2. 在发送端,通道0被用作接收应答信号,A因此通道0的接收地址要与发送地址端地址相等以确保接收到正确的应答信号。

发送流程 

        在Enhanced ShockBurstTM收发模式下,NRF24L01 自动处理字头和CRC校验码。在接收数据时,自动把字头和CRC校验码移去。在发送数据时,自动加上字头和CRC校验码,在发送模式下,置CE为高,至少10us, 将使能发送过程。 

  1. 写Tx节点的地址TX_ADDR
  2. 写Rx节点的地址(主要是为了使能AutoAck) RX _ADDR_PO
  3. 使能AUTOACKEN AA
  4. 使能PIPE 0 EN_ RXADDR
  5. 配置自动重发次数SETUPRETR
  6. 选择通信频率RF CH
  7. 配置发射参数(低噪放大器增益、发射功率、无线速率) RF_ SETUP8)配置24L01的基本参数以及切换工作模式CONFIG.

接收流程 

1.配置接收地址和要接收的数据包大小;
2.配置CONFIG寄存器,使之进入接收模式,把CE置高。
3.130us后,NRF24L01进入监视状态,等待数据包的到来;
4.当接收到正确的数据包(正确的地址和CRC校验码),NRF2401 自动把字头、地址和CRC校验位移去;
5. NRF24L01通过把STATUS寄存器的RX_ DR置位(STATUS-般引起微控制器中断)通知微控制器;
6.微控制器把数据从FIFO读出(0X61指令);
7.所有数据读取完毕后,可以清除STATUS寄存器。NRF2401可以进入四种主要的模式之一;

1)写Rx节点的地址RX_ ADDR PO
2)使能AUTO ACKEN_ AA
3)使能PIPEO EN_ RXADDR
4)选择通信频率RF CH
5)选择通道0有效数据宽度RX_ PW_ PO
6)配置发射参数(低噪放大器增益、发射功率、无线速率) RF SETUP

7)配置24L01的基本参数以及切换工作模式CONFIG。

SPI指令

寄存器

配置寄存器 

自动使能寄存器

RX地址使能寄存器

 

自动重发寄存器

射频频率设置寄存器

频率计算公式:2400+RF_CH(Mhz) 

射频设置寄存器 

状态寄存器

 

发送地址设置寄存器

硬件连接

 

代码 

// 24l01.h
#include "24l01.h"
#include "lcd.h"
#include "delay.h"
#include "spi.h"const u8 TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //发送地址
const u8 RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //发送地址// 使能SPI
void NRF24L01_SPI_Init(void)
{SPI_InitTypeDef  SPI_InitStructure;SPI_Cmd(SPI1, DISABLE); //失能SPI外设SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工SPI_InitStructure.SPI_Mode = SPI_Mode_Master;		//设置SPI工作模式:设置为主SPISPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;		//设置SPI的数据大小:SPI发送接收8位帧结构SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;		//串行同步时钟的空闲状态为低电平SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;	//串行同步时钟的第1个跳变沿(上升或下降)数据被采样SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;		//NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;		//定义波特率预分频的值:波特率预分频值为256SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;	//指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始SPI_InitStructure.SPI_CRCPolynomial = 7;	//CRC值计算的多项式SPI_Init(SPI1, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器SPI_Cmd(SPI1, ENABLE); //使能SPI外设}//初始化24L01的IO口
void NRF24L01_Init(void)
{  GPIO_InitTypeDef  GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOG, ENABLE);//使能GPIOB,G时钟//GPIOB14初始化设置:推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化PB14//GPIOG6,7推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化PG6,7//GPIOG.8上拉输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//输入GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化PG8GPIO_SetBits(GPIOB,GPIO_Pin_14);//PB14输出1,防止SPI FLASH干扰NRF的通信 SPI1_Init();    		//初始化SPI1  NRF24L01_SPI_Init();//针对NRF的特点修改SPI的设置NRF24L01_CE=0; 			//使能24L01NRF24L01_CSN=1;			//SPI片选取消	 		 	 
}
//检测24L01是否存在
//返回值:0,成功;1,失败	
u8 NRF24L01_Check(void)
{u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};u8 i;SPI1_SetSpeed(SPI_BaudRatePrescaler_8); //spi速度为10.5Mhz(24L01的最大SPI时钟为10Mhz)   	 NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,buf,5);//写入5个字节的地址.	NRF24L01_Read_Buf(TX_ADDR,buf,5); //读出写入的地址  for(i=0;i<5;i++)if(buf[i]!=0XA5)break;	 							   if(i!=5)return 1;//检测24L01错误	return 0;		 //检测到24L01
}	 	 
//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);       			//返回状态值
}
//读取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;        //返回读到的状态值
}
//在指定位置写指定长度的数据
//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;          //返回读到的状态值
}				   
//启动NRF24L01发送一次数据
//txbuf:待发送数据首地址
//返回值:发送完成状况
u8 NRF24L01_TxPacket(u8 *txbuf)
{u8 sta;SPI1_SetSpeed(SPI_BaudRatePrescaler_8);//spi速度为10.5Mhz(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;//其他原因发送失败
}
//启动NRF24L01发送一次数据
//txbuf:待发送数据首地址
//返回值:0,接收完成;其他,错误代码
u8 NRF24L01_RxPacket(u8 *rxbuf)
{u8 sta;		    							   SPI1_SetSpeed(SPI_BaudRatePrescaler_8); //spi速度为10.5Mhz(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;//没收到任何数据
}					    
//该函数初始化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为高,进入接收模式 
}						 
//该函数初始化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通道为40NRF24L01_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后启动发送
}

// main.c
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "spi.h"
#include "key.h" 
#include "24l01.h"	 int main(void)
{ u8 key,mode;u16 t=0;			 u8 tmp_buf[33];	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2delay_init(168);  //初始化延时函数uart_init(115200);	//初始化串口波特率为115200LED_Init();					//初始化LED KEY_Init();					//按键初始化NRF24L01_Init();    		//初始化NRF24L01 while(NRF24L01_Check()){printf ("NRF24L01 Error");printf ("\r\n\r\n");delay_ms(200);}printf ("NRF24L01 OK"); printf ("\r\n\r\n");	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){printf ("KEY0:RX_Mode  KEY1:TX_Mode"); //闪烁显示提示信息printf ("\r\n\r\n");t =0;}delay_ms(5);	  }      if(mode==0)//RX模式{printf ("NRF24L01 RX_Mode");printf ("\r\n\r\n");		NRF24L01_RX_Mode();		  while(1){	  		    		    				 if(NRF24L01_RxPacket(tmp_buf)==0)//一旦接收到信息,则显示出来.{tmp_buf[32]=0;//加入字符串结束符printf ("Received DATA:%s",tmp_buf); printf ("\r\n\r\n");				}else delay_us(100);	   t++;if(t==10000)//大约1s钟改变一次状态{t=0;LED0=!LED0;} 				    };	}else//TX模式{							    printf ("NRF24L01 TX_Mode");printf ("\r\n\r\n");		NRF24L01_TX_Mode();mode=' ';//从空格键开始  while(1){	  		   				 if(NRF24L01_TxPacket(tmp_buf)==TX_OK){	printf ("Sended DATA:%s",tmp_buf); printf ("\r\n\r\n");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{										   			   printf ("Send Failed "); printf ("\r\n\r\n");};LED0=!LED0;delay_ms(1500);				    };}     }

总结 

        总算是学到了如何在单片机之间进行通信了,而且对之前的SPI知识进行了一个加强巩固的作用。希望能对大家有所帮助,谢谢大家了。


http://www.ppmy.cn/news/166964.html

相关文章

【计算机图形学】【代码复现】A-SDF中的数据集制作与数据生成

Follow A-SDF 的Data Generation部分&#xff1a; We follow (1) ANSCH to create URDF for shape2motion dataset (1-2) URDF2OBJ&#xff08;本人认为是1-2之间需要进行的重要的过渡部分&#xff09; (2) Manifold to create watertight meshes (3) and modified mesh_to_sdf…

JVM崩溃产生了 hs_err_pidxxxx.log如何分析

hs_err_pid.log是JVM崩溃时产生的日志文件&#xff0c;包含了JVM崩溃时的线程栈信息、内存信息、CPU信息等&#xff0c;可以帮助我们分析JVM崩溃的原因。下面是分析hs_err_pid.log日志的步骤&#xff1a; 1. 打开hs_err_pid.log文件&#xff0c;查看文件头部的信息&#xff0c…

从零开始Vue3+Element Plus后台管理系统(17)——一键换肤的N种方案

暗黑模式 基于Element Plus和Tailwind CSS灵活的设计&#xff0c;我们很容易在项目中实现暗黑模式&#xff0c;具体可以参考之前的文章《从零开始写一个Vue3Element Plus的后台管理系统(二)——Layout页面布局的实现》 换肤方案 如果需要给用户提供更多主题&#xff0c;更丰…

30天从入门到精通TensorFlow1.x 第三天,tf.variable_scope()共享或重用变量

tf.variable_scope()共享或重用变量 文章目录 一、接前一天二、tf.variable_scope()共享或重用变量1. 背景2. 目的3. tf.variable_scope()基本参数3. tf.variable_scope()作用&#xff08;1&#xff09;.命名空间&#xff08;2&#xff09;.共享变量&#xff08;3&#xff09;.…

医院检验科检验系统(LIS)源码:临检、生化、免疫、微生物

一、检验科检验系统 &#xff08;LIS&#xff09;概述&#xff1a;对接HIS&#xff0c;医生工作站能够方便、及时的查阅患者检验报告。 二、检验科检验系统 &#xff08;LIS&#xff09;主要功能描述&#xff1a; 1.质控品管理&#xff1a; 医院设备质控&#xff08;编码、设…

QT非阻塞挂起

在Qt程序中&#xff0c;有时需要在一定时间内等待某个条件满足&#xff0c;但又不能使用阻塞的方式等待&#xff0c;否则会导致界面卡死&#xff0c;无法响应用户的其他操作。这种情况下可以使用Qt提供的非阻塞挂起方法&#xff0c;如下所示&#xff1a; void nonBlockingPaus…

Backtrader官方中文文档:第二部分Installation安装

本文档参考backtrader官方文档&#xff0c;是官方文档的完整中文翻译&#xff0c;可作为backtrader中文教程、backtrader中文参考手册、backtrader中文开发手册、backtrader入门资料使用。 Backtrader安装 安装须知 Backtrader是自包含的&#xff0c;没有外部依赖(除非你想使…

【Linux系统基础快速入门详解】Linux命令格式、特点、语法详解、选项、参数

Linux系统的命令行界面是Linux系统最常用的部分之一,通过命令行界面中的命令,可以进行文件操作、系统管理、网络管理等各种操作。本文将介绍Linux系统命令的格式、特点、语法、选项和参数等内容。 1. 命令格式 Linux系统命令的基本格式为: command [options] [arguments]…

时间序列——R语言基础

这里只提及到了R语言的最皮毛的应用&#xff0c;其实ts是重点提及的&#xff0c;因为他是专门为了时间序列设计的内置class&#xff0c;但ts还是太浅显了&#xff0c;故一定要看以下链接。 zoo的使用 xts的使用 以上链接涉及到了zoo与xts&#xff0c;也是时间序列分析时的重要工…

R语言-频数统计函数

R如何对数据进行分组 1. factor()函数 > mtcars$cyl <- factor(mtcars$cyl) > mtcars$cyl[1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4 Levels: 4 6 82. cut()函数 > cut(mtcars$mpg,c(seq(10,50,10)))[1] (20,30] (20,30] (20,30] (2…

R 语言 单位根检验

单位根检验是一种平稳性检验,零假设是有单位根,即不平稳;对立假设是平稳。经常使用增强的 Dickey-Fuller 检 验 (ADF 检验)。 fUnitRoots 包的 adfTest() 函数可以执行单位根 ADF 检验。tseries 包的 adf.test() 函数也可以执行单位根 ADF 检验。 注意,ADF 检验都是在拒绝 …

R语言 创建矩阵的方式

> matrix(datac(1,2,3,4,5,6),nrow2,ncol3)[,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6> matrix(datac(1,2,3,4,5,6),nrow3,ncol2)[,1] [,2] [1,] 1 4 [2,] 2 5 [3,] 3 6 1.以上功能实现&#xff1a;创建一个2行3列的矩阵&#xff1b;创…

R语言的列表

列表是R语言的对象集合&#xff0c;可以用来保存不同类型的数据&#xff0c;可以是数字、字符串、向量、另一个列表等&#xff0c;当然还可以包含矩阵和函数。 1.R语言创建列表使用list ()函数。 list_data <- list("hello","school",c(10,20,30),123,…

eXosip事件列表

事件列表 EvnetExplainmethodtypetranslateEXOSIP_REGISTRATION_SUCCESSuser is successfully registred.REGISTERResponse收到上级平台的 2xx 注册成功EXOSIP_REGISTRATION_FAILUREuser is not registred.REGISTERResponse收到上级平台的 3456xx 注册失败EXOSIP_CALL_INVITEa…

R 语言求最值问题

在工农业生产中,常常会遇到在一定条件下怎么使“产量最多”“用料最少”“成本最低”“效率最高”等问题,这类问题通常称为优化问题,在数学上有时可归结为求某函数(通常称为目标函数)的最大值或最小值问题。 某公司决定通过增加广告投入和技术改造投入来获得更大的收益。通…

R语言数据结构之数组

R 语言可以创建一维或多维数组。R 语言数组是一个同一类型的集合&#xff0c;矩阵 matrix 其实就是一个二维数组。 Usage array(data NA, dim length(data), dimnames NULL) 1. 数组创建 # 一维数组 a <- array(c(1:20)) # 二维数组 a <- array(c(1:30),dimc(6,5)…

R语言建立ARIMA模型预测数据

目录 确定研究目的以及确定因变量和自变量 数据预处理 判断有无缺失值 创建时间序列 平稳性检验 季节性处理 白噪声检验 模型选取与模型评估 最终模型与预测 结论 确定研究目的以及确定因变量和自变量 研究目的&#xff1a;建立ARIMA模型&#xff0c;预测接下来的 1…

[R语言]稳健回归

原文来自&#xff1a;稳健回归 INTRODUCTION 我们以线性回归中的一些概念开始关于稳健回归的讨论。 残差&#xff1a; 预测值&#xff08;基于回归方程&#xff09;与实际观察值之间的差。 离群值&#xff1a; 在线性回归中&#xff0c;离群值是具有大量残差的观察值。换句…

R语言实现决策树

R语言实现决策树 提示&#xff1a;本文使用R语言实现决策树&#xff0c;并对决策树结构图进行美化 文章目录 R语言实现决策树数据介绍一、相关R包的下载二、实现过程1.数据读取2.训练集与验证集划分3.构建决策树并绘制图形4.测试模型 总结 数据介绍 group就是分类结果&#x…

R 语言数据处理入门-1

目录 1.加载数据 2. 查看数据 3. 数据类型转化 3.1 批量转化变量为因子型 3.2 插入缺失值 4. 重命名列变量 5. 创建新变量 6. 删除列变量 7. 列变量重排序 8. 行观测重排序 8.1升序排列 8.2 降序排列 8.3 缺失值排序 9. 数据筛选子集 9.1 筛选行数据 9.2 筛…
最新文章