闲谈:

闲来无聊,恰好公司又经常用CAN数据的传输,自己觉得要是用无线传送多好,然后,就是一个奇想,就想做一个无线数据的透传,恰好身边又有NRF24L01,那就行动吧!

下面是NRF24L01 SPI1 的初始化程序:

void NRF24L01_Init(void)
{   GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef  SPI_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA, ENABLE);    //使能PB,G端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;              //PB12上拉 防止W25X的干扰GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化指定IOGPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //PG8 7 推挽    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化指定IOGPIO_InitStructure.GPIO_Pin  = GPIO_Pin_5;   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PG6 输入  GPIO_Init(GPIOC, &GPIO_InitStructure);GPIO_ResetBits(GPIOA,GPIO_Pin_4);//PA4上拉                   GPIO_ResetBits(GPIOC,GPIO_Pin_4|GPIO_Pin_5);//PC4,5上拉       SPI1_Init();           //初始化SPI     SPI_Cmd(SPI1, DISABLE); // SPI外设不使能SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //SPI设置为双线双向全双工SPI_InitStructure.SPI_Mode = SPI_Mode_Master;      //SPI主机SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;       //发送接收8位帧结构SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;      //时钟悬空低SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;    //数据捕获于第1个时钟沿SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;     //NSS信号由软件控制SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;        //定义波特率预分频的值:波特率预分频值为16SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;  //数据传输从MSB位开始SPI_InitStructure.SPI_CRCPolynomial = 7;  //CRC值计算的多项式SPI_Init(SPI1, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器SPI_Cmd(SPI1, ENABLE); //使能SPI外设NRF24L01_CE=0;            //使能24L01NRF24L01_CSN=1;           //SPI片选取消  }

这里是NRF24L01数据读取

/检测24L01是否存在
//返回值:0,成功;1,失败
u8 NRF24L01_Check(void)
{u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};u8 i;SPI1_SetSpeed(SPI_BaudRatePrescaler_4); //spi速度为9Mhz(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速度为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;//其他原因发送失败
}
//启动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;//没收到任何数据
}
//该函数初始化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为高,

这里是关于stm32can程序:

/******************** 鑫盛电子工作室 ********************* 文件名  :can.c* 描述    :CAN测试应用函数库。         * 实验平台:MINI STM32开发板 基于STM32F103C8T6* 硬件连接:-----------------*          |                           ||  PB8-CAN-RX     |*          |  PB9-CAN-TX     |*          |                 |*           -----------------* 库版本  :ST3.0.0                                                                                                         * 淘宝店:http://shop66177872.taobao.com
*********************************************************/
#include "can.h"
//#include "led.h"
#include "stdio.h"
#include "sys.h"
#include "stm32f10x_can.h"
#include "24l01.h"
//#include "os.h"
typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;/* 在中断处理函数中返回 */
__IO uint32_t ret = 0;uint8_t CAN_RX_BUFF[17];
volatile TestStatus TestRx; static void CAN1_NVIC_Config(void)
{NVIC_InitTypeDef NVIC_InitStructure;/* 使能接收的中断和中断优先级 */NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);   //FIFO0消息挂号中断允许.
}/****************************************************************************
* Function Name  : CAN1_Config
* Description    : 初始化CAN,波特率设置为450K
* Input          : mode:用来选择要使用的工作模式:主要有四种工作模式:1、正常
*                * 模式:CAN_Mode_Normal;2、CAN_Mode_Silent :静默模式;3、环
*                * 回模式:CAN_Mode_LoopBack;4、静默环回模式:CAN_Mode_Silent
*                * _LoopBack。
* Output         : None
* Return         : None
****************************************************************************/void CAN1_Config(uint8_t mode)
{GPIO_InitTypeDef GPIO_InitStructure;CAN_InitTypeDef CAN_InitStructure;/* 初始化IO口 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //复用推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;        //PA12GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;     //上拉输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;        //PA11GPIO_Init(GPIOA, &GPIO_InitStructure);/***************************************************************************/
/********************* CAN设置和初始化 *************************************/
/***************************************************************************//* 打开时钟使能 */RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);/* 初始化CAN的参数 */CAN_DeInit(CAN1);CAN_StructInit(&CAN_InitStructure);/* CAN 参数初始化 */CAN_InitStructure.CAN_TTCM = DISABLE;    //失能时间触发模式CAN_InitStructure.CAN_ABOM = ENABLE;    //自动离线管理CAN_InitStructure.CAN_AWUM = DISABLE;    //失能睡眠模式通过软件唤醒CAN_InitStructure.CAN_NART = DISABLE;    //失能非自动重传输模式(也就是会自动重传输)CAN_InitStructure.CAN_RFLM = DISABLE;    //失能接收FIFO锁定模式,新数据会覆盖旧数据CAN_InitStructure.CAN_TXFP = DISABLE;    //优先级由报文标识符决定 CAN_InitStructure.CAN_Mode = mode;       //有普通模式和拓展模式CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; //重新同步跳跃宽度 1 个时间单位/* 波特率设置, 当APB1的时钟频率是36MHZ的时候。 波特率的公式为: *//* 波特率(Kpbs) = 36M / ((CAN_BS1 + CAN_BS2 + 1) *  CAN_Prescaler) */CAN_InitStructure.CAN_BS1 = CAN_BS1_9tq; //时间段 1 为8 个时间单位 CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq; //时间段 2 为7 个时间单位CAN_InitStructure.CAN_Prescaler = 4;//5;   波特率改为了100K   20=100k   5=400kCAN_Init(CAN1, &CAN_InitStructure);#ifdef CAN_RX0_INT_ENABLECAN1_NVIC_Config();
#endif    }
/****************************************************************************
* Function Name  : CAN1_SendMesg
* Description    : 发送一个报文
* Input          : id:发送的ID。
*                * len:发送的数据长度(注意发送数据长度不能超过8个字节)
*                * dat:存放数据的指针
* Output         : None
* Return         : None
****************************************************************************/void CAN1_SendMesg(uint32_t id, uint8_t len, uint8_t *dat)
{uint16_t i = 0;CanTxMsg TxMessage;/* 一次发送只能发送8个字节 */if(len > 8){return ;}/* 配置邮箱:设置标识符,数据长度和待发送数据 */TxMessage.StdId = (id & 0x7FF); //标准帧ID11位TxMessage.ExtId = (id );   //设置扩展标示符(拓展标示符有29位1本来是TxMessage.ExtId = (id >> 11);TxMessage.RTR = CAN_RTR_DATA;   //设置为数据帧(或远程帧为CAN_RTR_Remote)if((id & 0x7FF) == 0x7FF)       //检测是标准帧还是拓展帧(拓展帧大于11位){TxMessage.IDE = CAN_ID_STD; //拓展ID   }else{TxMessage.IDE = CAN_ID_EXT; //标准ID}TxMessage.DLC = len;            //发送的数据长度/* 将数据放入到邮箱中 */for(i=0; i<len; i++)           {TxMessage.Data[i] = *dat;dat++;    }/* 开始传送数据 */CAN_Transmit(CAN1, &TxMessage);
}/****************************************************************************
* Function Name  : CAN1_Config16BitFilter
* Description    : 设置CAN接收16两个标准ID(设置ID位数全部相同才能够通过)
* Input          : id1:要接收的一个ID
*                * id2:要接收的一个ID
* Output         : None
* Return         : None
****************************************************************************/void CAN1_Config16BitFilter(uint16_t id1, uint16_t id2)
{CAN_FilterInitTypeDef  CAN_FilterInitStructure;uint16_t mask = 0xFFFF;/* CAN filter init 屏蔽寄存器初始化 */CAN_FilterInitStructure.CAN_FilterNumber = 1;                   //过滤器1CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;//ID模式/* 寄存器组设置为16位 */CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_16bit;CAN_FilterInitStructure.CAN_FilterIdHigh = (id1 << 5);    //要接收的ID标示符1       CAN_FilterInitStructure.CAN_FilterIdLow =  (id2 << 5);     //要接收的ID标示符2/* 设置为所有ID位都要相同才接收 */ CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (mask << 5); //MASKCAN_FilterInitStructure.CAN_FilterMaskIdLow  = (mask << 5);CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0; //FIFO0CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; //使能过滤器1CAN_FilterInit(&CAN_FilterInitStructure);
}/****************************************************************************
* Function Name  : CAN1_Config32BitFilter
* Description    : 设置一个拓展ID的接收
* Input          : id:要接收的ID
* Output         : None
* Return         : None
****************************************************************************/void CAN1_Config32BitFilter(uint32_t id)
{
//    uint32_t mask = 0x000006D1;//0xFFFFFFFF;   //发送0x00000601    接收0x000006D1CAN_FilterInitTypeDef  CAN_FilterInitStructure;/* CAN filter init 屏蔽寄存器初始化 */CAN_FilterInitStructure.CAN_FilterNumber = 1;                //过滤器1CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;//ID模式/* 寄存器组设置为32位 */CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;CAN_FilterInitStructure.CAN_FilterIdHigh =0x0000;// (id >> 13);    //要接收的ID标示符1      CAN_FilterInitStructure.CAN_FilterIdLow  =0x0000;//  (id << 3 ) | 4;//要接收的ID标示符2/* 设置为所有ID位都要相同才接收 */    CAN_FilterInitStructure.CAN_FilterMaskIdHigh =0x0000;// mask >> 13;     //MASKCAN_FilterInitStructure.CAN_FilterMaskIdLow  =0x0000;// (mask << 3) | 4;CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0; //FIFO0CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; //使能过滤器1CAN_FilterInit(&CAN_FilterInitStructure);
}/****************************************************************************
* Function Name  : CAN1_ReceiveMesg
* Description    : 接收一个报文
* Input          : receiveBuff:接收数据的数组指针
* Output         : None
* Return         : None
****************************************************************************/void CAN1_ReceiveMesg(uint8_t *receiveBuff)
{uint8_t i = 0;CanRxMsg RxMessage; //设置接收邮箱if((CAN_MessagePending(CAN1, CAN_FIFO0) != 0)) //检查FIFO0里面是否有数据{CAN_Receive(CAN1,CAN_FIFO0,&RxMessage); //读取FIFO0里面的数据for(i=0; i<RxMessage.DLC; i++)          //将读取到的数据位赋给CAN_RXSBUF{*receiveBuff = RxMessage.Data[i];receiveBuff++;}}
}/* 发送两个字节的数据*/void can_tx(u8 Data1,u8 Data2,u8 Data3,u8 Data4,u8 Data5,u8 Data6,u8 Data7,u8 Data8)
{ CanTxMsg TxMessage;  TxMessage.StdId=0x0023; //标准标识符为0x00TxMessage.ExtId=0x001C; //扩展标识符0x0000TxMessage.IDE=CAN_ID_STD;//使用标准标识符TxMessage.RTR=CAN_RTR_DATA;//为数据帧TxMessage.DLC=8;    //  消息的数据长度为8个字节TxMessage.Data[0]=Data1; //第一个字节数据TxMessage.Data[1]=Data2; //第二个字节数据 TxMessage.Data[2]=Data3; //第三个字节数据TxMessage.Data[3]=Data4; //第一个字节数据TxMessage.Data[4]=Data5; //第二个字节数据 TxMessage.Data[5]=Data6; //第三个字节数据TxMessage.Data[6]=Data7; //第一个字节数据TxMessage.Data[7]=Data8; //第二个字节数据 CAN_Transmit(CAN1,&TxMessage); //发送数据}
void can_tx1(u8 Data1,u8 Data2,u8 Data3,u8 Data4,u8 Data5,u8 Data6,u8 Data7,u8 Data8)
{ CanTxMsg TxMessage;  TxMessage.StdId=0x22;   //标准标识符为0x00TxMessage.ExtId=0x18DADDF1; //扩展标识符0x0000TxMessage.IDE=CAN_ID_STD;//使用标准标识符TxMessage.RTR=CAN_RTR_DATA;//为数据帧TxMessage.DLC=8;    //  消息的数据长度为8个字节TxMessage.Data[0]=Data1; //第一个字节数据TxMessage.Data[1]=Data2; //第二个字节数据 TxMessage.Data[2]=Data3; //第三个字节数据TxMessage.Data[3]=Data4; //第一个字节数据TxMessage.Data[4]=Data5; //第二个字节数据 TxMessage.Data[5]=Data6; //第三个字节数据TxMessage.Data[6]=Data7; //第一个字节数据TxMessage.Data[7]=Data8; //第二个字节数据 CAN_Transmit(CAN1,&TxMessage); //发送数据}/* USB中断和CAN接收中断服务程序,USB跟CAN公用I/O,这里只用到CAN的中断。 */
void USB_LP_CAN1_RX0_IRQHandler(void)
{CanRxMsg RxMessage;RxMessage.StdId=0x00;RxMessage.ExtId=0x00;RxMessage.IDE=0;RxMessage.DLC=0;RxMessage.FMI=0;RxMessage.Data[0]=0x00;RxMessage.Data[1]=0x00;    CAN_Receive(CAN1,CAN_FIFO0, &RxMessage); //接收FIFO0中的数据  CAN_RX_BUFF[0]=((RxMessage.StdId)&0x0000ff00)>>8;CAN_RX_BUFF[1]=(RxMessage.StdId)&0x000000ff;  //标注0-7ffCAN_RX_BUFF[2]=((RxMessage.ExtId)&0xff000000)>>24;CAN_RX_BUFF[3]=((RxMessage.ExtId)&0x00ff0000)>>16;CAN_RX_BUFF[4]=((RxMessage.ExtId)&0x0000ff00)>>8;CAN_RX_BUFF[5]=((RxMessage.ExtId)&0x000000ff);CAN_RX_BUFF[6]=RxMessage.IDE;CAN_RX_BUFF[7]=RxMessage.DLC;CAN_RX_BUFF[8]=RxMessage.RTR;CAN_RX_BUFF[9]=RxMessage.Data[0];CAN_RX_BUFF[10]=RxMessage.Data[1];CAN_RX_BUFF[11]=RxMessage.Data[2];CAN_RX_BUFF[12]=RxMessage.Data[3];CAN_RX_BUFF[13]=RxMessage.Data[4];CAN_RX_BUFF[14]=RxMessage.Data[5];CAN_RX_BUFF[15]=RxMessage.Data[6];CAN_RX_BUFF[16]=RxMessage.Data[7];NRF24L01_TxPacket((u8*)(CAN_RX_BUFF));
} 

最后得到的实验现象:

can数据的接收,出现大量数据接收时,数据发送方大概每0.005s一个数据发送,而接收数据未0.05s一个数据,但由于数据量比较大时,数据的丢包比较明显,所以该无线程序可以使用在数据量比较小时的数据透传;

程序百度云:链接:https://pan.baidu.com/s/1p3n7kVxUlBTIt9rWlx_Q8Q 
提取码:cyx1

基于NRF24L01的CAN数据透传相关推荐

  1. 产品 电信nb接口调用_基于NB-IoT平台数据透传模式的应用接入平台设计方法与流程...

    本发明涉及互联网.物联网和软件开发技术领域,具体的说,是一种基于NB-IoT平台数据透传模式的应用接入平台设计方法. 背景技术: NB-IoT支持低功耗设备在广域网的蜂窝数据连接,聚焦于低功耗广覆盖( ...

  2. 蓝牙模块耳机做蓝牙透传_WiFi、蓝牙在工业领域的数据透传应用_SKYLAB 无线模块...

    在工业领域的很多应用场景,鉴于有线网络的布线局限,需要借助无线通信技术的数据采集和数据传输来完成各设备数据汇总,并对不同来源的数据进行整理.因此,能够保证数据可靠性和准确性的数据透传成为工业领域中应用 ...

  3. linux mint wifi自动重试_涵盖物联网应用系统低成本WiFi通信模块:4GLTE转WiFi网口DTU串口数据透传APSTA模式等...

    大家好,我叫模小块,代号L107模块,出生在BOJINGnet大家庭里,我在物联网网关里不可或缺,或许业内专业人士和物联网工程师知道我的存在.别看我体积小(40mm25mm3mm),贴片式邮票孔接口( ...

  4. python实现简单的串口数据透传

    简单实现仅作实现思路 数采 设备:AIS+浪潮边缘计算网关 连接方式:串口RS232 计算网关:arm64 ubuntu 环境:python3.6 使用serial连接串口并持续获取数据 ser = ...

  5. SOFA 源码分析 — 链路数据透传

    前言 SOFA-RPC 支持数据链路透传功能,官方解释: 链路数据透传功能支持应用向调用上下文中存放数据,达到整个链路上的应用都可以操作该数据. 使用方式如下,可分别向链路的 request 和 re ...

  6. 基于ESP32实现一个WIFI透传模块demo

    esp32作为一个热门芯片,网上的文章很多,sdk里的例子和官网的教程也是比较详细.不过作为新玩家,还是要先做一些小改动才更容易入门.所以这里就综合几个example代码,写一个简单的透传demo. ...

  7. HC05与STM32进行串口通讯实现与手机APP的数据透传

    HC05与STM32与手机透传 1.实验工具:正点原子的精英版STM32F103ZET6,通用BLE蓝牙模块一个HC05(最便宜的蓝牙模块),手机,电脑 2.HC05调试:若HC05上面有小按键,则按 ...

  8. 通信网络中的数据透传

    1.透传:指与传输网络的介质.调制解调方式.传输方式.传输协议无关的一种数据传送方式. 这就好比快递邮件,邮件中间有可能通过自行车.汽车.火车.飞机的多种组合运输方式到达您的手上,但您不用关心它们中间 ...

  9. linux下c网络编程实现串口与网口的信息透传_串口网口数据透传程序

    comtcp简介 comtcp程序实现linux平台下串口网口数据转发功能,将串口与网口数据透明转发,应用该程序可以用网络TCP访问串口设备; #include#include#include#inc ...

最新文章

  1. 《网络攻防实践》第八周作业
  2. delphi XE 下打开内存泄漏调试功能
  3. 如何在服务器端写关闭窗口的代码?同时能够更新父窗口?
  4. python异步写文件_结合异步http请求将数据写入文件
  5. AOP实践--利用MVC5 Filter实现登录状态判断
  6. 7月13日微软MVP社区夏日巡讲北京站活动现场图集
  7. ubuntu 如何转换 ppk ,连接 amazon ec2
  8. 【转】R语言处理大规模数据集的编程要点
  9. 抖音超火的网页表白代码大全(浪漫的html表白源代码)
  10. vue引入jsmind(右键菜单)
  11. 聚类算法-k均值聚类(K-means)
  12. js前端生成excel文件(表格)并下载
  13. linux无法访问移动硬盘,移动硬盘“无法访问”的解决方案
  14. SUN ZFS STORAGE 7320阵列管理
  15. iMazing2023iOS系统设备数据传输与备份工具使用教程
  16. 使用画图工具draw.io的嵌入模式实现uml图绘制功能的尝试(1)
  17. H3C交换机如何查环路
  18. xmanager无法连接Linux服务器,解决xmanager连接linux出错问题
  19. android盒子远程,电视盒子ADB教程 通过ADB远程安装应用方法
  20. ecmall 学习记录

热门文章

  1. 在html中对页面大小的设置吗,网页设计一般页面尺寸怎么设置呢?
  2. 手机端网页设计尺寸,手机端网页设计图片尺寸
  3. unity animator动画融合时的上下半身速度分离控制
  4. 分治算法--L型骨牌棋盘覆盖
  5. 腾讯TDSQL全时态数据库系统论文入选VLDB
  6. 使用Endnotes生成知网参考文献的Latex引文格式(BibTex)
  7. 提速降费再发力 中国联通推出八项惠民便民措施
  8. pyqt5版本灭霸响指
  9. Revit二次开发之 自定义选项卡排在最前端
  10. Git与GitHub基础全套完整版教程(持续更新....)