RA4M2开发(3)----读取ISL29035数据,并在OLED上显示,串口打印

news2024/11/30 0:46:00

概述

  1. 首先导入必要的库文件,包括I2C驱动和OLED驱动。
  2. 在代码中配置I2C接口,并初始化I2C驱动。
  3. 配置ISL29035传感器,包括配置传感器的工作模式和量程。
  4. 使用I2C读取ISL29035传感器的数据,并将其存储在变量中。
  5. 初始化OLED驱动,并在OLED屏幕上显示读取的数据。
    请注意,这仅是一个大致的步骤,具体实现可能因硬件和软件环境而异。
    对于OLED的配置,可以查看往期的博客。
    最近在弄ST和瑞萨的课程,需要样片的可以加群申请:6_15061293 。

硬件准备

首先需要准备一个开发板,这里我准备的是芯片型号R7FAM2AD3CFP的开发板:
在这里插入图片描述

样品申请

https://www.wjx.top/vm/wBbmSFp.aspx#

IIC配置

配置RA4M2的I2C接口,使其作为I2C master进行通信。
对于OLED的IIC配置,可以查看往期的博客。
查看ISL29035说明书,最小电路图如下所示。
在这里插入图片描述

由于需要读取ISL29035数据,需要使用IIC接口,这里使用PMOD2上的接口(P410和P411)。
在这里插入图片描述

点击Stacks->New Stack->Connectivity -> I2C Master(r_sci_i2c)。
在这里插入图片描述

查看说明书可以得知,ISL29035的地址为0x44(1000100)。
在这里插入图片描述

设置IIC的配置。
在这里插入图片描述

R_SCI_I2C_Open()函数原型

在这里插入图片描述

R_SCI_I2C_Open()函数为执行IIC初始化,开启配置如下所示。

        /* Initialize the I2C module */
        err = R_SCI_I2C_Open(&g_i2c0_ctrl, &g_i2c0_cfg);
        /* Handle any errors. This function should be defined by the user. */
        assert(FSP_SUCCESS == err);

R_SCI_I2C_Write()函数原型

在这里插入图片描述

R_SCI_I2C_Write()函数是向IIC设备中写入数据,写入格式如下所示。

    err = R_SCI_I2C_Write(&g_i2c0_ctrl, &g_i2c_tx_buffer[0], I2C_BUFFER_SIZE_BYTES, false);
    assert(FSP_SUCCESS == err);

R_SCI_I2C_Read()函数原型

在这里插入图片描述

R_SCI_I2C_Read()函数是向IIC设备中读取数据,读取格式如下所示。

    err = R_SCI_I2C_Write(&g_i2c0_ctrl, &g_i2c_tx_buffer[0], I2C_BUFFER_SIZE_BYTES, false);
    assert(FSP_SUCCESS == err);

sci_i2c_master_callback()回调函数

对于数据是否发送完毕,可以查看是否获取到I2C_MASTER_EVENT_TX_COMPLETE字段。
在这里插入图片描述

/* Callback function */
i2c_master_event_t i2c_event1 = I2C_MASTER_EVENT_ABORTED;
void sci_i2c_master_callback0(i2c_master_callback_args_t *p_args)
{
    /* TODO: add your own code here */
    i2c_event1 = I2C_MASTER_EVENT_ABORTED;
    if (NULL != p_args)
    {
        /* capture callback event for validating the i2c transfer event*/
        i2c_event1 = p_args->event;
    }
}

ISL29035写数据

对于ISL29035写数据,手册上的操作方式如下所示。
设备地址+操作地址+数据
在这里插入图片描述

初始化程序如下所示。

void DigitalLightISL29035_writeRegister( int reg_address, uint8_t val) {

    uint8_t ii[2]={0x00,0x00};
    ii[0] = reg_address;
    ii[1] = val;


    err = R_SCI_I2C_Write(&g_i2c0_ctrl, ii, 0x02, false);
           assert(FSP_SUCCESS == err);
           /* Since there is nothing else to do, block until Callback triggers*/
           //while ((I2C_MASTER_EVENT_TX_COMPLETE != i2c_event) && timeout_ms)
           while ((I2C_MASTER_EVENT_TX_COMPLETE != i2c_event1) && timeout_ms1>0)
           {
               R_BSP_SoftwareDelay(1U, BSP_DELAY_UNITS_MICROSECONDS);
               timeout_ms1--;
           }
           if (I2C_MASTER_EVENT_ABORTED == i2c_event1)
           {
               __BKPT(0);
           }
           /* Read data back from the I2C slave */
           i2c_event1 = I2C_MASTER_EVENT_ABORTED;
           timeout_ms1           = 100000;


}

