W5500使用ioLibrary库创建TCP客户端

news2025/5/19 15:28:58

1、WIZnet全硬件TCP/IP协议栈

WIZnet全硬件TCP/IP协议栈,支持TCP,UDP,IPv4,ICMP,ARP,IGMP以及PPPoE协议。
以太网:支持BSD和WIZCHIP(W5500/W5300/W5200/W5100/W5100S)的SOCKET APIs驱动程序。
互联网:
DHCP客户端
DNS客户端
FTP客户端
FTP服务器
SNMP代理/陷阱
SNTP客户端
TFTP客户端
HTTP服务器
MQTT客户端
其他功能将陆续添加。

ioLibrary库下载地址: https://gitcode.com/gh_mirrors/io/ioLibrary_Driver?utm_source=csdn_github_accelerator&isLogin=1

案例:项目首页 - MINISTM32移植W5500ioLiberary:MINISTM32 移植W5500 ioLiberary项目为开发者提供了在MINISTM32平台上移植W5500网络芯片的完整解决方案。该项目包含移植所需的库文件和示例代码,帮助开发者快速上手并实现网络通信功能。通过详细的移植说明和步骤,开发者可以轻松完成配置和调试,节省开发时间。无论是初学者还是有经验的工程师,都可以利用该项目在STM32F103RCT6平台上高效集成W5500,实现稳定的网络连接。项目资源丰富,文档清晰,是嵌入式网络开发的理想选择。 - GitCode

internet文件夹

W5500文件夹

2、W5500芯片

W5500是一款全硬件TCP/IP以太网控制器。W5500集成了TCP/IP协议栈,10/100M以太网数据链路
层(MAC)及物理层(PHY),使得用户使用单芯片就能够在他们的应用中拓展网络连接。
支持8个独立端口(Socket)同时通讯,每一个 Socket 的发送 缓存区都在一个 16KB 的物理发送内存中,初始化分配为 2KB。每一个 Socket 的接收缓 存区都在一个 16KB 的物理接收内存中,初始化分配为 2KB
W5500提供了SPI接口,最大支持80MHz速率,W5500支持SPI模式0和模式3。

3、配置使能W5500驱动

添加wizchip_conf.c,w5500.c和socket.c到工程中。打开wizchip_conf.H,找到_WIZCHIP_宏定义,修改如下:

 #ifndef _WIZCHIP_
   // NOTE_LIHAN: Some sections of this code are not yet fully defined.
   #define _WIZCHIP_                      W5500   // W5100, W5100S, W5200, W5300, W5500, 6300
     //将_WIZCHIP_宏设置为W5500,2025年5月15日修改
 #endif

4、添加SPI1驱动程序

//函数功能:
//初始化SPI1_SCL为PA5,SPI1_MISO为PA6,SPI1_MOSI为PA7,SPI1_CS为PA3;
//设置SPI1的工作模式

void W5500_SPI_Init(void)
{
    GPIO_InitTypeDef     GPIO_InitStructure;
    SPI_InitTypeDef   SPI_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA的外设时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);  //使能SPI1的外设时钟

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;         //选择PIN5,是SPI1的SCL
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;      //选择引脚为复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置引脚的最高工作速率为50MHz
  GPIO_Init(GPIOA, &GPIO_InitStructure);  //根据GPIO_InitStructure结构指针所指向的参数配置PA5引脚    

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;         //选择PIN6,是SPI1的MISO
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;      //选择引脚为输入悬浮
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置引脚的最高工作速率为50MHz
  GPIO_Init(GPIOA, &GPIO_InitStructure);  //根据GPIO_InitStructure结构指针所指向的参数配置PA6引脚

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;         //选择PIN7,是SPI1的MOSI
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;      //选择引脚为复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置引脚的最高工作速率为50MHz
  GPIO_Init(GPIOA, &GPIO_InitStructure);  //根据GPIO_InitStructure结构指针所指向的参数配置PA7引脚

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;         //选择PIN3,是W5500的片选脚CS
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //选择引脚为推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置引脚的最高工作速率为50MHz
  GPIO_Init(GPIOA, &GPIO_InitStructure);  //根据GPIO_InitStructure结构指针所指向的参数配置PA3引脚

