当前位置: 首页 > news >正文

NRF24L01模块通信实验

NRF24L01简要介绍

在这里插入图片描述

  这里主要介绍模块的最重要的参数,废话就不多介绍了。
  该模块是一款无线通信模块,一个模块即可同时具备发射和接收数据的功能,但是要想实现通信必须使用两个模块之间才能进行通信。NRF24L01模块使用的总线控制方式为SPI总线。SPI的通信方式本文就不介绍了。

预备知识

  首先需要知道NRF24L10的通信过程是怎样的,这里主要是指具体的通信方式,假设一个模块A设置为发送方,另一个模块B设置为接收方,那么A和B之间通信需要几个基本设置,只有配置好这些参数后,双方才能进行通信。

通道

  通道是发送方与接收方的通信具体的一条路,可以这么理解,比如小时候我们玩的两个人用纸杯子连一条线来进行传话,那么这里这条线就可以理解为通道,因为双方的声音是通过这条线进行传输的。对于NRF24L01模块,其最多有6个通道,也就是说,一个设备,最多可以与6个设备同时进行通信。

发送地址与接收地址

  模块通信中有TX_ADDR和RX_ADDR两个地址。
  所谓发送地址就是对于当前模块,你希望将数据在数据通道中发往哪个具体的地址,这个地址就是发送地址。对于发送模式下,需要对该地址进行配置。接收地址其实有些同学可能会越看越觉得难以理解,其实我们换个说法就很容易理解了,直接把接收地址理解为本地地址,也就是你用这个地址来接收别人发送的数据的地址,只有当别人发送过来的数据的发送地址和你的地址相同时,你才将这个数据进行接收。
  对于接收地址,接收模式下需要进行配置,这是理所当然的,但是注意!接收地址在发送模式中也要进行配置(当工作在自动应答模式下),为什么呢?这是因为作为发送方,我们发送完数据后,还需要通过接收应答信号来确定接收方是否接收到了我们发送的数据,那么这个接收方的应答信号来了的话,发送方就需要去接收,因此这也是我们配置接收地址的原因了。
  在NRF24L01模块中,发送地址TX_ADDR只有一个,而接收地址最多可以配置6个。

NRF24L01引脚介绍

  数据手册上有很多引脚的介绍,但是我们实际使用的话主要用到其中6个引脚,如下图。
在这里插入图片描述
  其中SPI的四个引脚就不过多介绍了。主要介绍另外两个引脚CE和IRQ。在下一节可以看到,CE的主要功能是用来配置NRF24L01的工作模式的。而另外一个引脚IRQ其实是中断引脚,这里具体解释一下这个引脚的作用是什么。
  当下面的情况发生时,IRQ引脚会被硬件自动拉低用于提醒我们中断的产生:
1、接收到数据时,IRQ引脚会被硬件拉低;
2、发送数据成功时,IRQ引脚会被硬件拉低;
3、达到最大重发次数时,IRQ引脚会被硬件拉低;
  当上述三种情况发生时,通过IRQ引脚的检测,我们可以知道事件的发生,比如在发射模式下,我们可以通过检测IRQ引脚是否被拉低来得知发送是否完成或者是发送次数达到最大重发次数。当IRQ引脚发起中断后,必须进行手动清除中断,否则IRQ引脚将一直保持低电平状态,在后面讲到的STATUS寄存器中,我们可以通过对STATUS寄存器的RX_DR、TX_DS、MAX_RT三个位置1分别清除三种情况产生的中断。

NRF24L01工作模式

  在数据手册中,模块有6种工作模式,如果只是进行简单的通信实验我们不需要了解那么多,只需要知道三种模式:掉电模式、发射模式、接收模式。掉电模式顾名思义,就是让模块处于关机状态为了省电,此时PWR_UP位为0。发射模式和接收模式的引脚具体配置如下图所示,这里需要额外说明的有两点第一个是,在配置为发射模式时,需要将CE引脚拉低至少10us;第二个是不管是配置为发射模式还是接收模式,首先需要让模块处于掉电模式(不过在实际操作过程中发现好像没有进行这一步操作也没什么问题,但最好还是按手册规定来)。