ISL29035读数据

对于ISL29035读数据,手册上的操作方式如下所示。
设备地址+操作地址+设备地址+数据读取
在这里插入图片描述

读取操作函数如下所示,先发送操作地址,在进行读取。

uint8_t DigitalLightISL29035_readRegister(uint8_t reg_address) {

    uint8_t value;
    err = R_SCI_I2C_Write(&g_i2c0_ctrl, &reg_address, 0x01, false);
    assert(FSP_SUCCESS == err);
    /* Since there is nothing else to do, block until Callback triggers*/
    while ((I2C_MASTER_EVENT_TX_COMPLETE != i2c_event1) && timeout_ms1>0)
    {
        R_BSP_SoftwareDelay(1U, BSP_DELAY_UNITS_MICROSECONDS);
        timeout_ms1--;
        }
    if (I2C_MASTER_EVENT_ABORTED == i2c_event1)
    {
        __BKPT(0);
        }
    /* Read data back from the I2C slave */
    i2c_event1 = I2C_MASTER_EVENT_ABORTED;
    timeout_ms1           = 100000;

    /* Read data from I2C slave */
    err = R_SCI_I2C_Read(&g_i2c0_ctrl, &value, 0x01, false);
    assert(FSP_SUCCESS == err);
    while ((I2C_MASTER_EVENT_RX_COMPLETE != i2c_event1) && timeout_ms1)
    {
        R_BSP_SoftwareDelay(1U, BSP_DELAY_UNITS_MILLISECONDS);
        timeout_ms1--;
    }
    if (I2C_MASTER_EVENT_ABORTED == i2c_event1)
    {
        __BKPT(0);
    }

    i2c_event1 = I2C_MASTER_EVENT_ABORTED;
    timeout_ms1           = 100000;
    return value;
}

ISL29035初始化

  1. 读取设备ID,查看是否链接上
  2. 清除标志位
  3. 确保芯片处于停止模式
  4. 设置分辨率
  5. 设置模式,如单次模式
    读取设备ID使用0x0F指令,可以判断DEVICE ID BITS (B3-B5),之后需要对BROWNOUT STATUS BIT - BOUT (B7)清0。
    在这里插入图片描述

初始化的时候需要确保芯片处于停止模式,需要对0x00指令的OPERATION MODE BITS (B5-B7)写入000。
在这里插入图片描述

设置分辨率可以通过0x01指令,光照强度有4种模式,1k, 4k, 16k和64k,通过FULL SCALE LUX RANGE (B0-B1)进行设置;ADC分辨率也有4种模式,通过ADC RESOLUTION (B3-B2)进行设置。

在这里插入图片描述

设置采样模式,可以通过0x00指令,对OPERATION MODE BITS (B5-B7)写入010。
在这里插入图片描述

int DigitalLightISL29035_init(void) {
    uint8_t reg = 0;
    reg=   DigitalLightISL29035_readRegister( CHIP_ID);//CHIP_ID->0x0f
    //Serial.println(reg, HEX);
    uint8_t chip_id = (reg >> 3) & 0x7;
    if (chip_id != 0x5) {
        return -1;
    }

    //清除BOUT位
    DigitalLightISL29035_writeRegister(CHIP_ID, reg & 0x7f);//CHIP_ID->0x0f

    //确保芯片处于停止模式
    DigitalLightISL29035_writeRegister( COMMAND_I, 0);//COMMAND_I->0x00
    //设置分辨率
    DigitalLightISL29035_writeRegister(COMMAND_II, full_scale_lux_range | (integration_time << 2) );//COMMAND_2->0x01
    //设置为单次模式
    DigitalLightISL29035_writeRegister( COMMAND_I, OPMODE_ALS_ONCE);//COMMAND_I->0x00
    return 0;
}

ISL29035读取光照强度