//设置SPI1的工作模式
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    //SPI设置为双线双向全双工
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;     //设置为主SPI
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI发送接收为8位帧结构
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;        //设置SCK空闲时钟为低电平
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;      //数据捕获于第1个时钟沿
    //SCK空闲时钟为低电平,数据捕获于第1个时钟沿,这样就设置了SPI从机在下降沿采集数据了
    //SPI从机在下降沿采集数据,这要求CPU必须在SCK上升沿输出位值,在SCK为高电平时达到稳定,为数据采集做好准备
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;  //设置NSS输出由SSI位控制
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
    //设置波特率预分频值为2
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;  //设置数据传输先从MSB位开始
  SPI_InitStructure.SPI_CRCPolynomial = 7;            //使用CRC7校验
  SPI_Init(SPI1, &SPI_InitStructure);

  SPI_Cmd(SPI1, ENABLE); //使能SPI外设
}

#define    W5500_CS_high()   GPIO_SetBits(GPIOA,GPIO_Pin_4)   //W5500片选引脚
#define    W5500_CS_low()    GPIO_ResetBits(GPIOA,GPIO_Pin_4) //W5500片选引脚

//函数功能:选择W5500
void SPI_CS_Select(void)
{
    W5500_CS_low();
}

//函数功能:不选择W5500
void SPI_CS_Deselect(void)
{
    W5500_CS_high();
}

//函数功能:从W5500读取一个字节
uint8_t SPI_ReadByte(void)
{
    uint8_t byte;

    byte=SPI_I2S_ReceiveData(SPI1);//虚读一次
    SPI_I2S_SendData(SPI1,0x00);//通过外设SPI1发送0x00为的是发送8个移位时钟
    while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
    //检查SPI1标志位,是否设置"发送缓存空标志位",等待数据寄存器空
    byte=SPI_I2S_ReceiveData(SPI1);//读取1个字节数据

    return byte;
}

//函数功能:将byte发送给W5500
void SPI_WriteByte(uint8_t byte)
{
    SPI_I2S_SendData(SPI1,byte);//通过外设SPI1发送一个数据
    while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
    //检查SPI1标志位,是否设置"发送缓存空标志位",等待数据寄存器空
}

//函数功能:关闭总中断
void SPI_CrisEnter(void)
{
    __set_PRIMASK(1);//关闭总中断
}

//函数功能:使能总中断
void SPI_CrisExit(void)
{
    __set_PRIMASK(0);//开放总中断
}

5、TCP客户端应用程序W5500_HD_Driver.c

#include "W5500_HD_Driver.h"		
#include "stdio.h"  //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()
#include "socket.h"	// Just include one header for WIZCHIP
#include "SPI1.h"

//下载地址: https://gitcode.com/gh_mirrors/io/ioLibrary_Driver?utm_source=csdn_github_accelerator&isLogin=1
//W5500的网络参数
//本地物理地址:00 08 DC 11 11 11
//本地IP地址:192.168.1.199
//本地子网掩码:	255.255.255.0
//本地网关:192.168.1.1
//DNS服务器IP地址:8.8.8.8
//通过手动配置静态IP地址,Static IP configuration by manually.
wiz_NetInfo gWIZNETINFO = { {0x00, 0x08, 0xdc,0x11, 0x11, 0x11},
                            {192, 168, 1, 199},
                            {255,255,255,0},
                            {192, 168, 1, 1},
                            {8,8,8,8},
                            NETINFO_STATIC };

//端口0的网络参数
uint16_t LocalPort0=5000;	               //端口0的本地端口号(5000)
uint8_t  DstIP_Port0[4]={192,168,1,190}; //端口0的远程IP地址:192.168.1.190
uint16_t DstPort_Port0=6000;             //端口0的远程端口号:6000

