EEPROM读写案例(以AT24C02为例)

news2024/11/26 20:41:46

        本篇文章主要是在学习单片机串行接口时的学习经历,主要侧重于驱动程序的讲解。下文将通过ESP32S3、STM32两款MCU进行编写驱动案例。

1、AT24C02简要说明

        AT24C02是美国微芯科技公司生产的电擦写式只读存储器系列中的一款,其容量为2K位(即256字节)。每一个器件都支持双向、2线数据传输协议;兼容100KHZ(1.7V)和400KHZ(≥2.5V)两种传输速率;擦写次数可达100万次,数据保存时间超过200年等特征。

图1、引脚功能

 1.1 A0、A1、A2芯片地址输入引脚

        在对不同的片选位进行组合之后,连接到同一条总线上的器件最多可达八个(对于MSOP型封装24 xx128和24 xx256器件,最多为两个)。
        大部分应用中,片选地址输入引脚A0, A1和A2直接连到逻辑0或逻辑1,对于这些引脚由单片机或其他的可编程器件控制的应用,片选地址输入引脚必须在器件能够继续正常工作之前驱动为逻辑0或逻辑1。

图2、控制字节

        如图2所示,当 这三个地址引脚的电平确定时,对于读写芯片时的控制字节也就确定了。总所周知,IIC是通过设备地址选择芯片的,这三个地址可组成8个不同的设备地址,可供8个器件使用。

1、2 串行通信引脚

        串行数据引脚为双向引脚,用于把地址和数据输入/输出器件。该引脚为漏极开路。因此,SDA 总线要求在该引脚与Vcc 之间接入上拉电阻(通常频率为100 kHz时该电阻阻值为10 kΩ,频率为400 kHz和1 MHz时,阻值为2 kΩ)。对于正常的数据传输,只允许在 SCL 为低电平期间改变SDA 电平。而 SDA 电平在 SCL 高电平期间若发生变化,表明起始和停止条件产生。

        SCL引脚用于数据传输同步。

1、3 写保护引脚

        该引脚必须连接到Vss或者Vcc。如果连接到Vss,写操作使能。如果连接到Vcc,写操作被禁止,但读操作不受影响。

1、4 总线特性

总线空闲:数据线和时钟写同时为高电平;

起始信号:时钟线电平为高电平时,数据线电平由高电平转换为低电平;

停止信号:时钟线电平为高电平时,数据线电平由低电平转换为高电平;

数据有效:数据线的状态表明数据何时有效。在起始条件之后,数据线在时钟处于高电平期间保持稳定,必须在时钟信号为低电平期间改变数据线。一个数据位对应一个时钟脉冲。数据的每次传输以起始条件开始,以停止条件结束。在起始条件和停止条件之间传输的数据字节数目由主器件决定。

1、5 确认信号

        每一个被寻址的接收器在接收到每一字节数据后,应发每个确认位。主器件必须提供一个额外的时钟以传输确认位。写周期期间,24XX不会发出确认信号。

        在确认时钟脉冲内,器件确认须拉低 SDA线。在确认时钟的高电平期间,SDA线以这种方式保持稳定的低电还必须考虑建立时间和保持时间。读操作期当然,主器件必须发送·个结束信导给从器件,而不是在火器件输出最后个数据字节之后声生一个确认府i文种情况下,从器件(24XX)将释放数据线为高电平,从而使主器件能够产生停止条件。

图3、确认时许

2、读写操作

 2.1 写操作

图4、字节写操作

        如图4,AT24C02为2K位器件,在写字节时只需按照该步骤先后发送起始信号、控制字节(1010 0000),随后是要写入的地址(AT24C02其实地址可从0开始以255结尾共256字节)、 要写入的一个字节数据、最后发送停止信号。确认位SDA都为低电平。