设置采样模式,可以通过0x00指令,对OPERATION MODE BITS (B5-B7)写入010。
在这里插入图片描述

不同的ADC精度需要等待的时间不同,16位的等待时间最久,需要105ms。
在这里插入图片描述

对于读取数据,可以使用Data Registers (Addresses: 0x02 and 0x03),高位字节通过0x03读取,低位字节通过0x02读取,之后进行组合,就是完整的数据。
在这里插入图片描述

读取到原始数据之后,可以通过下面公式计算光照强度。
在这里插入图片描述

uint32_t DigitalLightISL29035_readIRLux(void) {
    uint16_t data = 0;
    uint8_t l, h;
    //设置为单次模式
    DigitalLightISL29035_writeRegister( COMMAND_I, OPMODE_ALS_ONCE);
    //等待时间
    if(integration_time==0)
    {
        R_BSP_SoftwareDelay(105, BSP_DELAY_UNITS_MILLISECONDS);
    }
    else if(integration_time==1 || integration_time==2)
    {
        R_BSP_SoftwareDelay(7, BSP_DELAY_UNITS_MILLISECONDS);
    }
    else if(integration_time==3)
    {
        R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MILLISECONDS);
    }

    l=DigitalLightISL29035_readRegister(DATA_L);//DATA_L->0x02
    h=DigitalLightISL29035_readRegister(DATA_H);//DATA_H->0x03

    data=(h << 8) | l;

    uint32_t ranges=0;
    if(full_scale_lux_range==0)
        ranges=1000;
    else if(full_scale_lux_range==1)
        ranges=4000;
    else if(full_scale_lux_range==2)
        ranges=16000;
    else if(full_scale_lux_range==3)
        ranges=64000;

    uint32_t adc_count_max=0;
    if(integration_time==0)
        adc_count_max=65536;
    else if(integration_time==1)
        adc_count_max=4096;
    else if(integration_time==2)
        adc_count_max=256;
    else if(integration_time==3)
        adc_count_max=16;
    return ranges * (uint32_t)data /adc_count_max;


}

实现效果

正常显示数据。
在这里插入图片描述

同时可以通过串口打印数据。
在这里插入图片描述

由于设置光照采样为1K,故只能读取到999。
在这里插入图片描述

重新设置光照采样范围为4k,就可以读取0-4K的范围了,具体设置需要考虑使用环境。
在这里插入图片描述

主程序

#include "hal_data.h"
#include <stdio.h>
#include "Digital_Light_ISL29035.h"
#include "oled.h"
#include "bmp.h"

FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER


fsp_err_t err = FSP_SUCCESS;
volatile bool uart_send_complete_flag = false;
/* Callback function */
void user_uart_callback(uart_callback_args_t *p_args)
{
    /* TODO: add your own code here */
    if(p_args->event == UART_EVENT_TX_COMPLETE)
     {
         uart_send_complete_flag = true;
     }
}


#ifdef __GNUC__                                 //串口重定向
    #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
    #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif

PUTCHAR_PROTOTYPE
{
        err = R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1);
        if(FSP_SUCCESS != err) __BKPT();
        while(uart_send_complete_flag == false){}
        uart_send_complete_flag = false;
        return ch;
}

int _write(int fd,char *pBuffer,int size)
{
    for(int i=0;i<size;i++)
    {
        __io_putchar(*pBuffer++);
    }
    return size;
}

/* Callback function */
i2c_master_event_t i2c_event = I2C_MASTER_EVENT_ABORTED;
void sci_i2c_master_callback(i2c_master_callback_args_t *p_args)
{
    i2c_event = I2C_MASTER_EVENT_ABORTED;
    if (NULL != p_args)
    {
        /* capture callback event for validating the i2c transfer event*/
        i2c_event = p_args->event;
    }
}


/* Callback function */
i2c_master_event_t i2c_event1 = I2C_MASTER_EVENT_ABORTED;
void sci_i2c_master_callback0(i2c_master_callback_args_t *p_args)
{
    /* TODO: add your own code here */
    i2c_event1 = I2C_MASTER_EVENT_ABORTED;
    if (NULL != p_args)
    {
        /* capture callback event for validating the i2c transfer event*/
        i2c_event1 = p_args->event;
    }
}