在这里插入图片描述

NRF24L01相关操作码

  这里主要介绍需要用到的操作码。一般不会用到的操作码就不介绍了,具体如下图所示。
在这里插入图片描述
  R_REGISTER指令用于对寄存器进行读操作,0x000A AAAA,这里的A表示任意的数据,也就是你寄存器的地址,读操作时,前面三位必须是0;同理,写寄存器操作时,前面三位必须是001。
  R_RX_PAYLOAD是读取接收数据寄存器中数据的操作码,最多读32字节。
W_RX_PAYLOAD是写数据到发送数据寄存器的操作,同样最多32字节。其实这里我不太理解为什么名称不是W_TX_PAYLOAD,在实际代码中我还是比较喜欢用W_TX_PAYLOAD来表示这个操作码的。
  FLUSH_RX和FLUSH_TX就是用于清空接收数据寄存器和发送数据寄存器的操作码,因为有些情况寄存器中发送或者接收的数据会满了,如果没有及时清空里面的内容,会导致下一次的数据读取或接收产生错误。

寄存器地址

  这里我们同样只介绍一般情况下需要用到的寄存器。

CONFIG寄存器

  CONFIG寄存器主要用于对工作模式进行设置;
  CONFIG寄存器地址:0x00
  发射模式下设置参数:0x0E
  接收模式设置参数:0x0F
在这里插入图片描述

EN_AA寄存器

  EN_AA寄存器主要用于使能通道自动应答;
  EN_AA寄存器地址:0x01
  用到第几个通道就将对应的位置1,例如用到通道0则EN_AA:0x01;
在这里插入图片描述

EN_RXADDR寄存器

  EN_RXADDR寄存器主要用于使能数据通道接收允许;
  EN_RXADDR地址:0x02
  用到第几个通道就将对应的位置1;
在这里插入图片描述
在这里插入图片描述

SETUP_AW寄存器

  SETUP_AW寄存器地址:0x03
  SETUP_AW寄存器主要用于对地址长度进行配置(第0位和第1位);
  具体配置规则见下表。注意这里的地址长度是发射地址和接收地址,而不是单独某一个,也就是说发射地址和接收地址的长度必须一样。
在这里插入图片描述

SETUP_RETR寄存器

  SETUP_RETR寄存器地址:0x04
  SETUP_RETR寄存器主要用于重发相关的参数配置,主要包括重发时间间隔和重发次数;
在这里插入图片描述

RF_CH寄存器

  RF_CH寄存器地址:0x05;
  RF_CH寄存器主要用于设置通道的工作频率(第0位到第6位);
在这里插入图片描述

RF_SETUP寄存器

  RF_SETUP寄存器地址:0x06;
  RF_SETUP寄存器主要用于配置传输速率(第3位)和发射功率(第2位和第1位);
在这里插入图片描述

STATUS寄存器

  STATUS寄存器地址:0x07:
  STATUS寄存器主要用来获取当前模块状态的,通过该寄存器可以得知模块是否发送数据成功(发射模式下)、接收到数据(接收模式下)、是否达到最大重发次数(发射模式下)及其他相关信息。通过检查STATUS寄存器的RX_DR位可以判断在接收状态下是否收到数据,并对该位写1清除中断,实现对该位的清零操作。对于TX_DS和MAX_RT位同理。

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

RX_ADDR_P0寄存器

  RX_ADDR_P0寄存器地址:0x0A;
  RX_ADDR_P0寄存器主要用于设置接收通道0的接收地址,最大长度为5;
  还有通道12345也是相同的,就不一一列出了;
在这里插入图片描述

TX_ADDR寄存器

  TX_ADDR寄存器地址:0x10;
  TX_ADDR寄存器主要用于配置发射地址,一个设备只有一个发射地址,最大长度5;
在这里插入图片描述