uint8_t gDATABUF[DATA_BUF_SIZE];//STM32接收/发送W5500的数据缓冲区

void W5500_Initialization(void);

//函数功能:装载W5500的本地网络参数和端口0的网络参数
void W5500_Load_Net_Parameters(void)
{
//本地物理地址:00 08 DC 11 11 11
	gWIZNETINFO.mac[0]=0x00;
	gWIZNETINFO.mac[1]=0x08;
	gWIZNETINFO.mac[2]=0xdc;
	gWIZNETINFO.mac[3]=0x11;
	gWIZNETINFO.mac[4]=0x11;
	gWIZNETINFO.mac[5]=0x11;

//本地IP地址:192.168.1.199
	gWIZNETINFO.ip[0]=192;
	gWIZNETINFO.ip[1]=168;
	gWIZNETINFO.ip[2]=1;
	gWIZNETINFO.ip[3]=199;

//本地子网掩码:	255.255.255.0
	gWIZNETINFO.sn[0]=255;
	gWIZNETINFO.sn[1]=255;
	gWIZNETINFO.sn[2]=255;
	gWIZNETINFO.sn[3]=0;

//本地网关:192.168.1.1
  gWIZNETINFO.gw[0]=192;
	gWIZNETINFO.gw[1]=168;
	gWIZNETINFO.gw[2]=1;
	gWIZNETINFO.gw[3]=1;

//DNS服务器IP地址:8.8.8.8
  gWIZNETINFO.dns[0]=8;
	gWIZNETINFO.dns[1]=8;
	gWIZNETINFO.dns[2]=8;
	gWIZNETINFO.dns[3]=8;

//DHCP模式
  gWIZNETINFO.dhcp=NETINFO_STATIC;
	//告诉ioLibrary库,当前使用"静态IP地址"配置
	//通过手动配置静态IP地址,Static IP configuration by manually.

//端口0的本地端口号
	LocalPort0=5000;

//端口0的远程IP地址:192.168.1.190
  DstIP_Port0[0]=192;
	DstIP_Port0[1]=168;
	DstIP_Port0[2]=1;
	DstIP_Port0[3]=190;

//端口0的远程端口号
  DstPort_Port0=6000;
}

/**
  * @brief  Intialize the network information to be used in WIZCHIP
  * @retval None
  */
//函数功能:设置本地网络参数:MAC地址,GW网关,SN子网掩码,本地IP地址,DNS服务器IP地址,DHCP
void network_init(void)
{
  uint8_t tmpstr[6];
	ctlnetwork(CN_SET_NETINFO, (void*)&gWIZNETINFO);
	//设置本地网络参数:MAC地址,GW网关,SN子网掩码,本地IP地址,DNS服务器IP地址,DHCP
	//设置MAC地址,将gWIZNETINFO.mac写入W5500;
	//设置网关,将gWIZNETINFO.gw写入W5500;
	//设置子网掩码,将gWIZNETINFO.sn写入W5500
	//设置本地IP地址,将gWIZNETINFO.ip写入W5500
	//将gWIZNETINFO.dns[]拷贝到_DNS_[]中
	//将gWIZNETINFO.dhcp保存到_DHCP_中

	ctlnetwork(CN_GET_NETINFO, (void*)&gWIZNETINFO);
	//读本地网络参数:MAC地址,GW网关,SN子网掩码,本地IP地址,DNS服务器IP地址,DHCP
	//读MAC地址,保存到gWIZNETINFO.mac
	//读网关,保存到gWIZNETINFO.gw
	//读子网掩码,保存到gWIZNETINFO.sn
	//读本地IP地址,保存到gWIZNETINFO.ip
	//将_DNS_[]拷贝到gWIZNETINFO.dns[]中
	//将_DHCP_保存到gWIZNETINFO.dhcp中

	ctlwizchip(CW_GET_ID,(void*)tmpstr);
	//读W5500的ID,保存到tmpstr[6]中,"W5500\0",这是ioLibrary驱动定义的ID;
	//在wizchip_conf.h中定义_WIZCHIP_ID_为"W5500\0"

	printf("\r\n=== %s NET CONF ===\r\n",(char*)tmpstr);
	//串口输出W5500的ID

	printf("MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n",gWIZNETINFO.mac[0],gWIZNETINFO.mac[1],gWIZNETINFO.mac[2],
	gWIZNETINFO.mac[3],gWIZNETINFO.mac[4],gWIZNETINFO.mac[5]);//串口输出W5500的MAC地址

	printf("SIP: %d.%d.%d.%d\r\n", gWIZNETINFO.ip[0],gWIZNETINFO.ip[1],gWIZNETINFO.ip[2],gWIZNETINFO.ip[3]);
	//串口输出W5500的IP地址

	printf("GAR: %d.%d.%d.%d\r\n", gWIZNETINFO.gw[0],gWIZNETINFO.gw[1],gWIZNETINFO.gw[2],gWIZNETINFO.gw[3]);
	//串口输出W5500的网关地址

	printf("SUB: %d.%d.%d.%d\r\n", gWIZNETINFO.sn[0],gWIZNETINFO.sn[1],gWIZNETINFO.sn[2],gWIZNETINFO.sn[3]);
	//串口输出W5500的子网掩码

	printf("DNS: %d.%d.%d.%d\r\n", gWIZNETINFO.dns[0],gWIZNETINFO.dns[1],gWIZNETINFO.dns[2],gWIZNETINFO.dns[3]);
	//串口输出W5500的DNS服务器IP地址
	printf("======================\r\n");
}

