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

模拟IIC通讯协议(stm32)(硬件iic后面在补)

一、IIC基础知识总结。

        1、IIC通讯需要两条线就可以,SCL、SDA。

        2、IIC的数据传输的速率,不同的ic是不同的,根据电平维持的延时函数的时间来确定IIC数据传输的速率.

        3、IIC的延时函数可以使用延时函数,延时函数一般使用系统滴答时钟产生延时,也是在Sysclk频率总线的基础上产生的延时。这个延时和“__NOP();”指令产生的延时是一样的,“__NOP();”也是依靠Sysclk频率产生延时。使用场景:“__NOP();”指令是一个汇编指令的运行产生延时,是占用cpu的,短时间且精确的延时是可以使用的;较长时间的精准的延时还是需要使用系统滴答时钟的定时器实现延时的。

        4、标准的IIC传输节拍信号是由7种的:起始信号、停止信号、产生ACK应答信号、产生NACK应答信号、等待ACK应答信号、接收1byte字节信号、发送1byte字节信号。

        5、在标准IIC信号中分为两种形式:边沿信号,上升沿或者下降沿(起始信号、停止信号)。电平信号,高电平或者低电平(产生ACK应答信号、产生NACK应答信号、等待ACK应答信号、接收1byte字节信号、发送1byte字节信号)。

        6、上面的两类信号,也就是7种信号中,SDA的信号必须在SCL为高电平的时候有效。

        7、在上面的7种基础信号的基础上,根据不同的芯片封装不同的数据发送和接收的函数,下面将简单介绍一般的数据发送和接收协议形式,大部分ic芯片都是相同的。

        ic数据的发送:

        (1)发送起始位。

        (2)发送写控制字节,写控制字节的最后一位表示“写”,其他的位表示IC的id。

        (3)等待IC的ACK回应。

        (4)发送地址字节。

        (5)等待IC的ACK回应。

        (6)发送写入的数据字节。

        (7)等待IC的ACK回应。

        (8)如果单字节写入,只能写入一次,Pag页的写入,5,6可以进行多次。

        (9)最后给IC发送停止位。

        ic数据的接收:

        (1)发送起始位。

        (2)发送写控制字节,写控制字节的最后一位表示“写”,其他的位表示IC的id。

        (3)等待IC的ACK回应。

        (4)写入地址高字节(如果是16位地址数据)。

        (5)等待IC的ACK回应。

        (6)写入地址低字节

        (7)等待IC的ACK回应。

        (8)发送起始位。

        (9)发送读控制字节,读控制字节的最后一位表示“读”,其他的位表示IC的id。

        (10)等待IC的ACK回应。

        (11)接收数据。

        (12)数据没有接收完毕,继续接收,发送ACK回应信号。

        (13)接收数据。

        (14)数据接收完毕,发送NACK回应信号。

        (15)发送停止位。

        8、停止信号,最后保持SCL为高电平;其他信号,函数结束的最后一定要保持SCL为低电平。

二、IIC使用引脚的配置电平的配置。

1、SDA的GPIO输入

static void i2c_sda_in(void)
{GPIO_InitTypeDef  gpio_cfg;__HAL_RCC_GPIOB_CLK_ENABLE();gpio_cfg.Pin = bus_i2c->sda_pin;gpio_cfg.Mode = GPIO_MODE_INPUT;
//    gpio_cfg.Pull = GPIO_PULLUP;HAL_GPIO_Init((GPIO_TypeDef*)bus_i2c->sda_port, &gpio_cfg);
}

2、SDA的GPIO输出

static void i2c_sda_out(void)
{GPIO_InitTypeDef  gpio_cfg;__HAL_RCC_GPIOB_CLK_ENABLE();gpio_cfg.Pin = bus_i2c->sda_pin;gpio_cfg.Mode = GPIO_MODE_OUTPUT_OD;gpio_cfg.Pull = GPIO_PULLUP;gpio_cfg.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init((GPIO_TypeDef*)bus_i2c->sda_port, &gpio_cfg);
}

3、SCL的GPIO输出

static void i2c_scl_out(void)
{GPIO_InitTypeDef  gpio_cfg;__HAL_RCC_GPIOB_CLK_ENABLE();gpio_cfg.Pin = bus_i2c->scl_pin;gpio_cfg.Mode = GPIO_MODE_OUTPUT_OD;gpio_cfg.Pull = GPIO_PULLUP;gpio_cfg.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init((GPIO_TypeDef*)bus_i2c->scl_port, &gpio_cfg);
}

