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

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

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

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

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

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

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

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

如何把工业通信协议转换成http websocket

1.现状 工业通信协议多数工作在边缘设备上&#xff0c;比如&#xff1a;PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发&#xff0c;当设备上用的是modbus从站时&#xff0c;采集设备数据需要开发modbus主站&#xff1b;当设备上用的是西门子PN协议时&#xf…...