图5、页写操作

        在读写EEPROM时,可以直接用字节写操作对没一个合法地址进行写数据,当然,也可以用页写操作,一次信写一页数据。(页写?一页有多大,可以查看数据手册,也可以通过测试得出,我这里测试一页为8字节)

        页写操作和字节写操作相似,只是在发送数据时连着发n个数据,器件每接收到一个字节数据内部地址计数器会自动加1。当数据超过了一页的数据,地址会翻转到页起始地址,之前写入的数据会被覆盖(例如第一页从0~7,当从地址0开始写入9个数据,那么最开始写入地址0的数据将被最后一个数据覆盖)。 

2、2 读操作

图6、读字节操作

       

图7、连续读操作

         对于读字节操作和连续读操作也是相似,这里只说128位至16K器件。起始信号、控制字节(第一个是写:1010 0000)、地址字节、起始信号、数据字节/n个数据字节(读字节操作和连续读操作的不同点)、停止信号。这里需要注意,停止信号前一位是不确认(高电平),其余的都是确认。连续读没有页读之说,可以一次性读取所有数据。

3、读写案例一(ESP32篇)

3、1 硬件连接

3、2 程序编写

        开发环境使用的是Vscode的IDF插件。

注:

#define IIC0_SDA_GPIO_PIN   GPIO_NUM_41  //IIC_SDA

#define IIC0_SCL_GPIO_PIN   GPIO_NUM_42

#define IIC0_CLK_SPEED      400000      //IIC速率

#define AT24C02_WRITE       0xA0        //写数据控制字节

#define AT24C02_READ        0xA1        //读数据控制字节

#define AT24C02_ACK_EN      0x01

#define AT24C02_ACK_DIS     0x00

3.2.1 AT24C02初始化

AT24C02初始化函数:这里只用到了两个库函数

//1.初始化IIC参数

esp_err_t i2c_param_config(i2c_port_t i2c_num, const i2c_config_t *i2c_conf);

i2c_num:IIC接口,I2C_NUM_0、I2C_NUM_1

i2c_conf:IIC配置结构体

i2c_confjie结构体就不细说了,主要是选择IIC模式,选择IIC引脚(这里SDA为IO_41,SCL为IO_42),SDA和SCL在硬件连接上使用了上拉电阻这里就可不用上拉,随后便是IIC速率400KHZ。

esp_err:返回值,成功返回1

//2.安装IIC驱动

esp_err_t i2c_driver_install(i2c_port_t i2c_num, i2c_mode_t mode, size_t slv_rx_buf_len, size_t slv_tx_buf_len, int intr_alloc_flags);

i2c_num:IIC接口,I2C_NUM_0、I2C_NUM_1

mode:IIC模式选择,主/从,这里选择主模式,后三个参数可以直接写入0。

esp_err:返回值,成功返回1

void AT24C02_Init(void)
{
    //配置IIC总线
    esp_err_t esp_iic_ret;
    i2c_config_t bsp_iicInit={0};
    bsp_iicInit.mode = I2C_MODE_MASTER;//IIC主模式
    bsp_iicInit.sda_io_num = IIC0_SDA_GPIO_PIN;//选择引脚
    bsp_iicInit.scl_io_num = IIC0_SCL_GPIO_PIN;
    bsp_iicInit.sda_pullup_en = GPIO_PULLUP_DISABLE;
    bsp_iicInit.scl_pullup_en = GPIO_PULLUP_DISABLE;
    bsp_iicInit.master.clk_speed = IIC0_CLK_SPEED;
    esp_iic_ret=i2c_param_config(I2C_NUM_0,&bsp_iicInit);
    if(esp_iic_ret!=ESP_OK)
    {
        printf("IIC_NUM_0参数配置失败\n");
    }
    //安装IIC驱动
    esp_iic_ret = i2c_driver_install(I2C_NUM_0,I2C_MODE_MASTER,0,0,0);
    if(esp_iic_ret!=ESP_OK)
    {
        printf("IIC_NUM_0驱动安装失败\n");
    }
    else
    {
        printf("IIC_NUM_0驱动安装成功\n");
    }
}

        如此,便完成了对IIC的初始化配置。对于ESP32S3的IIC引脚,技术手册中显示可选任意IO。

3.2.2 读字节函数

//1.创建IIC命令链路,在使用IIC前必须创建链路并获取其句柄。