uint32_t  timeout_ms = 100000;
uint32_t  timeout_ms1 = 100000;
uint32_t lux =0;

/*******************************************************************************************************************//**
 * main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used.  This function
 * is called by main() when no RTOS is used.
 **********************************************************************************************************************/
void hal_entry(void)
{
    /* TODO: add your own code here */


    /* Initialize the I2C module */
    err = R_SCI_I2C_Open(&g_i2c3_ctrl, &g_i2c3_cfg);
    /* Handle any errors. This function should be defined by the user. */
    assert(FSP_SUCCESS == err);


    /* Open the transfer instance with initial configuration. */
        fsp_err_t err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
        assert(FSP_SUCCESS == err);

        printf("hello world!\n");
        /* Initialize the I2C module */
        err = R_SCI_I2C_Open(&g_i2c0_ctrl, &g_i2c0_cfg);
        /* Handle any errors. This function should be defined by the user. */
        assert(FSP_SUCCESS == err);


        DigitalLightISL29035_init();
        R_BSP_SoftwareDelay(500U, BSP_DELAY_UNITS_MILLISECONDS);
        lux = DigitalLightISL29035_readIRLux();
        printf("lux=%d\n",lux);

        OLED_Init();            //初始化OLED
        OLED_Clear()    ;
        OLED_ShowCHinese(0,0,0);//记
        OLED_ShowCHinese(16,0,1);//帖
        OLED_ShowString(0,2,"Lux:",16);
        OLED_ShowNum(32,2,lux,3,16);


        /* Wait for minimum time required between transfers. */
        R_BSP_SoftwareDelay(2, BSP_DELAY_UNITS_SECONDS);

        while(1)
        {

            OLED_Clear()    ;
            OLED_ShowCHinese(0,0,0);//记
            OLED_ShowCHinese(16,0,1);//帖
            OLED_ShowString(0,2,"Lux:",16);
            lux = DigitalLightISL29035_readIRLux();
            if(lux<10)
                OLED_ShowNum(32,2,lux,1,16);
            else if(lux>=10&&lux<100)
                OLED_ShowNum(32,2,lux,2,16);
            else if(lux>=100&&lux<1000)
                OLED_ShowNum(32,2,lux,3,16);
            else if(lux>=1000&&lux<10000)
                OLED_ShowNum(32,2,lux,4,16);
            printf("lux=%d\n",lux);
            R_BSP_SoftwareDelay(1000U, BSP_DELAY_UNITS_MILLISECONDS);

        }
#if BSP_TZ_SECURE_BUILD
    /* Enter non-secure code */
    R_BSP_NonSecureEnter();
#endif
}

Digital_Light_ISL29035.h

/*
 * Digital_Light_ISL29035.h
 *
 *  Created on: 2023年2月1日
 *      Author: a8456
 */

#ifndef DIGITAL_LIGHT_ISL29035_H_
#define DIGITAL_LIGHT_ISL29035_H_
#include "stdint.h"


#define ISL29035_I2C_ADDRESS    0x44   //the 7bits i2c address

#define COMMAND_I               0x00
#define COMMAND_II              0x01
#define DATA_L                  0x02
#define DATA_H                  0x03
#define INT_LT_L                0x04
#define INT_LT_H                0x05
#define INT_HT_L                0x06
#define INT_HT_H                0x07
#define CHIP_ID                 0x0f

#define OPMODE_ALS_ONCE         ((0x1)<<5)
#define OPMODE_IR_ONCE          ((0x2)<<5)
#define OPMODE_ALS_CONTI        ((0x5)<<5)
#define OPMODE_IR_CONTI         ((0x6)<<5)

#define FULL_SCALE_LUX_RANGE0   1000
#define FULL_SCALE_LUX_RANGE1   4000
#define FULL_SCALE_LUX_RANGE2   16000
#define FULL_SCALE_LUX_RANGE3   64000
#define DEFAULT_LUX_RANGE_INDEX 1       //should be [0,3]

#define INTEGRATION_TIME3       0.0256  //ms, this also configure the ADC to 4bits
#define INTEGRATION_TIME2       0.41  //ms, this also configure the ADC to 8bits
#define INTEGRATION_TIME1       6.5  //ms, this also configure the ADC to 12bits
#define INTEGRATION_TIME0       105  //ms, this also configure the ADC to 16bits
#define DEFAULT_INTEGRATION_TIME_INDEX 1  //should be [0,3]