4、SDA输出高低电平

static void i2c_sda_write(unsigned char value)
{HAL_GPIO_WritePin((GPIO_TypeDef*)bus_i2c->sda_port, bus_i2c->sda_pin, value?GPIO_PIN_SET:GPIO_PIN_RESET);
}

5、SCL输出高低电平

static void i2c_scl_write(unsigned char value)
{HAL_GPIO_WritePin((GPIO_TypeDef*)bus_i2c->scl_port, bus_i2c->scl_pin, value?GPIO_PIN_SET:GPIO_PIN_RESET);
}

6、SDA电平读取

static unsigned int i2c_sda_read(void)
{return HAL_GPIO_ReadPin((GPIO_TypeDef*)bus_i2c->sda_port, bus_i2c->sda_pin);
}

三、IIC基础信号

1、起始信号(边沿信号)

        刚开始的时候SDA和SCL引脚信号应该都是高电平,起始信号之后要保持SCL为低电平。

在SCL高电平的时候,SDA产生下降沿。

(1)SAD拉高+延时函数

(2)SCL拉高+延时函数

(3)SDA拉低+延时函数

(4)SCL拉低+延时函数

static void i2c_start(void)
{i2c_sda_out();i2c_sda_write(1);i2c_delay();i2c_scl_write(1);i2c_delay();i2c_sda_write(0);i2c_delay();i2c_scl_write(0);i2c_delay();
}

2、停止信号(边沿信号)

           结束的时候SCL的电平一定是低电平,但是SDA的电平是不确定的,所以应该先把SDA电平拉低。

        在SCL为高电平的时候,SDA产生上升沿。

(1)SDA拉低+延时函数

(2)SCL拉高+延时函数

(3)SDA拉高+延时函数

static void i2c_stop(void)
{i2c_sda_out();i2c_sda_write(0);i2c_delay();i2c_scl_write(1);i2c_delay();i2c_sda_write(1);i2c_delay();
}

3、延时函数

        延时函数就使用汇编指令“__NOP()”。具体知识参考其他文章。

static void i2c_delay(void)
{__NOP();
}

4、发送ACK应答信号(电平信号)

        SCL电平一定是低电平,SDA电平未知。SCL为高电平的时候,SDA为低电平,为ACK应答信号。但是这个信号必须在数据接受完之后发送才有效。

(1)SDA拉低+延时函数

(2)SCL拉高+延时函数

(3)SCL拉低+延时函数

static void i2c_write_ack(void)
{i2c_sda_out();i2c_sda_write(0);i2c_delay();i2c_scl_write(1);i2c_delay();i2c_scl_write(0);i2c_delay();
}

5、发送NACK应答信号(电平信号)

        SCL电平一定为低电平,SDA的状态确定。在SCL为高电平的时候,SDA为高电平。这个信号也是只有在读取完数据之后发送才可以。

(1)SDA拉高+延时函数

(2)SCL拉高+延时函数

(3)SCL拉低+延时函数

static void i2c_write_nack(void)
{i2c_sda_out();i2c_sda_write(1);i2c_delay();i2c_scl_write(1);i2c_delay();i2c_scl_write(0);i2c_delay();
}

6、等待ACK应答信号(电平信号)

        SCL一定为高电平,SDA电平不确定。在SCL为高电平的时候,读取SDA电平,当读取到SDA为低电平的时候,就说明接收到了ACK信号。

(1)SCL拉高+延时函数

(2)读取SDA电平+延时函数

(3)SCL拉低+延时函数

static unsigned char i2c_read_ack(void)
{unsigned char level = 0;i2c_sda_in();i2c_scl_write(1);i2c_delay();if(i2c_sda_read())level = 1;i2c_scl_write(0);i2c_delay();return level;
}

7、发送数据(电平信号)

        只有在SCL为高电平的时候SDA电平才有效,在SCL为高电平的时候,必须保持SDA电平稳定,所以SCL电平变化之前,SDA应该先变化。

(1)SDA电平变化+延时函数(根绝写入数据位设置电平)

(2)SCL拉高+延时函数

(3)SCL拉低+延时函数