i2c_cmd_handle_t i2c_cmd_link_create(void);

i2c_cmd_handle_t:创建成功返回链路的句柄,内存不足返回NULL,以下函数需要使用该句柄

//2.发送起始信号,使用创建的链路句柄

esp_err_t i2c_master_start(i2c_cmd_handle_t cmd_handle);

//3.发送控制字节0xA0( 1010 0000 ),确认位0

//4.发生EEPROM地址,确认位0

esp_err_t i2c_master_write_byte(i2c_cmd_handle_t cmd_handle, uint8_t data, bool ack_en);

//5.发送起始信号

//6.发送控制字节,这里需要读数据了,所以是0xA1,确认位0

/7.读取字节数据,确认位1

esp_err_t i2c_master_read_byte(i2c_cmd_handle_t cmd_handle, uint8_t *data, i2c_ack_type_t ack);

data:保存读取到的数据。

//8.发送停止信号

esp_err_t i2c_master_stop(i2c_cmd_handle_t cmd_handle);

//9.等待所有命令发送完成,最后删除句柄

esp_err_t i2c_master_cmd_begin(i2c_port_t i2c_num, i2c_cmd_handle_t cmd_handle, TickType_t ticks_to_wait);

i2c_num:IIC接口。

i2c_cmd_handle_t:链路句柄。

ticks_to_wait:阻塞时间。

void i2c_cmd_link_delete(i2c_cmd_handle_t cmd_handle);//删除句柄

/**
 * @brief       AT24C02随机读取一个字节函数
 * @param       addr:内存地址0~255(256bety)
 * @retval      读取到的数据
 */
uint8_t AT24C02_random_readByte(uint8_t addr)
{
    i2c_cmd_handle_t at24c02_i2c_handle;
    uint8_t rx_dat=0;
    //1.创建连接
    at24c02_i2c_handle = i2c_cmd_link_create();
    if(at24c02_i2c_handle == NULL)
    {
        printf("at24c02 IIC命令连接创建失败!\n");
    }
    //2.发送起始位
    i2c_master_start(at24c02_i2c_handle);
    //3.发送控制字节
    i2c_master_write_byte(at24c02_i2c_handle,AT24C02_WRITE,AT24C02_ACK_DIS);
    //4.发送地址字节
    i2c_master_write_byte(at24c02_i2c_handle,addr,AT24C02_ACK_DIS);
    //5.发送起始地址
    i2c_master_start(at24c02_i2c_handle);
    //6.发送控制字节
    i2c_master_write_byte(at24c02_i2c_handle,AT24C02_READ,AT24C02_ACK_DIS);
    //7.读取数据
    i2c_master_read_byte(at24c02_i2c_handle,&rx_dat,AT24C02_ACK_EN);
    //8.发送停止信号
    i2c_master_stop(at24c02_i2c_handle);
    //9.删除连接
    i2c_master_cmd_begin(I2C_NUM_0,at24c02_i2c_handle,1000);
    i2c_cmd_link_delete(at24c02_i2c_handle);
    return rx_dat;
}

        读字节操作这里值得注意的是确认信号(i2c_ack_type_t),在写操作时也注意,只要填写不对可能读写就会出现问题,但是按照数据手册流程来就不会出现啥问题。

3.2.3 连续读

方法一、需要读取多少字节数据就直接调用多少次读字节函数。

方法二、在读取第一个数据后再读取多个数据,注意最后一个数据需要不确认信号。