RX_PW_P0寄存器

  RX_PW_P0寄存器地址:0x11;
  RX_PW_P0寄存器主要用于设置接收通道0的接收地址宽度,范围在1-32,不能设置为0;通道12345也是相同的,就不一一列出了;
在这里插入图片描述
  至此,所有需要用到的寄存器就全部介绍完了,接下来我们进入代码部分。

各功能代码

相关定义

#ifndef __NRF_H__
#define __NRF_H__
#include <STC8.H>
#include"UART.h"sbit CE=P6^0;
sbit CS=P6^1;
sbit CLK=P6^2;
sbit MOSI=P6^3;
sbit MISO=P6^4;
sbit IRQ=P6^5;#define TX_ADDR_WIDTH 5
#define RX_ADDR_WIDTH 5
#define TX_PLOAD_WIDTH 1
#define RX_PLOAD_WIDTH 1#define READ_REG		0x00
#define WRITE_REG		0x20
#define R_RX_PAYLOAD	0x61
#define W_TX_PAYLOAD	0xA0
#define FLUSH_TX		0xE1
#define FLUSH_RX		0xE2#define CONFIG			0x00
#define EN_AA			0x01
#define EN_RXADDR		0x02
#define SETUP_AW		0x03
#define SETUP_RETR		0x04
#define RF_CH			0x05
#define RF_SETUP		0x06
#define STATUS			0x07
#define RX_ADDR_P0		0x0A
#define TX_ADDR			0x10
#define RX_PW_P0		0x11#define RX_FLAG			0x40
#define TX_FLAG			0x20
#define MAX_FLAG		0x10void NRF_Init();
void NRF_Tx_Mode();
uchar NRF_Tx_Data(uchar*buffer);
void NRF_Rx_Mode();
uchar NRF_Rx_Data(uchar*buffer);
#endif

注意,引脚对应需要按照你自己的接线方式来修改。

NRF24L01初始化

void NRF_Init()
{CE=1;CS=1;CLK=0;
}

SPI读写

uchar SPI_RW(uchar Byte)
{uchar i;for(i=0;i<8;i++){if(Byte&0x80)MOSI=1;elseMOSI=0;CLK=1;Byte<<=1;if(MISO)Byte|=0x01;CLK=0;}return Byte;
}

NRF24L01写寄存器一个字节

uchar NRF_Write(uchar addr,Byte)
{uchar status;CS=0;status=SPI_RW(addr);SPI_RW(Byte);CS=1;return status;
}

NRF24L01读寄存器一个字节

uchar NRF_Read(uchar addr)
{uchar Byte;CS=0;SPI_RW(addr);Byte=SPI_RW(0xFF);CS=1;return Byte;
}

NRF24L01写多个字节

uchar NRF_Write_Buffer(uchar addr,uchar*buffer,uchar len)
{uchar status;CS=0;status=SPI_RW(addr);while(len--){SPI_RW(*buffer);buffer++;}CS=1;return status;
}

NRF24L01读多个字节

uchar NRF_Read_Buffer(uchar addr,uchar*buffer,uchar len)
{uchar status;CS=0;status=SPI_RW(addr);while(len--){*buffer=SPI_RW(0xFF);buffer++;}CS=1;return status;
}

NRF24L01配置为发射模式

void NRF_Tx_Mode()
{CE=0;NRF_Write_Buffer(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADDR_WIDTH);NRF_Write_Buffer(WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADDR_WIDTH);NRF_Write(WRITE_REG+EN_AA,0x01);NRF_Write(WRITE_REG+EN_RXADDR,0x01);NRF_Write(WRITE_REG+SETUP_AW,0x03);NRF_Write(WRITE_REG+SETUP_RETR,0x0F);NRF_Write(WRITE_REG+RF_CH,27);NRF_Write(WRITE_REG+RF_SETUP,0x0F);NRF_Write(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);NRF_Write(WRITE_REG+CONFIG,0x0E);CE=1;
}

NRF24L01配置为接收模式