//函数功能:
//1.初始化SPI接口
//2.注册相关函数
//3.设置W5500每个端口的发送缓冲区和接收缓冲区的大小均为2K字节
//4.等待"以太网"连接完成
//5.装载本地网络参数
//6.设置本地网络参数:MAC地址,GW网关,SN子网掩码,本地IP地址,DNS服务器IP地址,DHCP
void W5500_Initialization(void)
{
	uint8_t memsize[2][8] = {{2,2,2,2,2,2,2,2},{2,2,2,2,2,2,2,2}};
	//W5500发送和接收各有8个端口,这里定义每个端口的发送缓冲区和接收缓冲区的大小均为2K字节
	uint8_t tmp;

	W5500_SPI_Init();   //W5500 SPI初始化配置

	reg_wizchip_cris_cbfunc(SPI_CrisEnter, SPI_CrisExit);	//注册临界区函数
	reg_wizchip_cs_cbfunc(SPI_CS_Select, SPI_CS_Deselect);//注册SPI片选信号函数
	reg_wizchip_spi_cbfunc(SPI_ReadByte, SPI_WriteByte);	//注册读写函数

	if(ctlwizchip(CW_INIT_WIZCHIP,(void*)memsize) == -1)
	{//W5500发送和接收各有8个端口,这里初始化每个端口的发送缓冲区和接收缓冲区的大小均为2K字节
		 printf("WIZCHIP Initialized fail.\r\n");
	}

	//等待"以太网"连接完成, PHY link status check
	do{
		 if(ctlwizchip(CW_GET_PHYLINK, (void*)&tmp) == -1)
		 {//读PHYCFGR寄存器bit0,若为1,则表示网络已经连接
				printf("Unknown PHY Link stauts.\r\n");
		 }
	}while(tmp == PHY_LINK_OFF);

	W5500_Load_Net_Parameters();//装载W5500的本地网络参数和端口0的网络参数
	network_init();//设置本地网络参数:MAC地址,GW网关,SN子网掩码,本地IP地址,DNS服务器IP地址,DHCP
}

//函数功能:端口0发送"I am W5500\r\n"
void SOCKET0_Send_Data(void)
{
	char buf[20];
	uint16_t len=0;

	memset(gDATABUF,'\0',sizeof(gDATABUF));
	strcpy(buf,"I am W5500\r\n");strcat((char*)gDATABUF,buf);
	len=strlen( (char*)gDATABUF );
	send(SOCK_TCPS,gDATABUF,len);//发送数据
}

