(38)STM32——NRF24L01无线通信

news/2024/9/8 5:21:39/

目录

学习目标

成果展示 

介绍

引脚

时序

模式

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 筛…