static void i2c_write_byte(unsigned short data)
{int i;unsigned char temp = (unsigned char)(data & 0xFF);i2c_sda_out();for(i=0;i<8;i++){if(temp & 0x80)i2c_sda_write(1);elsei2c_sda_write(0);temp <<= 1;i2c_delay();i2c_scl_write(1);i2c_delay();i2c_scl_write(0);i2c_delay();}
}

8、接收数据(电平信号)

        数据接收和数据发送是一样的,SDA在SCL为高电平的时候有效,所以SCL为高电平的时候读取SDA引脚的电平状态。

(1)SCL拉高+延时函数

(2)读取SDA电平+延时函数

(3)SCL拉低+延时函数

static unsigned char i2c_read_byte(void)
{int i;unsigned char temp = 0;i2c_sda_in();for(i=0;i<8;i++){i2c_scl_write(1);i2c_delay();temp <<= 1;if(i2c_sda_read())temp |= 0x01;i2c_scl_write(0);i2c_delay();}return temp;
}

四、针对IC的写入数据指令和读书数据指令流程

      下面是针对IC的一般情况的数据写入和读出的操作流程。

1、IIC对IC的数据写入(单字节写入)

        下图所示的就是IIC对IC芯片的数据写入的基本逻辑。除了两个边沿信号(起始、停止信号)是不需要等待IC给ACK回应的。写入数据或者地址都是需等待IC的ACK回应,确认IC收到了数据。

(1)写入启动。

(2)写入“ic写控制字节”。

(3)等待ACK响应。

(4)写入寄存器地址。

(5)等待ACK响应。(如果没等到就写入stop位并返回)。

(6)写入要写入的数据(可以使用循环写入多个byte)。

(7)每次写入数据都需要等待ACK响应。

(8)写入stop位。

uint8_t PCT2075DP_Write(uint8_t reg, void* data,uint8_t size)
{int i;uint8_t* pData = (uint8_t*)data;i2c_scl_out();i2c_start();i2c_write_byte(0x90);if(i2c_read_ack){i2c_stop();return -1;}i2c_write_byte(reg);if(i2c_read_ack){i2c_stop();return -3;}for(i=0; i<size; i++){i2c_write_byte(pData[i]);if(i2c_read_ack){i2c_stop();return i;}}i2c_stop();return i;
}

2、IIC对IC的数据读出(单字节读出)

       IIC对IC的数据读取除了两个边沿信号(起始、停止信号)是不需要给IC一个ACK回应信号的。进行数据的读取的时候,每读取一个字节都是需要给IC发送一个ACK回应,代表已经接收到数据,还需要继续接收数据;如果接收到的是最后一个数据,并且不在接收数据,那么就回应NACK信号。

(1)写起始信号位。

(2)写入“ic写控制字节”。

(3)等待IC的ACK回应。

(4)写入地址高字节(如果地址16位就写高字节)。

(5)等待IC的ACK回应。

(6)写入地址低字节。

(7)等待IC的ACK回应。

(8)写入起始信号(本次是重启IIC总线)。

(9)写入“ic读控制字节”。

(10)等待IC的ACK回应。

(11)读取数据字节。

(12)写入ACK回应信号(表示继续读取)。

(13)读取数据字节。

(14)写入NACK回应信号(表示数据读取结束)。

(15)写入停止位。

