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

STM32F4X I2C LM75

STM32F4X I2C LM75

  • I2C协议讲解
    • I2C接线
    • I2C协议波形
    • I2C起始信号
    • I2C停止信号
    • I2C应答信号
    • I2C寻址
      • I2C地址格式
    • I2C数据传输
  • LM75A
    • LM75A介绍
    • LM75A引脚说明
    • LM75A地址
    • LM75A寄存器
    • LM75A I2C协议
      • 写配置寄存器
      • 读配置寄存器
      • 写Tos和Thyst寄存器
      • 读Tos Thyst Temp寄存器
      • LM75A温度计算
  • LM75A例程
    • i2c.c
    • i2c.h
    • lm75.c
    • lm75.h
    • main.c

I2C协议是飞利浦公司在1982年发明的一种用于芯片之间通信的协议,其特点是电路硬件简单,可连接多个设备。在进行I2C通信时,只需要用到2根信号线,I2C通信可以达到几百K左右,适合低速的通信领域。

I2C协议讲解

I2C接线

I2C设备分为主机和从机,主机负责发送时钟信号,从机不发送时钟信号。I2C通信时只需要两个通信线,分别是时钟线SCL和数据线SDA。其中SCL是单向数据线,是主机发给从机,而SDA是双向数据线。因为I2C协议规定在空闲时候SCL和SDA要保持高电平,所以在电路设计时SCL和SDA要接分别接一个上拉电阻到VCC。
在这里插入图片描述

I2C协议波形

在这里插入图片描述
I2C协议的波形有如下的几个特点

  • 开始数据传输时需要发送一个起始信号
  • 结束数据传输时需要发送一个停止信号
  • I2C每次传输的位数是8位,一个字节的数据
  • 每次传输完一个数据后,在第9位需要有应答信号
  • I2C每次进行数据传输前都需要发送一个从设备地址

I2C起始信号

在I2C开始通信前,主机要先发送一个起始信号,告诉从机开始准备通信。
在这里插入图片描述
首先要先把SCL和SDA拉高,保持一段时间,然后把SDA拉低,这时从机就会检测到一个起始信号。

I2C停止信号

当主机要结束通信时,需要发送一个停止信号,告诉从机,通信结束。
在这里插入图片描述
首先要先把SCL和SDA拉低,保持一段时间,然后把SDA拉高,这时从机就会检测到一个停止信号。

I2C应答信号

I2C协议规定,每传输完一个字节的数据,都需要有一个应答信号,应答信号的作用是确认数据是否已经被对方接受到,应答信号由接收数据的设备产生,可以是主机也可以是从机。
在这里插入图片描述

在数据发送或接收完成后,主机需要把SDA线拉高,然后等待从机或者主机把SDA线拉低,则代表有应答,如果SDA线保持为高电平,则代表没有应答。

I2C寻址

I2C的主机可以连接多个从机,这时候就会出现一个问题,当主机开始通信时,要怎么保证能找到对应的从机与之进行通信?为了解决这个问题,I2C协议引入了从机地址的概念,拿个日常生活的例子来说明。
某一天你的朋友来找你,他住在一家酒店里面,酒店里面有3间房间,房间号分别是101、102和103。在你出发前要先问清楚你朋友住在哪一间房间,这样才能保证不会找错。3个房间就代表3个I2C从机,房间号则代表I2C从机的地址。在I2C主机开始通信前,会先给所有的从机发送一个地址,如果有从机应答,则代表寻址正确,开始通信。这个从机地址在一个I2C总线上是唯一的。
I2C从机可以选择7位和10位,大多数的芯片都是7位地址,7位地址的模式下,一个I2C主机最多可以接128个从机设备,而10位地址模式下,一个I2C主机最多可以接1024个从机设备。

I2C地址格式

我们以7位地址模式为例,说一下I2C从机的地址格式

A6A5A4A3A2A1A0R/W
  • A6~A0:I2C从机的地址
  • R/W:设置主机读写模式,通常0为向I2C从机写数据,1为向I2C从机读数据

I2C数据传输

I2C协议规定,每次传输的数据为8位,在SCL为高电平时,SDA数据才有效,也就是说如果需要改变SDA的数据,则需要在SCL为低电平时进行修改。
在这里插入图片描述

LM75A

LM75A介绍