#if 0
void AT24C02_ContinuousRead_Data(uint8_t addr,uint8_t *data,uint16_t len)
{
    uint8_t *pdata = data;
    while(len--)
    {
        *pdata = AT24C02_random_readByte(addr++);
        pdata++;
    }
}
#else
void AT24C02_ContinuousRead_Data(uint8_t addr,uint8_t *data,uint16_t len)
{
    i2c_cmd_handle_t at24c02_i2c_handle;
    uint8_t *pdata = data;
    //1.创建连接
    at24c02_i2c_handle = i2c_cmd_link_create();
    if(at24c02_i2c_handle == NULL)
    {
        printf("at24c02 IIC命令连接创建失败!\n");
    }
    //2.发送起始位
    i2c_master_start(at24c02_i2c_handle);
    //3.发送控制字节
    i2c_master_write_byte(at24c02_i2c_handle,AT24C02_WRITE,AT24C02_ACK_DIS);
    //4.发送地址字节
    i2c_master_write_byte(at24c02_i2c_handle,addr,AT24C02_ACK_DIS);
    //5.发送起始位
    i2c_master_start(at24c02_i2c_handle);
    //6.发送控制字节
    i2c_master_write_byte(at24c02_i2c_handle,AT24C02_READ,AT24C02_ACK_DIS);
    //7.读取数据
    while(len--)
    {
        if(len)
        {
            i2c_master_read_byte(at24c02_i2c_handle,pdata,AT24C02_ACK_DIS);
        }
        else
        {
            i2c_master_read_byte(at24c02_i2c_handle,pdata,AT24C02_ACK_EN);
        }
        pdata ++;
    }
    //8.发送停止信号
    i2c_master_stop(at24c02_i2c_handle);
    //9.删除连接
    i2c_master_cmd_begin(I2C_NUM_0,at24c02_i2c_handle,1000);
    i2c_cmd_link_delete(at24c02_i2c_handle);
}
#endif

3.2.4 写字节 

        与读字节相似,只不过在发送完地址后,直接开始写字节数据。不确认信号1

void AT24C02_writeByte(uint8_t addr,uint8_t byte)
{
    //1.创建连接
    i2c_cmd_handle_t at24c02_i2c_handle;
    at24c02_i2c_handle = i2c_cmd_link_create();//
    if(at24c02_i2c_handle == NULL)
    {
        printf("at24c02 IIC命令连接创建失败!\n");
    }
    //2.发送起始位
    i2c_master_start(at24c02_i2c_handle);
    //3.发送控制字节
    i2c_master_write_byte(at24c02_i2c_handle,AT24C02_WRITE,AT24C02_ACK_DIS);
    //4.发送地址字节
    i2c_master_write_byte(at24c02_i2c_handle,addr%256,AT24C02_ACK_DIS);
    //5.发送数据
    i2c_master_write_byte(at24c02_i2c_handle,byte,AT24C02_ACK_DIS);
    //6.发送停止信号
    i2c_master_stop(at24c02_i2c_handle);
    //7.删除连接
    i2c_master_cmd_begin(I2C_NUM_0,at24c02_i2c_handle,1000);
    i2c_cmd_link_delete(at24c02_i2c_handle);
    vTaskDelay(5);
}

最后需要延时一段时间,可自己调节时间长短,如果不延时就读取数据会出现问题。

3.2.5 页写

ESP32这里提供了一个连续写函数,只需要写入句柄,数据缓冲区,数据长度以及确认信号。

esp_err_t i2c_master_write(i2c_cmd_handle_t cmd_handle, const uint8_t *data, size_t data_len, bool ack_en);

这里的确认信号都是0。也可使用另一个函数一个个写。

void AT24C02_PageWrite_Data(uint8_t addr,uint8_t *data,uint16_t len)
{
    uint16_t w_len = len;
    uint8_t *pdata = data;
    //1.创建连接
    i2c_cmd_handle_t at24c02_i2c_handle;
    at24c02_i2c_handle = i2c_cmd_link_create();
    if(at24c02_i2c_handle == NULL)
    {
        printf("at24c02 IIC命令连接创建失败!\n");
    }
    //2.发送起始位
    i2c_master_start(at24c02_i2c_handle);
    //3.发送控制字节
    i2c_master_write_byte(at24c02_i2c_handle,AT24C02_WRITE,AT24C02_ACK_EN);
    //4.发送地址字节
    i2c_master_write_byte(at24c02_i2c_handle,addr%256,AT24C02_ACK_DIS);
    //5.发送数据
    i2c_master_write(at24c02_i2c_handle,pdata,w_len,AT24C02_ACK_DIS);
    //6.发送停止信号
    i2c_master_stop(at24c02_i2c_handle);
    //7.删除连接
    i2c_master_cmd_begin(I2C_NUM_0,at24c02_i2c_handle,1000);
    i2c_cmd_link_delete(at24c02_i2c_handle);
    vTaskDelay(10);
}