uint8_t DigitalLightISL29035_readRegister(uint8_t reg_address);
void DigitalLightISL29035_writeRegister( int reg_address, uint8_t val) ;
int DigitalLightISL29035_init(void) ;
uint32_t DigitalLightISL29035_readIRLux(void);

#endif /* DIGITAL_LIGHT_ISL29035_H_ */

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/344589.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习】第二章-模型评估与选择-西瓜书笔记

文章目录为什么要进行模型评估&#xff1f;- 选择模型与参数在何种数据集上对训练误差进行评估&#xff1f;- 训练集在何种数据集上对泛化误差进行评估&#xff1f;- 测试集如何划分测试集&#xff1f;1 留出法2 交叉验证法3 自助法模型选择和调参的区别&#xff1f;如何模型选…

Pytest学习笔记

Pytest学习笔记 1、介绍 1.1、单元测试 单元测试是指在软件开发当中&#xff0c;针对软件的最小单位&#xff08;函数&#xff0c;方法&#xff09;进行正确性的检查测试 1.2、单元测试框架 测试发现&#xff1a;从多个py文件里面去找到我们测试用例测试执行&#xff1a;按…

WebDAV之葫芦儿·派盘+网盘精灵

网盘精灵 支持WebDAV方式连接葫芦儿派盘。 推荐一款让您的iPhone、iPod、iPad 变成WebDav客户端的软件,支持从WebDav服务器连接葫芦儿派盘服务进行上传和下载件。 网盘精灵让您的iPhone、iPod、iPad 变成WebDav客户端。功能:WebDav操作、文件共享、本地文件管理

jstack排查cpu占用高[复习]

这样就可以看到占用CPU高的代码位置。 总结&#xff1a;就是先查到占用高的应用和具体的线程&#xff0c;然后根据线程到堆积信息查找即可。 不过堆栈信息非十进制&#xff0c;需提前把线程号转为十六进制。 这样就可以看到占用CPU高的代码位置。 总结&#xff1a;就是先查到…

JavaScript------面向对象

目录 一、面向对象编程&#xff08;OOP&#xff09; 基本概念 二、类 1、语法 2、通过类创建对象 3、类的属性 4、类的方法 5、构造函数 三、面向对象的三个特点 1、封装 如何确保数据的安全&#xff08;实现封装的方式&#xff09;&#xff1a; 2、继承 在子类中&a…

【LeetCode】每日一题(4)

目录 题目&#xff1a;1124. 表现良好的最长时间段 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 写在最后&#xff1a; 题目&#xff1a;1124. 表现良好的最长时间…

算法思想 - 回溯算法

Backtracking(回溯)属于 DFS, 本文主要介绍算法中Backtracking算法的思想。回溯算法实际上一个类似枚举的搜索尝试过程&#xff0c;主要是在搜索尝试过程中寻找问题的解&#xff0c;当发现已不满足求解条件时&#xff0c;就“回溯”返回&#xff0c;尝试别的路径。回溯法是一种…

ChatGPT 类 AI 软件供应链的安全及合规风险

AIGC将成为重要的软件供应链近日&#xff0c;OpenAI推出的ChatGPT通过强大的AIGC&#xff08;人工智能生产内容&#xff09;能力让不少人认为AI的颠覆性拐点即将到来&#xff0c;基于AI将带来全新的软件产品体验&#xff0c;而AI也将会成为未来软件供应链中非常重要的一环。在O…

【项目精选】基于WEB的仓库管理系统的设计与实现(论文+视频+源码)

点击下载源码 仓库物品的管理是与我们的日常生活息息相关的一个重大问题。随着我国经济飞速的发展&#xff0c;改革开放的不断深入&#xff0c;企业要想在激烈的市场竞争中立于不败之地&#xff0c;要想继续的发展与生存&#xff0c;没有现代化的管理方式与方法是万万不行的&am…

torch.nn.parameter 生成可更新的 tensor (requires_grad = True)