LM75A是NXP半导体公司推出的一具有I2C接口的数字温度传感器芯片,可广泛运用于系统温度管理、个人计算机、电子设备、工业控制器等方面。
特性:

  • I2C 总线接口,器件地址 7 位从机地址 1001xxx,同一总线上可以外扩 8 个器件;
  • 供电范围:2.8V~5.5V,温度范围:-55℃~+125℃;
  • 11 位 ADC 提供温度分辨率达 0.125℃;
  • 温度精度:±2℃(-25℃~100℃) ±3℃(-55℃~125℃)
  • 可编程温度阈值和滞后设定点;
  • 为了减低功耗,关断模式下消耗的电流仅为 1.0μA;
  • 上电时器件可用作一个独立的温度控制器;
  • 在 JEDEC 标准下(JESD78)所做的闩锁测试可达 100mA;
  • 小型 8 脚封装:SO8、TSSOP8 和超小型封装 XSON8U。

LM75A引脚说明

在这里插入图片描述

管脚号符号功能说明
1SDA数据线
2SCL时钟线
3OS过热关断输出,开漏
4GND地线
5A2用户定义地址2
6A1用户定义地址1
7A0用户定义地址0
8VCC电源线

LM75A地址

LM75A的地址为7位,其地址定义如下

A6A5A4A3A2A1A0R/W
1001A2A1A0

其中A0~A2是用户自定义的,可以接地和接VCC,但是不能悬空,根据其地址定义,同一个I2C总线上最多可以接8个LM75A器件。

LM75A寄存器

LM75内部有4个寄存器,其定义如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
除了配置寄存器为8位外,其他3个寄存器都是16位。

LM75A I2C协议

写配置寄存器

在这里插入图片描述

  1. 主机发送起始信号
  2. 主机发送从机写地址
  3. 主机等待从机应答
  4. 主机发送配置寄存器地址
  5. 主机等待从机应答
  6. 主机发送配置寄存器数据
  7. 主机等待从机应答
  8. 主机发送结束信号

读配置寄存器

在这里插入图片描述

  1. 主机发送起始信号
  2. 主机发送从机写地址
  3. 主机等待从机应答
  4. 主机发送配置寄存器地址
  5. 主机等待从机应答
  6. 主机重新发送起始信号
  7. 主机发送从机读地址
  8. 主机等待从机应答
  9. 主机读取从机数据
  10. 主机发送不应答信号
  11. 主机发送结束信号

写Tos和Thyst寄存器

在这里插入图片描述

  1. 主机发送起始信号
  2. 主机发送从机写地址
  3. 主机等待从机应答
  4. 主机发送Tos或Thyst寄存器地址
  5. 主机等待从机应答
  6. 主机发送16位数据中高8位数据
  7. 主机等待从机应答
  8. 主机发送16位数据中低8位数据
  9. 主机等待从机应答
  10. 主机发送结束信号

读Tos Thyst Temp寄存器

在这里插入图片描述

  1. 主机发送起始信号
  2. 主机发送从机写地址
  3. 主机等待从机应答
  4. 主机发送Tos、Thyst、Temp寄存器地址
  5. 主机等待从机应答
  6. 主机重新发送起始信号
  7. 主机发送从机读地址
  8. 主机等待从机应答
  9. 主机读取从机数据高8位数据
  10. 主机发送应答信号
  11. 主机读取从机数据低8位数据
  12. 主机发送不应答信号
  13. 主机发送结束信号

LM75A温度计算