3.2.6 跨页写

方法一、调用多次写字节函数写入多个字节数据。

方法二、调用页写函数,分页写入数据。

#if 0
void AT24C02_WriteData(uint8_t addr,uint8_t *data,uint16_t len)
{
    uint8_t *pdata = data;
    while(len--)
    {
        AT24C02_writeByte(addr,*pdata);
        pdata ++;
        addr ++;
    }
}
#else
void AT24C02_WriteData(uint8_t addr,uint8_t *data,uint16_t len)
{
    uint8_t page_addr = addr;//保存要写入的页地址
    uint8_t page_offset;
    uint8_t *pdata = data;
    page_offset = 8 - addr%8;//当前页剩余字节数

    if(page_offset > len)
    {
        page_offset = len;//当前页可以写下要写入的数据
    }
    while(1)
    {
        AT24C02_PageWrite_Data(page_addr,pdata,page_offset);
        if(page_offset == len)
        {
            break;
        }
        len -= page_offset;//剩余数据长度
        page_addr += page_offset;//地址偏移至下一页起始地址
        pdata += page_offset;//数据地址偏移
        if(page_addr <= 255)
        {
            if(len > 8)
            {
                page_offset = 8;
            }
            else
            {
                page_offset = len;
            }
        }
        else
        {
            break;
        }
    }
}
#endif

在不知道页具体大小时,可使用页写函数写入数据,遇到数据覆盖便可知道页大小。

3.2.7读写实验

        刚开始写的时候建议使用读写字节的两个函数对一个地址进行读写,最终再实现连续读、跨页写函数,这里直接演示读写256字节。

        定义两个大小为256字节大小的数组,给tx_dat数组分别赋值0~255,随后将这256个数据从EEPROM的地址0开始写入,再调用连续读函数从地址0开始读取256字节数据并打印。输出结果如图8所示,打印数据与写入数据相同。


void app_main(void)
{
    esp_err_t ret;
    
    ret = nvs_flash_init(); /* 初始化NVS */

    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
    {
        ESP_ERROR_CHECK(nvs_flash_erase());
        ret = nvs_flash_init();
    }
    
    led_init();             /* 初始化LED */
    KEY_Init();             /* 初始化KEY_BOOT*/
    AT24C02_Init();
    printf("AT24C02测试开始!\n");
    uint8_t tx_dat[256]={0};
    uint8_t rx_dat[256]={0};
    for(uint16_t i=0;i<=255;i++)
    {
        tx_dat[i]=i;
    }
    AT24C02_WriteData(0,tx_dat,256);//跨页写256字节数据
    AT24C02_ContinuousRead_Data(0,rx_dat,256);//连续读取256字节数据
    for(uint16_t i=0;i<=255;i++)
    {
        printf("读取到的eeprom数据%d:%d\n",i,rx_dat[i]);
    }
    while(1)
    {
        if(KEY_get_val())
        {
           LED_TOGGLE();
           printf("按键boot按下!\n"); 
        }
        vTaskDelay(100);
    }
}

 输出演示:

图8、输出演示

3.2.8 页大小实验

         器件选择表中已经给出了器件的页大小,当然再不确定芯片型号的情况下也可以进行实验。

图9、器件选择表

                 如图10所示,在实验前,可调用跨页写函数将EEPROM清零,然后再进行测试,这里定义10个数据保存在数组tx_dat中,调用页写函数将数据写入EEPROM,再用连续读函数读取数据。可见从地址0~9这10个地址中都读取到了数据,地址8、9中的数据为0,且地址0、1的数据被18、19覆盖了。

图10、页大小测试实验1

        如图11,在地址0页写入8个数据,在连续读取10个数据,可见地址0~7这8个地址的数据和预期写入的数据相同。由此可见页大小为8字节,第一页为0~7,依次类推,便可由此编写跨页写函数。 