void NRF_Rx_Mode()
{CE=0;NRF_Write_Buffer(WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADDR_WIDTH);NRF_Write(WRITE_REG+EN_AA,0x01);NRF_Write(WRITE_REG+EN_RXADDR,0x01);NRF_Write(WRITE_REG+SETUP_AW,0x03);NRF_Write(WRITE_REG+SETUP_RETR,0x0F);NRF_Write(WRITE_REG+RF_CH,27);NRF_Write(WRITE_REG+RF_SETUP,0x0F);NRF_Write(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);NRF_Write(WRITE_REG+CONFIG,0x0F);CE=1;
}

NRF24L01发送数据

// 这里的返回值只是我自己调试代码的过程中自己设置的 你可以不要返回值或者按照你的需要进行修改返回值
uchar NRF_Tx_Data(uchar*buffer)
{uchar state;CE=0;NRF_Write_Buffer(W_TX_PAYLOAD,buffer,TX_PLOAD_WIDTH);CE=1;while(IRQ);state=NRF_Read(STATUS);NRF_Write(WRITE_REG+STATUS,state);if(state&TX_FLAG)return 0x01;else if(state&MAX_FLAG){NRF_Write(FLUSH_TX,0xFF);return 0xFF;}return 0x00;
}

NRF24L01接收数据

// 这里的返回值只是我自己调试代码的过程中自己设置的 你可以不要返回值或者按照你的需要进行修改返回值
uchar NRF_Rx_Data(uchar*buffer)
{uchar state;state=NRF_Read(STATUS);NRF_Write(WRITE_REG+STATUS,state);if(state&RX_FLAG){NRF_Read_Buffer(R_RX_PAYLOAD,buffer,RX_PLOAD_WIDTH);NRF_Write(FLUSH_RX,0xFF);return 0x01;}return 0x00;
}



总体代码

NRF.h

#ifndef __NRF_H__
#define __NRF_H__
#include <STC8.H>
#include"UART.h"sbit CE=P6^0;
sbit CS=P6^1;
sbit CLK=P6^2;
sbit MOSI=P6^3;
sbit MISO=P6^4;
sbit IRQ=P6^5;#define TX_ADDR_WIDTH 5
#define RX_ADDR_WIDTH 5
#define TX_PLOAD_WIDTH 1
#define RX_PLOAD_WIDTH 1#define READ_REG		0x00
#define WRITE_REG		0x20
#define R_RX_PAYLOAD	0x61
#define W_TX_PAYLOAD	0xA0
#define FLUSH_TX		0xE1
#define FLUSH_RX		0xE2#define CONFIG			0x00
#define EN_AA			0x01
#define EN_RXADDR		0x02
#define SETUP_AW		0x03
#define SETUP_RETR		0x04
#define RF_CH			0x05
#define RF_SETUP		0x06
#define STATUS			0x07
#define RX_ADDR_P0		0x0A
#define TX_ADDR			0x10
#define RX_PW_P0		0x11#define RX_FLAG			0x40
#define TX_FLAG			0x20
#define MAX_FLAG		0x10void NRF_Init();
void NRF_Tx_Mode();
uchar NRF_Tx_Data(uchar*buffer);
void NRF_Rx_Mode();
uchar NRF_Rx_Data(uchar*buffer);
#endif

NRF.h

