W5500使用ioLibrary库创建TCP客户端
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的远程端口号:6000uint8_t gDATABUF[DATA_BUF_SIZE];//STM32接收/发送W5500的数据缓冲区void W5500_Initialization(void);//函数功能:装载W5500的本地网络参数和端口0的网络参数
void W5500_Load_Net_Parameters(void)
{
//本地物理地址:00 08 DC 11 11 11gWIZNETINFO.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.199gWIZNETINFO.ip[0]=192;gWIZNETINFO.ip[1]=168;gWIZNETINFO.ip[2]=1;gWIZNETINFO.ip[3]=199;//本地子网掩码: 255.255.255.0gWIZNETINFO.sn[0]=255;gWIZNETINFO.sn[1]=255;gWIZNETINFO.sn[2]=255;gWIZNETINFO.sn[3]=0;//本地网关:192.168.1.1gWIZNETINFO.gw[0]=192;gWIZNETINFO.gw[1]=168;gWIZNETINFO.gw[2]=1;gWIZNETINFO.gw[3]=1;//DNS服务器IP地址:8.8.8.8gWIZNETINFO.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.190DstIP_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的IDprintf("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 checkdo{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中断标志寄存器的bit0setSn_IR(SOCK_TCPS, Sn_IR_CON);//回写清除中断标志}len=getSn_RX_RSR(SOCK_TCPS);//读端口0接收缓冲区的数据长度if(len){recv(SOCK_TCPS,gDATABUF,len);//读"W5500端口0"的数据,长度为len个字节,保存到gDATABUFprintf("%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);//设置系统中断优先级分组4USART4_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地址,DHCPLED_Init();LED0_ON();while(1){LED0=!LED0;delay_ms(1000);SOCKET0_Work();//W5500端口0工作}
}
相关文章:

W5500使用ioLibrary库创建TCP客户端
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客…...
SQL练习(12/81)
目录 1.找类别最高值 使用子查询 使用窗口函数(MySQL8.X支持) 扩展:查找类别前N高的值 2.删除重复值并保留最小序号 delete实现 筛选无重复且序号最小值 select——where in select——join&子查询 3.找带条件的连续值 窗口函数…...

组态王|如何创建组态王工程?
哈喽,你好啊,我是雷工! 组态王是比较普及的组态软件之一,大部分工控人应该都接触过组态王软件, 最近有个用组态王软件开发上位机,对设备进行集中控制的项目,边开发,顺便记录一些使用方法。 本篇从基础的如何创建组态王工程开始记录,以下为操作笔记。 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. 分配磁盘空间…...
鸿蒙OSUniApp 制作简洁高效的标签云组件#三方框架 #Uniapp
UniApp 制作简洁高效的标签云组件 在移动端应用中,标签云(Tag Cloud)是一种常见的UI组件,它以视觉化的方式展示关键词或分类,帮助用户快速浏览和选择感兴趣的内容。本文将详细讲解如何在UniApp框架中实现一个简洁高效的…...

2025年渗透测试面试题总结-百度面经(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 百度面经 百度安全工程师面试深度复盘与优化指南 一、项目经验反思与优化策略 二、技术问题深度解析 …...
java集合相关的api-总结
简介 集合是存储数据的容器,集合相关的API提供了不同的数据结构,来满足不同的需求。这里是对常见集合API的使用场景和相关源码的一个总结,在实际开发中,如果不知道该选择什么集合,这篇文章也许可以参考一下。 集合相…...
深入解析JVM字节码解释器执行流程(OpenJDK 17源码实现)
一、核心流程概述 JVM解释器的核心任务是将Java字节码逐条翻译为本地机器指令并执行。其执行流程可分为以下关键阶段: 方法调用入口构建:生成栈帧、处理参数、同步锁等。 字节码分派(Dispatch):根据字节码跳转到对应…...

分别用 语言模型雏形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 编…...
SHAP分析图的含义
1. 训练集预测结果对比图 表征含义: 展示模型在训练集上的预测值(红色曲线)与真实值(灰色曲线)的对比。通过曲线重合度可直观判断模型的拟合效果。标题中显示的RMSE(均方根误差)量化了预测值与…...

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封面,背景浅灰色,有绿色叶片和花朵装饰,深绿色标题,多个适用场景和占位符。突出其清新自然的设计和商…...
Java正则表达式:从基础到高级应用全解析
Java正则表达式应用与知识点详解 一、正则表达式基础概念 正则表达式(Regular Expression)是通过特定语法规则描述字符串模式的工具,常用于: 数据格式验证文本搜索与替换字符串分割模式匹配提取 Java通过java.util.regex包提供支持,核心类…...

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*)无缓冲,直接系统调用自动缓冲管理每次操作触发系统调用减少系统调用次数<fcntl.h> <unistd.h><stdio.h> 系统调用…...

【MYSQL】笔记
📚 博主的专栏 🐧 Linux | 🖥️ C | 📊 数据结构 | 💡C 算法 | 🅒 C 语言 | 🌐 计算机网络 在ubuntu中,改配置文件: sudo nano /etc/mysql/mysql.conf.d/mysq…...

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

DS新论文解读(2)
上一章忘了说论文名字了,是上图这个名字 我们继续,上一章阅读地址: dsv3新论文解读(1) 这论文剩下部分值得说的我觉得主要就是他们Infra通信的设计 先看一个图 这个是一个标准的h800 8卡with 8cx7 nic的图…...

html文件cdn一键下载并替换
业务场景: AI生成的html文件,通常会使用多个cdn资源、手动替换or下载太过麻烦、如下py程序为此而生,指定html目录自动下载并替换~ import os import requests from bs4 import BeautifulSoup from urllib.parse import urlparse import has…...
react路由中Suspense的介绍
好的,我们来详细解释一下这个 AppRouter 组件的代码。 这个组件是一个在现代 React 应用中非常常见的模式,特别是在使用 React Router v6 进行路由管理和结合代码分割(Code Splitting)来优化性能时。 JavaScript const AppRout…...

【ROS2】 核心概念6——通信接口语法(Interfaces)
古月21讲/2.6_通信接口 官方文档:Interfaces — ROS 2 Documentation: Humble documentation 官方接口代码实战: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手机号码归属地批量查询与分类导出方案 应用场景 市场营销:企业根据手机号码归属地进行精准营销,按城市或省份分类制定针对性推广策略客户管理:快速对客户手机号码进行归属地分类,便于后续客户关系管理数…...

ctf 基础
一、软件安装和基本的网站: 网安招聘网站 xss跨站脚本攻击 逆向:可以理解为游戏里的外挂 pwn最难的题目 密码学: 1、编码:base64 2、加密:凯撒 3、摘要:MD5、SHA1、SHA2 调查取证:杂项&am…...
掌握HTML文件上传:从基础到高级技巧
HTML中input标签的上传文件功能详解 一、基础概念 1. 文件上传的基本原理 在Web开发中,文件上传是指将本地计算机中的文件(如图片、文档、视频等)传输到服务器的过程。HTML中的<input type"file">标签是实现这一功能的基础…...
UE5无法编译问题解决
1. vs编译 2. 删除三个文件夹 参考...