图11、页大小测试实验2

4、读写案例二(STM32篇)

暂略

5、资料

链接:https://pan.baidu.com/s/1W0P_VgRDLnq7g2Oy_dNmOA?pwd=1234 icon-default.png?t=N7T8http://ESP32S3读写AT24C02

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

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

相关文章

ios包上架系列 四、虚拟机涉及网站

一、网站相关 苹果开发者平台 https://developer.apple.com/ 谷歌邮箱 https://mail.google.com/mail/u/0/#inbox 微云在线或者安装QQ https://www.weiyun.com/disk 下载下的为zip文件&#xff0c;需要复制里面的内容出来使用 二、环境配置 1、ios-upload 配置&#x…

LeetCode 最长重复子串的更换问题

LeetCode 最长重复子串的更换问题 在处理字符串问题时&#xff0c;我们经常会遇到一些具有挑战性的问题&#xff0c;比如今天的这个问题&#xff1a;给定一个字符串 s 和一个整数 k&#xff0c;我们的任务是找到可以通过最多更换 k 个字符来形成的最长重复子串的长度。 我的解…

【HDFS存储】Java语言实现

Hadoop生态系统中包含多种与其相关联的技术应用&#xff0c;主要包括但不限于HDFS HDFS&#xff08;Hadoop Distributed File System&#xff09;&#xff1a;作为一个高度可靠、高吞吐量的分布式文件系统&#xff0c;它是Hadoop核心技术之一&#xff0c;用于存储海量数据。 J…

如何停止 Win11 自动更新?如何彻底关闭 Windows 更新呢?

如何停止 Win11 自动更新&#xff1f;如何彻底关闭 Windows 更新呢&#xff1f; 段子手168 我们在使用电脑时&#xff0c;有时并不需要 windows 频繁更新系统&#xff0c; 这样可能会使你的 C 盘突然爆满或者系统启动缓慢&#xff0c; 那么如何彻底关闭 Windows 更新呢&#…

第24次修改了可删除可持久保存的前端html备忘录:文本编辑框不再隐藏,又增加了哔哩哔哩搜索和必应搜索

第24次修改了可删除可持久保存的前端html备忘录:文本编辑框不再隐藏&#xff0c;又增加了哔哩哔哩搜索和必应搜索. <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"…

ETL工具-nifi干货系列 第九讲 处理器EvaluateJsonPath,根据JsonPath提取字段

1、其实这一节课本来按照计划一起学习RouteOnAttribute处理器&#xff08;相当于java中的ifelse&#xff0c;switch case 控制语句&#xff09;&#xff0c;但是在学习的过程中遇到了一些问题。RouteOnAttribute 需要依赖处理器EvaluateJsonPath&#xff0c;所以本节课我们一起…

ESP8266开发

1esp8266Wifi连接,通过手机控制点灯 1.下载Arduino,编程 2.下载blinker手机APP。 3.下载blinker库。https://arduino.me/s/blinker-arduino?aid=711 4.打开编程工具 Arduino,加载blinker库 5. 打开库里面的例程,基于例程开发。 blinker-library-0.3.10230510\blinker-…

JavaSE——常用API进阶二(2/8)-BigDecimal(BigDecimal的常见构造器、常用方法,用法示例,使用规范)

目录 BigDecimal BigDecimal的常见构造器、常用方法 用法示例 使用规范 在进行浮点型运算时&#xff0c;直接使用“ - * / ”可能会出现运算结果失真&#xff0c;例如&#xff1a; System.out.println(0.1 0.2); System.out.println(1.0 - 0.32); System.out.println(1.…

【Ubuntu】 Github Readme导入GIF

1.工具安装 我们使用 ffmpeg 软件来完成转换工作1.1 安装命令 sudo add-apt-repository ppa:jonathonf/ffmpeg-3sudo apt-get updatesudo apt-get install ffmpeg1.2 转换命令 &#xff08;1&#xff09;直接转换命令&#xff1a; ffmpeg -i out.mp4 out.gif(2) 带参数命令&…