#include"NRF.h"uchar TX_ADDRESS[]={0x00,0x11,0x22,0x33,0x44};
uchar RX_ADDRESS[]={0x00,0x11,0x22,0x33,0x44};void NRF_Init()
{CE=1;CS=1;CLK=0;
}
uchar SPI_RW(uchar Byte)
{uchar i;for(i=0;i<8;i++){if(Byte&0x80)MOSI=1;elseMOSI=0;CLK=1;Byte<<=1;if(MISO)Byte|=0x01;CLK=0;}return Byte;
}uchar NRF_Write(uchar addr,Byte)
{uchar status;CS=0;status=SPI_RW(addr);SPI_RW(Byte);CS=1;return status;
}
uchar NRF_Read(uchar addr)
{uchar Byte;CS=0;SPI_RW(addr);Byte=SPI_RW(0xFF);CS=1;return Byte;
}
uchar NRF_Write_Buffer(uchar addr,uchar*buffer,uchar len)
{uchar status;CS=0;status=SPI_RW(addr);while(len--){SPI_RW(*buffer);buffer++;}CS=1;return status;
}
uchar NRF_Read_Buffer(uchar addr,uchar*buffer,uchar len)
{uchar status;CS=0;status=SPI_RW(addr);while(len--){*buffer=SPI_RW(0xFF);buffer++;}CS=1;return status;
}
void NRF_Tx_Mode()
{CE=0;NRF_Write_Buffer(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADDR_WIDTH);NRF_Write_Buffer(WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADDR_WIDTH);NRF_Write(WRITE_REG+EN_AA,0x01);NRF_Write(WRITE_REG+EN_RXADDR,0x01);NRF_Write(WRITE_REG+SETUP_AW,0x03);NRF_Write(WRITE_REG+SETUP_RETR,0x0F);NRF_Write(WRITE_REG+RF_CH,27);NRF_Write(WRITE_REG+RF_SETUP,0x0F);NRF_Write(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);NRF_Write(WRITE_REG+CONFIG,0x0E);CE=1;
}
uchar NRF_Tx_Data(uchar*buffer)
{uchar state;CE=0;NRF_Write_Buffer(W_TX_PAYLOAD,buffer,TX_PLOAD_WIDTH);CE=1;while(IRQ);state=NRF_Read(STATUS);NRF_Write(WRITE_REG+STATUS,state);if(state&TX_FLAG)return 0x01;else if(state&MAX_FLAG){NRF_Write(FLUSH_TX,0xFF);return 0xFF;}return 0x00;
}
void NRF_Rx_Mode()
{CE=0;NRF_Write_Buffer(WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADDR_WIDTH);NRF_Write(WRITE_REG+EN_AA,0x01);NRF_Write(WRITE_REG+EN_RXADDR,0x01);NRF_Write(WRITE_REG+SETUP_AW,0x03);NRF_Write(WRITE_REG+SETUP_RETR,0x0F);NRF_Write(WRITE_REG+RF_CH,27);NRF_Write(WRITE_REG+RF_SETUP,0x0F);NRF_Write(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);NRF_Write(WRITE_REG+CONFIG,0x0F);CE=1;
}
uchar NRF_Rx_Data(uchar*buffer)
{uchar state;state=NRF_Read(STATUS);NRF_Write(WRITE_REG+STATUS,state);if(state&RX_FLAG){NRF_Read_Buffer(R_RX_PAYLOAD,buffer,RX_PLOAD_WIDTH);NRF_Write(FLUSH_RX,0xFF);return 0x01;}return 0x00;
}

UART.h

#ifndef __UART_H__
#define __UART_H__#include <STC8.H>#define uchar unsigned char
void Uart1_Init();
void UartSendByte(uchar Byte);#endif

UART.c

#include"UART.h"void Uart1_Init(void)	//9600bps@11.0592MHz
{SCON = 0x50;		//8位数据,可变波特率AUXR |= 0x40;		//定时器时钟1T模式AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器TMOD &= 0x0F;		//设置定时器模式TL1 = 0xE0;			//设置定时初始值TH1 = 0xFE;			//设置定时初始值ET1 = 0;			//禁止定时器中断TR1 = 1;			//定时器1开始计时
}void UartSendByte(uchar Byte)
{SBUF=Byte;while(TI==0);TI=0;
}

main.c

#include <STC8.H>
#include"UART.h"
#include"NRF.h"
// 0:接收 1:发射
#define MODE 0
void Delay500ms(void)	//@11.0592MHz
{unsigned char data i, j, k;i = 29;j = 14;k = 54;do{do{while (--k);} while (--j);} while (--i);
}
uchar tx_buffer[1];
uchar rx_buffer[1];
/*
程序说明
该程序实现了独立接线的NRF24L01模块的通信实验
成功实现发送与接收 可通过MODE的值设置为发射还是接收模式
发射和接收地址:{0x00,0x11,0x22,0x33,0x44} 通道27
*/
void main()
{uchar state;Uart1_Init();NRF_Init();if(MODE)NRF_Tx_Mode();elseNRF_Rx_Mode();while(1){if(MODE){tx_buffer[0]=(tx_buffer[0]+1)%10;state=NRF_Tx_Data(tx_buffer);UartSendByte(state);}else{state=NRF_Rx_Data(rx_buffer);if(state==0x01)UartSendByte(rx_buffer[0]);}Delay500ms();}
}