uint8_t PCT2075DP_Read(uint8_t reg, void* data,uint8_t size, uint8_t poit)
{int i;uint8_t* pData = (uint8_t*)data;i2c_scl_out();i2c_start();i2c_write_byte(0x90);if(i2c_read_ack()){i2c_stop();return -1;}i2c_write_byte(0x00);if(i2c_read_ack()){i2c_stop();return -3;}i2c_start();i2c_write_byte(0x91);if(i2c_read_ack()){i2c_stop();return -4;}for(i=0; i<size; i++){pData[i] = i2c_read_byte();    //需要继续读的时候就回复i2c_write_ack()。if(i == size - 1){i2c_write_nack();}else{i2c_write_ack();}}i2c_stop();return i;
}

下面是总体代码:

#ifndef __MYIIC_H__
#define __MYIIC_H__#include "stm32l0xx_hal.h"
#include "stdint.h"
#include <stdio.h>
#include "delay.h"
#include "485.h"typedef struct sIIC_IO {unsigned int scl_port;unsigned int scl_pin;unsigned int sda_port;unsigned int sda_pin;
}g_tIIC_IO;extern void myTest(float *pvalue);
extern int pct7075_read(float *pvalue);
#endif
#include "Myiic.h"
#include <string.h>
/* 模拟IIC,7个函数。*(1)iic函数发送数据注意发送多少位的兼容。*(2)iic函数发送两个字节的还是一个字节的地址。*(3)SDA的数据电平只有在SCL为高电平的时候有效。*(4)iic功能函数:起始信号、停止信号、产生ACK应答、产生NACK应答,等待ACK应答,接收数据,发送数据*(5)利用面对对象思想,结构体封装模拟iic使用端口和与引脚*(6)引脚的输出输出初始化,引脚电平变化的函数,结构体的封装管理。*/g_tIIC_IO i2c1 = {.scl_port = (unsigned int)GPIOB,.scl_pin  = (unsigned int)GPIO_PIN_6,.sda_port = (unsigned int)GPIOB,.sda_pin  = (unsigned int)GPIO_PIN_7
};g_tIIC_IO *bus_i2c = &i2c1;static void i2c_delay(void)
{__NOP();
}static void i2c_sda_out(void)
{GPIO_InitTypeDef  gpio_cfg;__HAL_RCC_GPIOB_CLK_ENABLE();gpio_cfg.Pin = bus_i2c->sda_pin;gpio_cfg.Mode = GPIO_MODE_OUTPUT_OD;gpio_cfg.Pull = GPIO_PULLUP;gpio_cfg.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init((GPIO_TypeDef*)bus_i2c->sda_port, &gpio_cfg);
}static void i2c_sda_write(unsigned char value)
{HAL_GPIO_WritePin((GPIO_TypeDef*)bus_i2c->sda_port, bus_i2c->sda_pin, value?GPIO_PIN_SET:GPIO_PIN_RESET);
}static void i2c_sda_in(void)
{GPIO_InitTypeDef  gpio_cfg;__HAL_RCC_GPIOB_CLK_ENABLE();gpio_cfg.Pin = bus_i2c->sda_pin;gpio_cfg.Mode = GPIO_MODE_INPUT;
//    gpio_cfg.Pull = GPIO_PULLUP;HAL_GPIO_Init((GPIO_TypeDef*)bus_i2c->sda_port, &gpio_cfg);
}static unsigned int i2c_sda_read(void)
{return HAL_GPIO_ReadPin((GPIO_TypeDef*)bus_i2c->sda_port, bus_i2c->sda_pin);
}static void i2c_scl_out(void)
{GPIO_InitTypeDef  gpio_cfg;__HAL_RCC_GPIOB_CLK_ENABLE();gpio_cfg.Pin = bus_i2c->scl_pin;gpio_cfg.Mode = GPIO_MODE_OUTPUT_OD;gpio_cfg.Pull = GPIO_PULLUP;gpio_cfg.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init((GPIO_TypeDef*)bus_i2c->scl_port, &gpio_cfg);
}static void i2c_scl_write(unsigned char value)
{HAL_GPIO_WritePin((GPIO_TypeDef*)bus_i2c->scl_port, bus_i2c->scl_pin, value?GPIO_PIN_SET:GPIO_PIN_RESET);
}static void i2c_start(void)
{i2c_sda_out();i2c_sda_write(1);i2c_delay();i2c_scl_write(1);i2c_delay();i2c_sda_write(0);i2c_delay();i2c_scl_write(0);i2c_delay();
}static void i2c_stop(void)
{i2c_sda_out();i2c_sda_write(0);i2c_delay();i2c_scl_write(1);i2c_delay();i2c_sda_write(1);i2c_delay();
}static void i2c_write_nack(void)
{i2c_sda_out();i2c_sda_write(1);i2c_delay();i2c_scl_write(1);i2c_delay();i2c_scl_write(0);i2c_delay();
}static void i2c_write_ack(void)
{i2c_sda_out();i2c_sda_write(0);i2c_delay();i2c_scl_write(1);i2c_delay();i2c_scl_write(0);i2c_delay();
}static unsigned char i2c_read_ack(void)
{unsigned char level = 0;i2c_sda_in();i2c_scl_write(1);i2c_delay();if(i2c_sda_read())level = 1;i2c_scl_write(0);i2c_delay();return level;
}static void i2c_write_byte(unsigned short data)
{int i;unsigned char temp = (unsigned char)(data & 0xFF);i2c_sda_out();for(i=0;i<8;i++){if(temp & 0x80)i2c_sda_write(1);elsei2c_sda_write(0);temp <<= 1;i2c_delay();i2c_scl_write(1);i2c_delay();i2c_scl_write(0);i2c_delay();}
}static unsigned char i2c_read_byte(void)
{int i;unsigned char temp = 0;i2c_sda_in();for(i=0;i<8;i++){i2c_scl_write(1);i2c_delay();temp <<= 1;if(i2c_sda_read())temp |= 0x01;i2c_scl_write(0);i2c_delay();}return temp;
}/* 上面就是iic的标准操作函数 */
/*****************************************************************/
/**address:地址*reg:寄存器指针指令**/uint8_t PCT2075DP_Write(uint8_t reg, void* data,uint8_t size)
{int i;uint8_t* pData = (uint8_t*)data;i2c_scl_out();i2c_start();i2c_write_byte(0x90);if(i2c_read_ack){i2c_stop();return -1;}i2c_write_byte(reg);if(i2c_read_ack){i2c_stop();return -3;}for(i=0; i<size; i++){i2c_write_byte(pData[i]);if(i2c_read_ack){i2c_stop();return i;}}i2c_stop();return i;
}uint8_t PCT2075DP_Read(uint8_t reg, void* data,uint8_t size, uint8_t poit)
{int i;uint8_t* pData = (uint8_t*)data;i2c_scl_out();i2c_start();i2c_write_byte(0x90);if(i2c_read_ack()){i2c_stop();return -1;}i2c_write_byte(0x00);if(i2c_read_ack()){i2c_stop();return -3;}i2c_start();i2c_write_byte(0x91);if(i2c_read_ack()){i2c_stop();return -4;}for(i=0; i<size; i++){pData[i] = i2c_read_byte();    //需要继续读的时候就回复i2c_write_ack()。if(i == size - 1){i2c_write_nack();}else{i2c_write_ack();}}i2c_stop();return i;
}void myTest(float *pvalue)
{uint16_t temp,data=0;int retry = 3;float value;/* run in normal mode */PCT2075DP_Write(0x01, &data, 1);while(retry --){if (PCT2075DP_Read(0x00, &temp, 2, 0) == 2)break;}temp = ((temp&0xFF00)>>8)|((temp&0x00FF)<<8);   // 传感器读取数据高8位与低8位位置调转,返回值直接short型value = temp;temp=0;value = value / 256;*pvalue= value;
}int i2c_write(g_tIIC_IO* bus, unsigned char address, unsigned short reg, void* pbuf, int size, unsigned char reg_16bit)
{int i = 0;unsigned char* buf_ptr;if(pbuf == NULL) return i;buf_ptr = (unsigned char*)pbuf;bus_i2c = bus;i2c_scl_out();i2c_start();i2c_write_byte(address | 0);if(i2c_read_ack()) {i2c_stop();return -1;}if(reg_16bit) {i2c_write_byte(reg >> 8);if(i2c_read_ack()) {i2c_stop();return -2;}}i2c_write_byte(reg);if(i2c_read_ack()) {i2c_stop();return -3;}for(i=0;i<size;i++) {i2c_write_byte(buf_ptr[i]);if(i2c_read_ack()) {i2c_stop();return i;}}i2c_stop();return i;
}int i2c_read(g_tIIC_IO* bus, unsigned char address, unsigned short reg, void* pbuf, int size, unsigned char reg_16bit)
{int i = 0;unsigned char* buf_ptr;if(pbuf == NULL) return i;buf_ptr = (unsigned char*)pbuf;bus_i2c = bus;i2c_scl_out();i2c_start();i2c_write_byte(address | 0);if(i2c_read_ack()) {i2c_stop();return -1;}if(reg_16bit) {i2c_write_byte(reg >> 8);if(i2c_read_ack()) {i2c_stop();return -2;}}i2c_write_byte(reg);if(i2c_read_ack()) {i2c_stop();return -3;}i2c_start();i2c_write_byte(address | 1);if(i2c_read_ack()) {i2c_stop();return -4;}for(i=0;i<size;i++) {buf_ptr[i] = i2c_read_byte();if(i == size - 1)i2c_write_nack();elsei2c_write_ack();}i2c_stop();return i;
}int pct7075_read(float *pvalue)
{int retry = 3; // 3次读取失败则传感器数据读取失效,回填0xFFshort temp;float value;
#ifdef PWR_CTRLunsigned char cfg;/* run in normal mode */cfg = 0x00;i2c_write(&PTC2075_I2C_BUS, PTC2075_SLV_ADDR, 0x01, &cfg, 1, 0);
#endif/* 多次读取,方式有时候读取失败 */while(retry --){if (i2c_read(&i2c1, 0x90, 0x00, &temp, 2, 0) == 2)break;}
#ifdef PWR_CTRL/* run in shutdown mode */cfg = 0x01;i2c_write(&i2c1, 0x90, 0x01, &cfg, 1, 0);
#endifif(!retry)   //读取数据失败的情况。{memset(pvalue, 0xFF, 4);return -1;}temp = ((temp&0xFF00)>>8)|((temp&0x00FF)<<8);   // 传感器读取数据高8位与低8位位置调转,返回值直接short型value = temp;value = value / 256;if(pvalue != 0) *pvalue = value;return 0;
}

相关文章:

模拟IIC通讯协议(stm32)(硬件iic后面在补)

一、IIC基础知识总结。 1、IIC通讯需要两条线就可以&#xff0c;SCL、SDA。 2、IIC的数据传输的速率&#xff0c;不同的ic是不同的&#xff0c;根据电平维持的延时函数的时间来确定IIC数据传输的速率. 3、IIC的延时函数可以使用延时函数&#xff0c;延时函数一般使用系统滴答时…...

使用注解读取properties配置文件

文章目录 1、背景2、注解方式2.1 PropertySource 、 ConfigurationProperties2.2 读取properties中全部字段值ConfigurationProperties2.3 读取properties中部分字段值&#xff1a;value("${自定义key}") 1、背景 服务中使用到了redis&#xff0c;需要配置redis连接…...

Python---练习:求世界杯小组赛的总成绩(涉及:布尔类型转换为整型)

案例 世界杯案例 需求&#xff1a; 世界杯案例&#xff0c;世界杯小组赛的比赛规则是我们的球队与其他三支球队进行比赛&#xff0c;然后根据总成绩(积分)确定出线资格。小组赛球队实力已知(提示用户输入各球队实力&#xff09;&#xff0c;我们通过一个数字表示。如果我们赢…...

vue3学习源码笔记(小白入门系列)------KeepAlive 原理

目录 说明组件是如何被缓存的&#xff0c;什么时候被激活对于KeepAlive 中组件 如何完成激活的对于KeepAlive 中组件 如何完成休眠的 总结 说明 Vue 内置了 KeepAlive 组件&#xff0c;实现缓存多个组件实例切换时&#xff0c;完成对卸载组件实例的缓存&#xff0c;从而使得组…...

边写代码边学习之mlflow

1. 简介 MLflow 是一个多功能、可扩展的开源平台&#xff0c;用于管理整个机器学习生命周期的工作流程和工件。 它与许多流行的 ML 库内置集成&#xff0c;但可以与任何库、算法或部署工具一起使用。 它被设计为可扩展的&#xff0c;因此您可以编写插件来支持新的工作流程、库和…...

基于吉萨金字塔建造优化的BP神经网络(分类应用) - 附代码

基于吉萨金字塔建造优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于吉萨金字塔建造优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.吉萨金字塔建造优化BP神经网络3.1 BP神经网络参数设置3.2 吉萨金字…...

axios的post请求所有传参方式

Axios支持多种方式来传递参数给POST请求。以下是一些常见的方式&#xff1a; 作为请求体&#xff1a; 你可以将参数作为请求体的一部分&#xff0c;通常用于发送表单数据或JSON数据。例如&#xff1a; const data { key1: value1, key2: value2 }; axios.post(/api/endpoint, …...

【c++】向webrtc学比较2: IsNewerSequenceNumber 用于NackTracker及测试

LatestSequenceNumber inline uint16_t LatestSequenceNumber(uint16_t sequence_number1,uint16_t sequence_number2) {return IsNewerSequenceNumber(sequence_number1, sequence_number2)? sequence_number1: sequen...

PRCV 2023:语言模型与视觉生态如何协同?合合信息瞄准“多模态”技术

近期&#xff0c;2023年中国模式识别与计算机视觉大会&#xff08;PRCV&#xff09;在厦门成功举行。大会由中国计算机学会&#xff08;CCF&#xff09;、中国自动化学会&#xff08;CAA&#xff09;、中国图象图形学学会&#xff08;CSIG&#xff09;和中国人工智能学会&#…...

深度学习硬件配置推荐(kaggle学习)

目录 1. 基础推荐2. GPU显存与内存是一个1:4的配比&#xff1f;3. deep learning 入门和kaggle比赛4. 有些 Kaggle 比赛数据集很大&#xff0c;可能需要更多的 GPU 显存&#xff0c;请推荐显存4. GDDR6和HBM25. HDD 或 SATA SSD 1. 基础推荐 假设您作为一个深度学习入门学者的…...

1019hw

登录窗口头文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QToolBar> #include <QMenuBar> #include <QPushButton> #include <QStatusBar> #include <QLabel> #include <QDockWidget>//浮动窗口…...

两分钟搞懂UiAutomator自动化测试框架

1. UiAutomator简介 UiAutomator是谷歌在Android4.1版本发布时推出的一款用Java编写的UI测试框架&#xff0c;基于Accessibility服务。其最大的特点就是可以跨进程操作&#xff0c;可以使用UiAutomator框架提供的一些方便的API来对安卓应用进行一系列的自动化测试操作&#xf…...

Fast DDS之Subscriber

目录 SubscriberSubscriberQosSubscriberListener创建Subscriber DataReaderSampleInfo读取数据 Subscriber扮演容器的角色&#xff0c;里面可以有很多DataReaders&#xff0c;它们使用Subscriber的同一份SubscriberQos配置。Subscriber可以承载不同Topic和数据类型的DataReade…...

测试PySpark

文章最前&#xff1a; 我是Octopus&#xff0c;这个名字来源于我的中文名--章鱼&#xff1b;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github &#xff1b;这博客是记录我学习的点点滴滴&#xff0c;如果您对 Python、Java、AI、算法有兴趣&#xff0c;可以关注我的…...

C语言- 原子操作

基本概念 在C语言(尤其是C11标准之后)中,原子操作提供了一种机制,使得程序员可以在并发环境中,不使用互斥或其他同步原语,而直接对数据进行操作,同时确保数据的完整性和一致性。 原子变量和原子操作的核心思想是:无论什么时候,只有一个线程能够看到变量的修改操作。…...

设置hadoop+安装java环境

上一篇 http://t.csdnimg.cn/K3MFS 基本操作 接着上一篇 先导入之前导出的虚拟机 选择导出到对应的文件夹中 这里修改一下保存虚拟机的位置&#xff08;当然你默认也可以&#xff09; 改一个名字 新建一个share文件夹用来存放共享软件的文件夹 在虚拟机的设置中找到这个设置…...

阿里云新加坡主机服务器选择

阿里云新加坡主机有哪些选择&#xff1f;可以选择云服务器ECS或轻量应用服务器&#xff0c;都有新加坡地域可以选择&#xff0c;东南亚地区可以选择新加坡、韩国首尔、日本东京等地域&#xff0c;阿里云新加坡主机测试IP地址&#xff1a;161.117.118.93 可以测试下本地到新加坡…...

21天打卡掌握java基础操作

Java安装环境变量配置-day1 参考&#xff1a; https://www.runoob.com/w3cnote/windows10-java-setup.html 生成class文件 java21天打卡-day2 输入和输出 题目&#xff1a;设计一个程序&#xff0c;输入上次考试成绩&#xff08;int&#xff09;和本次考试成绩&#xff0…...

SQL题目记录

1.商品推荐题目 1.思路&#xff1a; 通过取差集 得出要推荐的商品差集的选取&#xff1a;except直接取差集 或者a left join b on where b null 2.知识点 1.except selectfriendship_info.user1_id as user_id,sku_id fromfriendship_infojoin favor_info on friendship_in…...

Linux程序调试器——gdb的使用

gdb的概述 GDB 全称“GNU symbolic debugger”&#xff0c;从名称上不难看出&#xff0c;它诞生于 GNU 计划&#xff08;同时诞生的还有 GCC、Emacs 等&#xff09;&#xff0c;是 Linux 下常用的程序调试器。发展至今&#xff0c;GDB 已经迭代了诸多个版本&#xff0c;当下的…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...

ZYNQ学习记录FPGA(一)ZYNQ简介

一、知识准备 1.一些术语,缩写和概念&#xff1a; 1&#xff09;ZYNQ全称&#xff1a;ZYNQ7000 All Pgrammable SoC 2&#xff09;SoC:system on chips(片上系统)&#xff0c;对比集成电路的SoB&#xff08;system on board&#xff09; 3&#xff09;ARM&#xff1a;处理器…...