void SOCKET0_Work(void)
{
	uint16_t len=0;

	switch(getSn_SR(SOCK_TCPS))//获取W5500端口0的状态寄存器
	{
		case SOCK_INIT://W5500端口0已经初始化
			connect(SOCK_TCPS,DstIP_Port0,DstPort_Port0);
		  //将W5500端口0连接到远程IP地址DstIP_Port0和远程端口DstPort_Port0上
		  break;

		case SOCK_ESTABLISHED://W5500端口0已经连接成功
			if(getSn_IR(SOCK_TCPS) & Sn_IR_CON)
			{//读端口0的Sn_IR中断标志寄存器的bit0
				setSn_IR(SOCK_TCPS, Sn_IR_CON);//回写清除中断标志
			}

			len=getSn_RX_RSR(SOCK_TCPS);
			//读端口0接收缓冲区的数据长度
			if(len)
			{
				recv(SOCK_TCPS,gDATABUF,len);//读"W5500端口0"的数据,长度为len个字节,保存到gDATABUF
				printf("%s\r\n",gDATABUF);
				send(SOCK_TCPS,gDATABUF,len);//将gDATABUF的前len个字节通过"W5500端口0"发送出去
			}
            SOCKET0_Send_Data();
			break;

		case SOCK_CLOSE_WAIT://W5500端口0处于等待关闭状态
			disconnect(SOCK_TCPS);//关闭端口0的连接
		  break;

		case SOCK_CLOSED://W5500端口0处于关闭状态
			socket(SOCK_TCPS,Sn_MR_TCP,LocalPort0,0x00);//打开Socket0,打开一个本地端口
		  break;
	}
}

6、TCP客户端应用程序W5500_HD_Driver.h头文件

#ifndef	_W5500_HD_Driver_H_
#define	_W5500_HD_Driver_H_

#include "stm32f10x.h"//使能uint8_t,uint16_t,uint32_t,uint64_t,int8_t,int16_t,int32_t,int64_t
#include "wizchip_conf.h"

extern wiz_NetInfo gWIZNETINFO;//W5500的网络参数

#define SOCK_TCPS        0     //端口0
extern uint16_t LocalPort0;	   //端口0的端口号
extern uint8_t DstIP_Port0[4]; //端口0的远程IP地址
extern uint16_t	DstPort_Port0; //端口0的远程端口号

#define DATA_BUF_SIZE   2048
extern uint8_t gDATABUF[DATA_BUF_SIZE];

#define	W5500_CS_high()   GPIO_SetBits(GPIOA,GPIO_Pin_4)   //W5500片选引脚
#define	W5500_CS_low()    GPIO_ResetBits(GPIOA,GPIO_Pin_4) //W5500片选引脚

extern void W5500_Initialization(void);
extern void SOCKET0_Work(void);
#endif

7、main.c程序

#include "stm32f10x.h"//使能uint8_t,uint16_t,uint32_t,uint64_t,int8_t,int16_t,int32_t,int64_t
#include "stdio.h"  //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()
#include "string.h" //使能strcpy(),strlen(),memset()
#include "delay.h"
#include "USART4.h"

#include "LED.h"
#include "W5500_HD_Driver.h"

//#include "W5500_Variable.h"