再次提醒!!!模块必须使用两个才能进行通信!!!需要用两块板子两个模块搭配才能进行通信!!!如果看完这篇文章对你有帮助的话不妨点个赞吧~~~

相关文章:

NRF24L01模块通信实验

NRF24L01简要介绍 这里主要介绍模块的最重要的参数&#xff0c;废话就不多介绍了。   该模块是一款无线通信模块&#xff0c;一个模块即可同时具备发射和接收数据的功能&#xff0c;但是要想实现通信必须使用两个模块之间才能进行通信。NRF24L01模块使用的总线控制方式为SPI总…...

2024年12月CCF-GESP编程能力等级认证Scratch图形化编程三级真题解析

本文收录于《Scratch等级认证CCF-GESP图形化真题解析》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 一、单选题(一共 15 个题目,每题 2 分,共 30 分) 第 1 题 2024 年 10 月 8 日,诺贝尔物理学奖“意外地”颁给了两位计算机科学家约翰霍普菲尔德(John J. …...

【MySQL系列】VARCHAR为啥一般是255

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

图文教程:使用PowerDesigner导出数据库表结构为Word/Html文档

1、第一种情况-无数据库表&#xff0c;但有数据模型 1.1 使用PowerDesigner已完成数据建模 您已经使用PowerDesigner完成数据库建模&#xff0c;如下图&#xff1a; 1.2 Report配置和导出 1、点击&#xff1a;Report->Reports&#xff0c;如下图&#xff1a; 2、点击&…...

Coroutine 基础五 —— Flow 之 Channel 篇

1、Channel 与 Flow 简介与对比 所有知识都可总结为一个字 —— 流。包括数据流、事件流、状态流。 开发中最常用的 StateFlow 提供状态订阅。可以将一些信息包进 StateFlow 中进行保存。比如界面上显示的字符串&#xff0c;或者系统级别的信息&#xff0c;如用户状态。装进 …...

快速掌握Elasticsearch检索之二:滚动查询(scrool)获取全量数据(golang)

Elasticsearch8.17.0在mac上的安装 Kibana8.17.0在mac上的安装 Elasticsearch检索方案之一&#xff1a;使用fromsize实现分页 1、滚动查询的使用场景 滚动查询区别于上一篇文章介绍的使用from、size分页检索&#xff0c;最大的特点是&#xff0c;它能够检索超过10000条外的…...

C++设计模式:状态模式(自动售货机)

什么是状态模式&#xff1f; 状态模式是一种行为型设计模式&#xff0c;它允许一个对象在其内部状态发生改变时&#xff0c;动态改变其行为。通过将状态相关的逻辑封装到独立的类中&#xff0c;状态模式能够将状态管理与行为解耦&#xff0c;从而让系统更加灵活和可维护。 通…...

【网络安全实验室】脚本关实战详情

难道向上攀爬的那条路&#xff0c;不是比站在顶峰更让人热血澎湃吗 1.key又又找不到了 点击链接&#xff0c;burp抓包&#xff0c;发送到重放模块&#xff0c;点击go 得到key 2.快速口算 python3脚本 得到key 3.这个题目是空的 试了一圈最后发现是 4.怎么就是不弹出key呢…...

ts总结一下

ts基础应用 /*** 泛型工具类型*/ interface IProps {id: string;title: string;children: number[]; } type omita Omit<IProps, id | title>; const omitaA: omita {children: [1] }; type picka Pick<IProps, id | title>; const pickaA: picka {id: ,title…...

MySQL数据库笔记——主从复制

大家好&#xff0c;这里是Good Note&#xff0c;关注 公主号&#xff1a;Goodnote&#xff0c;本文详细介绍 MySQL的主从复制&#xff0c;从原理到配置再到同步过程。 文章目录 简介核心组件主从复制的原理作用主从复制的线程模型主从复制的模式形式复制的方式设计复制机制主从…...

OpenAI发布o3:圣诞前夜的AI惊喜,颠覆性突破还是技术焦虑?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

欧拉-伯努利梁自由波动的频散关系

梁和杆都是一维结构,但是梁的弯曲波比杆的纵波要复杂多。例如即使最简单的欧拉-伯努利(Euler-Bernoulli)梁的弯曲波也具有频散特征,且当梁的特征尺寸和弯曲波波长满足某个比值时,欧拉-伯努利梁不再适用,需要引入铁摩辛克(Timoshenko)梁模型。 考察某一欧拉-伯努利梁,长度…...

Cursor小试1.生成一个网页的接口请求工具

一般开发过程中,会涉及到接口的调试,往往有时候开发的电脑不是我们自己的,没有安装一些类似postman 的接口调用工具,所以发现问题或者要测试某些接口是否正常的时候会很麻烦,而且现在网上也没有找到很好的免费的网页端接口请求的网址,所以我们使用Cursor来编写这样一个小工具, …...

Xilinx DCI技术

Xilinx DCI技术 DCI技术概述Xilinx DCI技术实际使用某些Bank特殊DCI要求 DCI级联技术DCI端接方式阻抗控制驱动器&#xff08;源端接&#xff09;半阻抗控制阻抗驱动器&#xff08;源端接&#xff09;分体式DCI&#xff08;戴维宁等效端接到VCCO/2&#xff09;DCI和三态DCI&…...

Kubernetes Pod 优雅关闭:如何让容器平稳“退休”?

Kubernetes Pod 优雅关闭&#xff1a;如何让容器平稳“退休”&#xff1f; 在 Kubernetes 中&#xff0c;Pod 是应用的基本单元。你可能会遇到需要停止某个 Pod 或容器的情况&#xff0c;可能是因为要更新、调整或故障恢复。在这种情况下&#xff0c;Pod 的优雅关闭&#xff0…...

鸿蒙应用开发(1)

可能以为通过 鸿蒙应用开发启航计划&#xff08;点我去看上一节&#xff09; 的内容&#xff0c;就足够了&#xff0c;其实还没有。 可是我还是要告诉你&#xff0c;你还需要学习新的语言 -- ArkTS。 &#xff0c;ArkTS是HUAWEI开发的程序语言。你需要学习这门语言。这会花费你…...

SimForge HSF 案例分享|复杂仿真应用定制——UAVSim无人机仿真APP(技术篇)

导读 「神工坊」核心技术——「SimForge HSF高性能数值模拟引擎」支持工程计算应用的快速开发、自动并行&#xff0c;以及多域耦合、AI求解加速&#xff0c;目前已实现航发整机数值模拟等多个系统级高保真数值模拟应用落地&#xff0c;支持10亿阶、100w核心量级的高效求解。其低…...

使用 Adaptive Mesh Refinement 加速 CFD 仿真:最佳实践

CFD 仿真中的网格划分挑战 技术的进步正在增强设计探索&#xff0c;数值仿真在优化工程设计方面发挥着至关重要的作用。通常&#xff0c;计算流体动力学 &#xff08;CFD&#xff09; 仿真从定制的手工网格开始&#xff0c;具有精细和粗糙的区域&#xff0c;以平衡分辨率和单元…...

前端-动画库Lottie 3分钟学会使用

目录 1. Lottie地址 2. 使用html实操 3. 也可以选择其他的语言 1. Lottie地址 LottieFiles: Download Free lightweight animations for website & apps.Effortlessly bring the smallest, free, ready-to-use motion graphics for the web, app, social, and designs.…...

智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之5

本文要点 前端 问题描述语言 本文继续完善 “描述” ---现在我们应该可以将它称为 “问题problem描述语言 ”。 它 通过对话框的question 引发 表征的issue 的“涌现” 最终 厘清应用程序的“problem”。即它合并了 ISO七层模型中的上面三层&#xff0c;通过将三层 分别形成…...

java web

流程 1.浏览器发送http协议的格式数据和url给服务器软件tomcat 2.浏览器解析http格式数据并创建request和response对象,把数据封装到request对象里。 3.tomcat解析url确定访问路径&#xff0c;如果是静态资源html等&#xff0c;直接将html数据作为http格式响应体返回&#x…...

【嵌入式软件开发】嵌入式软件计时逻辑的两种实现:累加与递减的深入对比

本文主要从四个方面详细阐述了嵌入式软件编程中计时逻辑的两种实现方式:累加和递减。让我为您详细解析各个部分: 1. 基本概念对比 累加方式 从0开始向上计数每个周期增加固定值(通常为1)类似于我们日常生活中的秒表计时方式递减方式 从预设值开始向下计数每个周期减少固定…...

如何将vCenter6.7升级7.0?

vCenter是什么&#xff1f; vCenter是一种虚拟化管理软件&#xff0c;由VMware公司开发和发布。它是VMware vSphere虚拟化平台的核心组件之一&#xff0c;主要用于集中管理和监控虚拟化环境中的虚拟机、虚拟存储和网络资源。vCenter可以实现对多个ESXi主机的集中管理&#xff…...

服务器网卡绑定mode和交换机的对应关系

互联网各领域资料分享专区(不定期更新)&#xff1a; Sheet 模式类别 网卡绑定mode共有七种(0~6): bond0、bond1、bond2、bond3、bond4、bond5、bond6 mode详解 mode0 &#xff0c;即:(balance-rr) Round-robin policy(平衡轮循环策略&#xff0c;需要配置交换机静态聚合) mode…...

Maven (day04)

什么是maven? Maven 是 Apache 旗下的一个开源项目&#xff0c;是一款用于管理和构建 java 项目的工具。 官网&#xff1a;Welcome to Apache Maven – Maven https://maven.apache.org/ Maven的作用 依赖管理&#xff08;方便快捷的管理项目依赖的资源(jar包)&#xff…...

Echart实现3D饼图示例

在可视化项目中&#xff0c;很多地方会遇见图表&#xff1b;echart是最常见的&#xff1b;这个示例就是用Echart&#xff0c; echart-gl实现3D饼图效果&#xff0c;复制即可用 //需要安装&#xff0c;再引用依赖import * as echarts from "echarts"; import echar…...

UE5 Debug的一些心得

1、BUG粗略可分为两类&#xff1a; 一种是显性的&#xff0c;编译直接就通不过&#xff0c;必须马上解决。 第二种是隐性的&#xff0c;新功能完成后&#xff0c;编译成功顺利运行&#xff0c;洋洋自得&#xff0c;而问题隐藏在幕后&#xff0c;测试之后才逐渐发现有问题&…...

java中多线程的一些常见操作

Java 中的多线程是通过并发编程来提高应用程序的效率和响应速度。Java 提供了多个机制和类来支持多线程编程&#xff0c;包括继承 Thread 类、实现 Runnable 接口、使用线程池等。以下是 Java 中一些常见的多线程操作和应用场景。 1. 创建线程 1.1 通过继承 Thread 类创建线程…...

【gopher的java学习笔记】什么是Spring - IoC和DI

一聊到java&#xff0c;离不开的一个东西就是spring&#xff1b;当我想了解什么是spring的时候&#xff0c;一查&#xff0c;基本上都是围绕着两个词来展开的&#xff1a;IoC和AOP。 对于我自己来说&#xff0c;AOP我觉得比较好理解&#xff0c;因为不管是之前写golang还是pyt…...

【开源免费】基于SpringBoot+Vue.JS校园社团信息管理系统(JAVA毕业设计)

本文项目编号 T 107 &#xff0c;文末自助获取源码 \color{red}{T107&#xff0c;文末自助获取源码} T107&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...