当前位置: 首页 > 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;当下的…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...