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

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...