torch.nn.parameter 是 PyTorch 中的一种特殊类型的 tensor&#xff0c;它主要用于存储神经网络中的参数。这些参数可以被自动求导和被优化器自动更新。使用 torch.nn.Parameter 定义的tensor 会被自动添加到模型的参数列表中。 \quadtorch.nn.Parameter 是继承自 torch.Tensor…

vite+vue3搭建的工程热更新失效问题

前段时间开发新的项目&#xff0c;由于没有技术上的限制&#xff0c;所以选择了vitevue3ts来开发新的项目&#xff0c;一开始用vite来开发新项目过程挺顺利&#xff0c;确实比vue2webpack的项目高效些&#xff08;为什么选择vite&#xff09;,但是过了一段时间后&#xff0c;不…

android组件化

学习流程&#xff1a;1.开源最佳实践&#xff1a;Android平台页面路由框架ARouter-阿里云开发者社区 (aliyun.com)2.中文ARouter使用API&#xff1a;https://github.com/alibaba/ARouter/blob/master/README_CN.md3.看当前文档后面的代码4.这是通俗易懂的文章&#xff1a;https…

使用 Nodejs、Express、Postgres、Docker 在 JavaScript 中构建 CRUD Rest API

让我们在 JavaScript 中创建一个 CRUD rest API&#xff0c;使用&#xff1a;节点.js表达续集Postgres码头工人码头工人组成介绍这是我们将要创建的应用程序架构的架构&#xff1a;我们将为基本的 CRUD 操作创建 5 个端点&#xff1a;创造阅读全部读一个更新删除我们将使用以下…

【H.264】码流解析 annexb vs avcc

H264码流解析及NALUAVCC和ANNEXB 前者是FLV容器、mp4 常用的。后者 是实时传输使用,所以是TS 一类的标准。VLC显示AVC1就是AVCC AVCC格式 也叫AVC1格式,MPEG-4格式,字节对齐,因此也叫Byte-Stream Format。用于mp4/flv/mkv, VideoToolbox。 – Annex-B格式 也叫MPEG-2 trans…

微信公众号扫码授权登录思路

引言 上学期研究了一下微信登录相关内容&#xff0c;也写了两三篇笔记&#xff0c;但是最后实际登录流程没有写&#xff0c;主要因为感觉功能完成有所欠缺&#xff0c;一直也没有好的思路&#xff1b;这两天我又看了看官方文档&#xff0c;重新构思了一下微信公众号登录相关的…

操作系统综合实验

实验目的 加深对进程概念理解&#xff0c;进一步认识进程并发执行掌握Linux系统的进程创建和终止操作掌握文件系统调用及文件标准子例程的编程方法掌握Linux下终端图形编程方法&#xff0c;能编写基于文本的图形界面掌握proc文件系统的使用 相关知识 Linux C编程中的头文件 …

知识点整合

⭐面试 自我介绍&#xff08;优势岗位匹配度&#xff09; 为什么来我们公司&#xff08;对公司的了解&#xff09; 讲讲做的项目&#xff08;为什么这么做&#xff0c;思路和贡献&#xff09; 跨部门涉案的业务流程 我们跨部门涉案业务主要是本系统、配合物流系统和罚没系…

二战字节跳动成功上岸,准备了小半年,拿27k也算不上很高吧~

先说下我基本情况&#xff0c;本科不是计算机专业&#xff0c;现在是学通信&#xff0c;然后做图像处理&#xff0c;可能面试官看我不是科班出身没有问太多计算机相关的问题&#xff0c;因为第一次找工作&#xff0c;字节的游戏专场又是最早开始的&#xff0c;就投递了&#xf…

SpringMVC传值

实现步骤 先看后台代码如何获取前端传过来的数据&#xff0c;直接在方法的参数列表中添加RequestParam(xxx)&#xff0c;再在后面加上参数列表即可 不过这样的方式会出现一个问题&#xff1a;当前端页面没有提交相应的数据过来的时候&#xff0c;后台会出现异常&#xff0c;所…

Elasticsearch7.8.0版本进阶——数据读流程

目录一、数据读流程概述二、数据读流程步骤2.1、数据读流程图2.2、数据读流程步骤&#xff08;从主分片或者副本分片检索文档的步骤顺序&#xff09;2.3、数据读流程注意事项一、数据读流程概述 从主分片或者从其它任意副本分片检索文档。 二、数据读流程步骤 2.1、数据读流…