LM75A的温度值保存在TEMP寄存器里面,温度寄存器是一个只读寄存器,包含2个8位的数据字节,由一个高数据字节(MS)和一个低数据字节(LS)组成。在这两个字节中只用到 11 位,来存放分辨率为 0.125℃的Temp数据(以二进制补码数据的形式。
在这里插入图片描述
根据 11 位的 Temp 数据来计算 Temp 值的方法:
若 D10=0,温度值(℃)=+(Temp 数据)×0.125℃;
若 D10=1,温度值(℃)=-(Temp 数据的二进制补码)×0.125℃。

LM75A例程

i2c.c

#include "i2c.h"void cpu_delay(unsigned int tns)
{int i = 0;while(i < tns){__asm("NOP");i++;}
}//初始化IIC
void IIC_Init(void)
{			GPIO_InitTypeDef  GPIO_InitStructure;RCC_AHB1PeriphClockCmd(I2C_SCL_CLK,ENABLE);RCC_AHB1PeriphClockCmd(I2C_SDA_CLK,ENABLE);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Pin = I2C_SCL_PIN;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(I2C_SCL_PORT,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Pin = I2C_SDA_PIN;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(I2C_SDA_PORT,&GPIO_InitStructure);IIC_SDA_H;IIC_SCL_H;
}static void i2c_sda_out(void)	
{GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;GPIO_InitStruct.GPIO_Pin = I2C_SDA_PIN;GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(I2C_SDA_PORT,&GPIO_InitStruct);
}
static void i2c_sda_in(void)	
{GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;GPIO_InitStruct.GPIO_Pin = I2C_SDA_PIN;GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(I2C_SDA_PORT,&GPIO_InitStruct);
}//产生IIC起始信号
void IIC_Start(void)
{i2c_sda_out();     //sda线输出IIC_SDA_H;	  	  IIC_SCL_H;cpu_delay(4);IIC_SDA_L;//START:when CLK is high,DATA change form high to low cpu_delay(4);IIC_SCL_L;//钳住I2C总线,准备发送或接收数据 
}	  
//产生IIC停止信号
void IIC_Stop(void)
{i2c_sda_out(); //sda线输出IIC_SDA_L;	  	  IIC_SCL_L;cpu_delay(4);IIC_SDA_H;	  	  IIC_SCL_H;cpu_delay(4);							   	
}
//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
u8 IIC_Wait_Ack(void)
{u8 ucErrTime=0;i2c_sda_in();      //SDA设置为输入  IIC_SDA_H;cpu_delay(1);	   IIC_SCL_H;cpu_delay(1);	 while(IIC_SDA_READ() == SET){ucErrTime++;if(ucErrTime>250){IIC_Stop();return 1;}}IIC_SCL_L;//时钟输出0 	   return 0;  
} 
//产生ACK应答
void IIC_Ack(void)
{IIC_SCL_L;i2c_sda_out();IIC_SDA_L;cpu_delay(2);IIC_SCL_H;cpu_delay(2);IIC_SCL_L;
}
//不产生ACK应答		    
void IIC_NAck(void)
{IIC_SCL_L;i2c_sda_out();IIC_SDA_H;cpu_delay(2);IIC_SCL_H;cpu_delay(2);IIC_SCL_L;
}					 				     
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答			  
void IIC_Send_Byte(u8 txd)
{                        u8 t;   i2c_sda_out(); 	    IIC_SCL_L;//拉低时钟开始数据传输for(t=0;t<8;t++){              if((txd&0x80) >> 7)IIC_SDA_H;elseIIC_SDA_L;txd<<=1; 	  delay_ms(1);   IIC_SCL_H;delay_ms(1); IIC_SCL_L;	delay_ms(1);}	 
} 	    
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
u8 IIC_Read_Byte(unsigned char ack)
{unsigned char i,receive=0;i2c_sda_in();//SDA设置为输入for(i=0;i<8;i++ ){IIC_SCL_L; delay_ms(2);IIC_SCL_H;receive<<=1;if(IIC_SDA_READ())receive++;   delay_ms(1); }					 if (!ack)IIC_NAck();//发送nACKelseIIC_Ack(); //发送ACK   return receive;
}

i2c.h

#ifndef __I2C_H
#define __I2C_H#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"#define I2C_SCL_CLK RCC_AHB1Periph_GPIOB
#define I2C_SDA_CLK RCC_AHB1Periph_GPIOB#define I2C_SCL_PORT GPIOB
#define I2C_SDA_PORT GPIOB#define I2C_SCL_PIN GPIO_Pin_8
#define I2C_SDA_PIN GPIO_Pin_9#define IIC_SDA_H       GPIO_SetBits(I2C_SDA_PORT, I2C_SDA_PIN)
#define IIC_SDA_L       GPIO_ResetBits(I2C_SDA_PORT, I2C_SDA_PIN)                                                                  #define IIC_SCL_H       GPIO_SetBits(I2C_SCL_PORT, I2C_SCL_PIN)
#define IIC_SCL_L       GPIO_ResetBits(I2C_SCL_PORT, I2C_SCL_PIN)                                                                   #define IIC_SDA_READ()  GPIO_ReadInputDataBit(I2C_SDA_PORT, I2C_SDA_PIN)   void IIC_Init(void);                //初始化IIC的IO口				 
void IIC_Start(void);				//发送IIC开始信号
void IIC_Stop(void);	  			//发送IIC停止信号
void IIC_Send_Byte(u8 txd);			//IIC发送一个字节
u8 IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
u8 IIC_Wait_Ack(void); 				//IIC等待ACK信号
void IIC_Ack(void);					//IIC发送ACK信号
void IIC_NAck(void);				//IIC不发送ACK信号
#endif

lm75.c

#include "lm75.h"unsigned char lm75_init(void)
{IIC_Init();}void lm75_write_conf(unsigned char data)
{IIC_Start();IIC_Send_Byte(LM75_ADDRESS);IIC_Wait_Ack();IIC_Send_Byte(LM75_CONF_REG);IIC_Wait_Ack();IIC_Send_Byte(data);IIC_Wait_Ack();IIC_Stop();
}unsigned char lm75_read_conf(void)
{unsigned char data;IIC_Start();IIC_Send_Byte(LM75_ADDRESS);IIC_Wait_Ack();IIC_Send_Byte(LM75_CONF_REG);IIC_Wait_Ack();IIC_Start();IIC_Send_Byte(LM75_ADDRESS + 0x1);IIC_Wait_Ack();data = IIC_Read_Byte(0);IIC_Stop();return data;
}void lm75_write_tos_thyst(unsigned char reg,unsigned short data)
{IIC_Start();IIC_Send_Byte(LM75_ADDRESS);IIC_Wait_Ack();IIC_Send_Byte(reg);IIC_Wait_Ack();IIC_Send_Byte((data >> 8) & 0xFF);IIC_Wait_Ack();IIC_Send_Byte(data & 0xFF);IIC_Wait_Ack();IIC_Stop();}unsigned char lm75_read_tos_thyst_temp(unsigned char reg,unsigned short *data)
{unsigned char datah,datal;float temp;IIC_Start();IIC_Send_Byte(LM75_ADDRESS);IIC_Wait_Ack();IIC_Send_Byte(reg);IIC_Wait_Ack();IIC_Start();IIC_Send_Byte(LM75_ADDRESS + 0x1);IIC_Wait_Ack();datah = IIC_Read_Byte(1);datal = IIC_Read_Byte(0);IIC_Stop();*data = datah << 8 | datal;}

lm75.h

#ifndef __LM75_H
#define __LM75_H#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "i2c.h"#define LM75_ADDRESS (0x48 << 1)#define LM75_TEMP_REG (0x0)
#define LM75_CONF_REG (0x1)
#define LM75_THYST_REG (0x2)
#define LM75_TOS_REG   (0x3)unsigned char  lm75_init(void);
void lm75_read_temp(void);
void lm75_write_conf(unsigned char data);
unsigned char lm75_read_conf(void);void lm75_write_tos_thyst(unsigned char reg,unsigned short data);
unsigned char lm75_read_tos_thyst_temp(unsigned char reg,unsigned short *data);#endif

main.c

#include "stm32f4xx.h"
#include "delay.h"
#include "usart.h"
#include "lm75.h"
extern u8 rx_buf[RX_BUF_SIZE];
extern u16 USART_RX_STA;
int main(void)
{int i;unsigned short temp_data,tempforh;float temp;NVIC_PriorityGroupConfig(2);system_tick_init();bsp_usart_init(115200);lm75_init();while(1){delay_ms(1000);lm75_read_tos_thyst_temp(LM75_TEMP_REG,&temp_data); // 读取温度if(temp_data & 0x8000) // 温度为负数{tempforh = (temp_data >> 5 & 0xFFF);tempforh = (tempforh ^ 0x7FF) + 1;temp= tempforh * -0.125;}	else // 温度为正数temp=(temp_data >> 5 & 0xFFF) * 0.125; printf("temp = %f\r\n",temp);}}

在这里插入图片描述

相关文章:

STM32F4X I2C LM75

STM32F4X I2C LM75 I2C协议讲解I2C接线I2C协议波形I2C起始信号I2C停止信号I2C应答信号I2C寻址I2C地址格式 I2C数据传输 LM75ALM75A介绍LM75A引脚说明LM75A地址LM75A寄存器LM75A I2C协议写配置寄存器读配置寄存器写Tos和Thyst寄存器读Tos Thyst Temp寄存器LM75A温度计算 LM75A例…...

“华为杯”研究生数学建模竞赛2019年-【华为杯】F题:智能飞行器航迹规划模型(下)(附优秀论文及Pyhton代码实现)

目录 7.3 模型评估 7.3.1 算法的有效性和复杂度 7.3.2 灵敏度分析 8.模型的评价 8.1 模型的优点...

信息系统项目管理师第四版学习笔记——配置与变更管理

配置管理 管理基础 配置管理是为了系统地控制配置变更&#xff0c;在信息系统项目的整个生命周期中维持配置的完整性和可跟踪性&#xff0c;而标识信息系统建设在不同时间点上配置的学科。 配置项的版本号规则与配置项的状态定义相关。例如&#xff1a;①处于“草稿”状态的…...

代理IP端口是什么意思呢?

今天&#xff0c;咱们来聊聊一个小众但很有料的话题——代理IP端口&#xff0c;它可是你纵横互联网世界的好搭子哦&#xff01; 首先&#xff0c;我们得先弄明白&#xff0c;代理IP端口是个啥? 代理IP端口就像是通往网络世界的门票&#xff0c;是你和代理服务器之间的桥梁。…...

如何使用ChatPPT生成PPT文档

简介 ChatPPT是一个基于人工智能的PPT生成工具&#xff0c;可以帮助用户快速生成高质量的PPT文档。ChatPPT使用自然语言处理技术&#xff0c;可以根据用户的指令生成PPT内容、设计和排版。 使用方法 ChatPPT提供了两种使用方式&#xff1a;在线体验版和Office插件版。 在线…...

亚马逊云科技最新分享:人、流程、工具全链路数据安全合规

数据已经是现代发明和创新之源。 企业需要人—流程—工具全链路的数据安全合规。 出品 | CSDN 云计算 端到端、全栈&#xff0c;是近两年我们听到云巨头亚马逊云科技提到最多的架构思路。现在&#xff0c;已经成为生产要素的数据&#xff0c;重要性被提到的非常高的高度&#x…...

Xception:使用Tensorflow从头开始实现

一、说明 近年来&#xff0c;卷积神经网络已成为计算机视觉领域的主要算法&#xff0c;开发设计它们的方法一直是相当的关注。Inception模型似乎能够用更少的参数学习更丰富的表示。它们是如何工作的&#xff0c;以及它们与常规卷积有何不同&#xff1f;本文将用tensorflow实现…...

Practical Memory Leak Detection using Guarded Value-Flow Analysis 论文阅读

本文于 2007 年投稿于 ACM-SIGPLAN 会议1。 概述 指针在代码编写过程中可能出现以下两种问题&#xff1a; 存在一条执行路径&#xff0c;指针未成功释放&#xff08;内存泄漏&#xff09;&#xff0c;如下面代码中注释部分所表明的&#xff1a; int foo() {int *p malloc(4 …...

淘宝天猫商品历史价格API接口

获取淘宝商品历史价格接口的步骤如下&#xff1a; 注册淘宝开放平台&#xff1a;首先在淘宝开放平台上注册一个账号&#xff0c;并进行登录。创建应用&#xff1a;在淘宝开放平台上创建一个应用&#xff0c;并获取该应用的App Key和App Secret&#xff0c;用于后续的接口调用。…...

从0开始学go第七天

gin获取表单from中的数据 模拟简单登录页面&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>login</title> </head><body><form action"/login" method&q…...

【牛客面试必刷TOP101】Day7.BM31 对称的二叉树和BM32 合并二叉树

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;牛客面试必刷TOP101 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&…...

U盘怎么设置为只读?U盘怎么只读加密?

当将U盘设置为只读模式时&#xff0c;将只能查看其中数据&#xff0c;无法对其中数据进行编辑、复制、删除等操作。那么&#xff0c;怎么将U盘设置成只读呢&#xff1f; U盘如何设置成只读&#xff1f; 有些U盘带有写保护开关&#xff0c;当打开时&#xff0c;U盘就会处于只读…...

为什么MyBatis是Java数据库持久层的明智选择

在Java应用程序的开发中&#xff0c;选择合适的数据库持久层框架至关重要。一个明智的选择可以帮助开发人员更好地管理数据库交互、提高性能和简化开发工作。 &#xff08;一&#xff09;为什么要选MyBatis JDBCHibernate / JPAMyBatis简单直接ORM轻量动态SQL关联查询开发效率…...

二叉搜索树--查询节点-力扣 700 题

例题细节讲过(二叉搜索树的基础操作-CSDN博客)&#xff0c;下面给出递归实现 public TreeNode searchBST(TreeNode node, int val) {if(node null) {return null;}if(val < node.val) {return searchBST(node.left, val);} else if(node.val < val) {return searchBST(…...

YOLOv3 | 核心主干网络,特征图解码,多类损失函数详解

https://zhuanlan.zhihu.com/p/76802514) 文章目录 1. 核心改进1.1主干网络1.2 特征图解码1.2.1 检测框&#xff08;位置&#xff0c;宽高&#xff09;解码1.2.2 检测置信度解码1.2.3 类别解码 1.3 训练损失函数1.3.1 正负样本定义1.3.2 损失函数 1. 核心改进 1.1主干网络 更…...

Java架构师API设计

目录 1 导学2 架构师的角度来审视API2.1 API狭隘理解2.2 API广义理解2.3 API的用途不同定义2.4 面向抽象编程的Java开发2.5 API在提高系统的可维护性和可扩展性方面的作用3 架构师必备的API设计原则3.1 标准化原则3.2 易用性原则3.3 扩展性原则3.4 兼容性原则3.5 抽象性原则3.6…...

.net也能写内存挂

最近在研究.net的内存挂。 写了很久的c,发现c#写出来的东西实在太香。 折腾c#外挂已经有很长时间了。都是用socket和c配合。 这个模式其实蛮成功的&#xff0c;用rpc调用的方式加上c#的天生await 非常好写逻辑 类似这样 最近想换个口味。注入托管dll到非托管进程 这样做只…...

python学习笔记2-数字转化为String

题目链接 str() 强制转换&#xff0c; sorted() 转换为有序列表&#xff0c;join() 将列表中的元素连接到字符串中&#xff0c;然后奇偶位组合成数字 class Solution:def splitNum(self, num: int) -> int:stnum "".join(sorted(str(num)))num1, num2 int(stn…...

MAC版Gradle构建Spring5.X源码阅读环境

前言&#xff1a; 三年前鄙人有幸在现已几乎报废的Window的DELL中搭建过Spring源码环境&#xff0c;今天&#xff0c;Mac版的搭建&#xff0c;来了。 本篇文章环境搭建&#xff1a;Spring5.2.1 Gradle5.6.3-all jdk8 IDEA2022.3版本 文章目录 1、Spring源码下载2、Gradle下载…...

Linux 常用通配符

通配符是一种特殊语句&#xff0c;主要有星号&#xff08;*&#xff09;和问号&#xff08;&#xff1f;&#xff09;&#xff0c;用来模糊搜索文件。当查找文件夹时&#xff0c;可以使用它来代替一个或多个真正字符&#xff1b;当不知道真正字符或者懒得输入完整名字时&#x…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

书籍“之“字形打印矩阵(8)0609

题目 给定一个矩阵matrix&#xff0c;按照"之"字形的方式打印这个矩阵&#xff0c;例如&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为&#xff1a;1&#xff0c;…...

以太网PHY布局布线指南

1. 简介 对于以太网布局布线遵循以下准则很重要&#xff0c;因为这将有助于减少信号发射&#xff0c;最大程度地减少噪声&#xff0c;确保器件作用&#xff0c;最大程度地减少泄漏并提高信号质量。 2. PHY设计准则 2.1 DRC错误检查 首先检查DRC规则是否设置正确&#xff0c;然…...

Python爬虫(52)Scrapy-Redis分布式爬虫架构实战:IP代理池深度集成与跨地域数据采集

目录 一、引言&#xff1a;当爬虫遭遇"地域封锁"二、背景解析&#xff1a;分布式爬虫的两大技术挑战1. 传统Scrapy架构的局限性2. 地域限制的三种典型表现 三、架构设计&#xff1a;Scrapy-Redis 代理池的协同机制1. 分布式架构拓扑图2. 核心组件协同流程 四、技术实…...