const char CPU_Reset_REG[]="\r\nCPU reset!\r\n";
int main(void)
{
	
//	SCB->VTOR = 0x8000000;//中断向量表重定义

//	SystemInit();
	delay_init();//延时函数初始化
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
	USART4_Serial_Interface_Enable(115200);
	printf("%s",CPU_Reset_REG);//调试串口输出"\r\nCPU reset!\r\n"

	W5500_Initialization();
  //1.初始化SPI接口
  //2.注册相关函数
  //3.设置W5500每个端口的发送缓冲区和接收缓冲区的大小均为2K字节
  //4.等待"以太网"连接完成
  //5.装载本地网络参数
  //6.设置本地网络参数:MAC地址,GW网关,SN子网掩码,本地IP地址,DNS服务器IP地址,DHCP

  LED_Init();
	LED0_ON();

	while(1)
	{
		LED0=!LED0;
		delay_ms(1000);
		SOCKET0_Work();//W5500端口0工作
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2379375.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

组态王|如何创建组态王工程?

哈喽,你好啊,我是雷工! 组态王是比较普及的组态软件之一,大部分工控人应该都接触过组态王软件, 最近有个用组态王软件开发上位机,对设备进行集中控制的项目,边开发,顺便记录一些使用方法。 本篇从基础的如何创建组态王工程开始记录,以下为操作笔记。 1 、首先在工程…

mysql数据库-3(备份和恢复)

1. 冷备份和还原的实现 简介:冷备份定义是 读、写操作均不可进行,数据库停止服务 (超级简单) 冷备份 需求 对 10.0.0.13 主机实现冷备操作 关闭 10.0.0.13 主机的服务(ubuntu系统为例) 10.0.0.12为远程主机 systemctl stop mysql.service 备份数据 mkdir /data/…

估分啦~全国青少年信息素养大赛部分赛项已考完~图形化/算法创意实践

2025年全国青少年信息素养大赛-图形化编程挑战赛-小低组真题试卷 全国青少年信息素养大赛,图形化编程和算法创意实践挑战赛已考完,各位可以去题库重新做做下,复盘下,为更好的自己努力~ 配有答案和解析哦~ 2025年全国青少年信息素…

【Linux服务器】-虚拟机安装(CentOS7.9)

【Linux服务器】-虚拟机安装(CentOS7.9) 需提前准备好环境安装1. 创建新的虚拟机2. 选择默认配置,下一步3. 选择稍后指定操作系统,下一步4. 选择linux操作系统,并选择CentOS 7 64位 ,下一步5. 分配磁盘空间…

2025年渗透测试面试题总结-百度面经(题目+回答)

网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 百度面经 百度安全工程师面试深度复盘与优化指南 一、项目经验反思与优化策略 二、技术问题深度解析 …

分别用 语言模型雏形N-Gram 和 文本表示BoW词袋 来实现文本情绪分类

语言模型的雏形 N-Gram 和简单文本表示 Bag-of-Words 语言表示模型简介 (1) Bag-of-Words (BoW) 是什么? *定义:将文本表示为词频向量,忽略词序和语法,仅记录每个词的出现次数。 **示例: 句子1:I love …

C#.NET 或 VB.NET Windows 窗体中的 DataGridView – 技巧、窍门和常见问题

DataGridView 控件是一个 Windows 窗体控件,它允许您自定义和编辑表格数据。它提供了许多属性、方法和事件来自定义其外观和行为。在本文中,我们将讨论一些常见问题及其解决方案。这些问题来自各种来源,包括一些新闻组、MSDN 网站以及一些由我…

PyTorch音频处理技术及应用研究:从特征提取到相似度分析

文章目录 音频处理技术及应用音频处理技术音视频摘要技术音频识别及应用 梅尔频率倒谱系数音频特征尔频率倒谱系数简介及参数提取过程音频处理快速傅里叶变换(FFT)能量谱处理离散余弦转换 练习案例:音频建模加载音频数据源波形变换的类型绘制波形频谱图波形Mu-Law 编…

VSTO(C#)Excel开发进阶2:操作图片 改变大小 滚动到可视区

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。 源码指引:github源码指引_初级代码游戏的博客-CSDN博客 入…

多用途商务,电子产品发布,科技架构,智能手表交互等发布PPT模版20套一组分享

产品发布类PPT模版20套一组:产品发布PPT模版https://pan.quark.cn/s/25c8517b0be3 第一套PPT模版是一个总结用的PPT封面,背景浅灰色,有绿色叶片和花朵装饰,深绿色标题,多个适用场景和占位符。突出其清新自然的设计和商…

WindowsPE文件格式入门11.资源表

https://www.bpsend.net/thread-411-1-1.html 资源表 资源的管理方式采用windows资源管理器目录的管理方式,一般有三层目录。根目录 结构体IMAGE_RESOURCE_DIRECTORY:描述名称资源和ID资源各自的数量,不描述文件。资源本质都是二进制数据&…

C语言标准I/O与Linux系统调用的文件操作

01. 标准库函数与系统调用对比 系统调用标准I/O库open/read/write/closefopen/fread/fwrite/fclose文件描述符(fd)文件指针(FILE*)无缓冲&#xff0c;直接系统调用自动缓冲管理每次操作触发系统调用减少系统调用次数<fcntl.h> <unistd.h><stdio.h> 系统调用…

【MYSQL】笔记

&#x1f4da; 博主的专栏 &#x1f427; Linux | &#x1f5a5;️ C | &#x1f4ca; 数据结构 | &#x1f4a1;C 算法 | &#x1f152; C 语言 | &#x1f310; 计算机网络 在ubuntu中&#xff0c;改配置文件&#xff1a; sudo nano /etc/mysql/mysql.conf.d/mysq…

线程池核心线程永续机制:从源码到实战的深度解析

简介 源管理的基石,其核心线程为何不会超时销毁一直是开发者关注的焦点。核心线程的永续机制不仅确保了系统的稳定响应,还避免了频繁创建和销毁线程带来的性能损耗。本文将从源码层面深入剖析线程池核心线程的存活原理,同时结合企业级实战案例,展示如何正确配置和管理线程…

DS新论文解读(2)

上一章忘了说论文名字了&#xff0c;是上图这个名字 我们继续&#xff0c;上一章阅读地址&#xff1a; dsv3新论文解读&#xff08;1&#xff09; 这论文剩下部分值得说的我觉得主要就是他们Infra通信的设计 先看一个图 这个是一个标准的h800 8卡with 8cx7 nic的图&#xf…

html文件cdn一键下载并替换

业务场景&#xff1a; AI生成的html文件&#xff0c;通常会使用多个cdn资源、手动替换or下载太过麻烦、如下py程序为此而生&#xff0c;指定html目录自动下载并替换~ import os import requests from bs4 import BeautifulSoup from urllib.parse import urlparse import has…

【ROS2】 核心概念6——通信接口语法(Interfaces)

古月21讲/2.6_通信接口 官方文档&#xff1a;Interfaces — ROS 2 Documentation: Humble documentation 官方接口代码实战&#xff1a;https://docs.ros.org/en/humble/Tutorials/Beginner-Client-Libraries/Single-Package-Define-And-Use-Interface.html ROS 2使用简化的描…

matlab官方免费下载安装超详细教程2025最新matlab安装教程(MATLAB R2024b)

文章目录 准备工作MATLAB R2024b 安装包获取详细安装步骤1. 文件准备2. 启动安装程序3. 配置安装选项4. 选择许可证文件5. 设置安装位置6. 选择组件7. 开始安装8. 完成辅助设置 常见问题解决启动失败问题 结语 准备工作 本教程将帮助你快速掌握MATLAB R2024b的安装技巧&#x…

【运营商查询】批量手机号码归属地和手机运营商高速查询分类,按省份城市,按运营商移动联通电信快速分类导出Excel表格,基于WPF的实现方案

WPF手机号码归属地批量查询与分类导出方案 应用场景 ​​市场营销​​&#xff1a;企业根据手机号码归属地进行精准营销&#xff0c;按城市或省份分类制定针对性推广策略​​客户管理​​&#xff1a;快速对客户手机号码进行归属地分类&#xff0c;便于后续客户关系管理​​数…

ctf 基础

一、软件安装和基本的网站&#xff1a; 网安招聘网站 xss跨站脚本攻击 逆向&#xff1a;可以理解为游戏里的外挂 pwn最难的题目 密码学&#xff1a; 1、编码&#xff1a;base64 2、加密&#xff1a;凯撒 3、摘要&#xff1a;MD5、SHA1、SHA2 调查取证&#xff1a;杂项&am…