哨兵-1A与DInSAR技术监测尼泊尔地震前后地表形变

2015年4月25号&#xff0c;尼泊尔发生里氏7.8级地震&#xff0c;超过5000人伤亡和几百万人受到影响。大量的卫星影像支持地震救援。地理学家利用卫星影像量测地震对陆地的影响。 Sentinel-1A是欧洲委员会发起的哥白尼环境监测计划中的第一颗卫星。可获取全天候的数据&#xff0…

大模型+交通治理,高德地图“评诊治”系统迎来全新升级

近日&#xff0c;由中国道路交通安全协会主办的第十四届中国国际道路交通安全产品博览会暨公安交警警用装备展(以下简称交博会)在厦门国际会展中心开幕&#xff0c;会上高德地图发布了全新升级的城市交通“评诊治”智能决策SaaS系统&#xff0c;以助力城市交通的可持续、精细化…

水利自动化控制系统平台介绍

水利自动化控制系统平台介绍 在当今社会&#xff0c;水资源的管理和保护日益成为全球关注的重要议题。随着科技的进步和信息化的发展&#xff0c;水利监测系统作为一种集成了现代信息技术、自动化控制技术以及环境监测技术的综合性平台&#xff0c;正在逐步改变传统的水利管理模…

Oracle 常用命令总结

文章目录 一、数据库启动 & 关闭&查看1、启动数据库2、关闭数据库3、连接数据库4、查看数据库名5、查看实例 二、用户1、创建用户2、重置密码3、账户解锁4、账号赋权5、账户撤销权限6、删除用户7、查询所有用户&#xff08;DBA账号执行&#xff09;8、查看当前用户连接…

卫星影像联合无人机实现农业保险全生命周期监管监测

随着科技的进步&#xff0c;农业保险监管系统的发展日新月异。特别是近年来&#xff0c;随着卫星技术与无人机技术的结合&#xff0c;为农业保险监管系统带来了前所未有的革新。本文将深入探讨如何利用卫星与无人机方案构建高效的农业保险监管系统&#xff0c;并结合实例进行说…

面试经典算法系列之二叉树3 -- 二叉树的层序遍历

面试经典算法18 - 二叉树的层序遍历 LeetCode.102 公众号&#xff1a;阿Q技术站 问题描述 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;roo…

虚拟机中,IP地址查询失败怎么办

有时候ifconfig查出来的地址是下面这样&#xff0c;只有ipv6 只需要运行下面这两条命令&#xff0c;再次查询即可成功&#xff01; systemctl stop NetworkManagersystemctl start network.service

Python如何安装第三方模块

cmd窗口中使用pip install命令安装 1、键盘按下win R&#xff0c;然后在输入框中输入cmd&#xff0c;回车&#xff0c;就打开了cmd窗口。 下图的运行框会出现到屏幕左下角。 2、输入下面的命令&#xff0c;回车即可。 pip install xxx # xxx为要安装的模块名 如图所示&…

RabbitMQ消息模型之Simple消息模型

simple消息模型 生产者 package com.example.demo02.mq.simple;import com.example.demo02.mq.util.ConnectionUtils; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection;import java.io.IOException;/*** author Allen* 4/10/2024 8:07 PM* versi…

【论文阅读笔记】Head-Free Lightweight Semantic Segmentation with Linear Transformer

莫名地这篇论文我特别难理解&#xff0c;配合代码也食用不了 1.论文介绍 Head-Free Lightweight Semantic Segmentation with Linear Transformer 基于线性Transformer的无头轻量级语义分割 2023年 AAAI Paper Code 2.摘要 现有的语义分割工作主要集中在设计有效的解码器&am…

MATLAB GUI图形化界面设计计算器

MATLAB GUI界面设计教程可以帮助用户创建交互式的图形用户界面&#xff0c;以简化与MATLAB程序的交互过程。以下是一个简化的教程&#xff0c;指导你如何进行MATLAB GUI界面设计&#xff1a; 1. 启动GUIDE或App Designer GUIDE&#xff1a;在MATLAB命令窗口中输入guide命令&a…