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客…...
2025B难题练习
1.启动多任务排序 拓扑排序 每次选入度为0的点 对每次选的点进行排序 package mainimport ("bufio""fmt""os""slices""strings" )func main() {scanner : bufio.NewScanner(os.Stdin)scanner.Scan()text : scanner.Text()…...
20250517让NanoPi NEO core开发板在Ubuntu core16.04.2下支持TF卡的热插拔
20250517让NanoPi NEO core开发板在Ubuntu core16.04.2下支持TF卡的热插拔 2025/5/17 17:52 缘起:实测NanoPi NEO core开发板上电之后,后插入的TF卡不认/不支持热插拔。 Ubuntu core16.04.2 Ubuntu core20.04 Ubuntu core16.04.3 用NanoPi NEO core开发板…...
Vue百日学习计划Day19-20天详细计划-Gemini版
重要提示: 番茄时钟: 每个番茄钟为25分钟学习,之后休息5分钟。每完成4个番茄钟,进行一次15-30分钟的长休息。动手实践: DevTools 的使用和 Git 命令的掌握都需要大量的实际操作。请务必边学边练。环境准备:…...
Uniapp、Flutter 和 React Native 全面对比
文章目录 前言Uni-app、Flutter 和 React Native 跨平台框架对比报告1. 性能对比2. 跨平台能力3. 学习曲线4. 社区生态与第三方库5. 原生能力扩展6. UI 渲染能力7. 企业支持与典型使用场景8. 开发效率与工具链 前言 将对 Uniapp、Flutter 和 React Native 进行全面对比&#x…...
【Linux笔记】——线程互斥与互斥锁的封装
🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:Linux 🌹往期回顾🌹:【Linux笔记】——Linux线程封装 🔖流水不争,争的是滔滔不息 一、线程互斥的概念二、互…...
Linux面试题集合(4)
现有压缩文件:a.tar.gz存在于etc目录,如何解压到data目录 tar -zxvf /etc/a.tar.gz -C /data 给admin.txt创建一个软链接 ln -s admin.txt adminl 查找etc目录下以vilinux开头的文件 find /etc -name vilinux* 查找admin目录下以test开头的文件 find admin -name te…...
Java二叉树题目练习
Java二叉题目练习 相同的树对称二叉树平衡二叉树二叉树的最近公共祖先二叉树的层序遍历二叉树层序遍历 ||二叉树遍历 相同的树 二叉树的题目大多数时候就可以采用递归的方法写 因为二叉树是由根左子树和右子树组成,每一棵左子树和右子树又可以被看成一颗完整的树&am…...
WORD个人简历单页326款模版分享下载
WORD个人简历模版下载:WORD个人简历模版https://pan.quark.cn/s/7e79a822c490...
Linux容器技术详解
容器技术基础 什么是容器 容器是一种轻量级的虚拟化技术,它将应用程序及其依赖(库、二进制文件、配置文件等)打包在一个独立的单元中,可以在任何支持容器运行时的环境中一致地运行。 Docker官网:https://www.docker…...
显卡、Cuda和pytorch兼容问题
这里写目录标题 驱动与CUDA版本兼容性问题1. **驱动与CUDA版本兼容性问题**2. **任务特性与硬件适配差异**3. **优化策略与框架配置差异**4. **散热与功耗限制**5. **数据传输与CPU瓶颈**排查建议总结 查询PyTorch中实际使用的CUDA版本**1. 查询PyTorch中实际使用的CUDA版本***…...
仅需三张照片即可生成沉浸式3D购物体验?谷歌电商3D方案全解析
随着消费者对线上购物体验的要求不断提高,传统2D图片已难以满足用户“真实感知商品”的需求。尤其在鞋类、家具、服装等高决策成本的商品上,缺乏空间感和交互性的购物方式成为转化率瓶颈。 谷歌敏锐地捕捉到这一趋势,早在2022年起便开始探索通过生成式AI技术实现“低成本、…...
PIC16F877A LCD1602 DHT11 温湿度读取显示代码 MPLAB
#include <xc.h> #include <stdio.h> #include <stdlib.h> #...
PIC16F18877 的主时钟 设置方法
#include <xc.h>// ========== 配置位设置 ========== // #pragma config FEXTOSC = OFF // 使用内部振荡器 #pragma...
西门子 Teamcenter13 Eclipse RCP 开发 1.3 工具栏 单选按钮
西门子 Teamcenter13 Eclipse RCP 开发 1.3 工具栏 单选按钮 1 配置文件2 插件控制3 命令框架 位置locationURI备注菜单栏menu:org.eclipse.ui.main.menu添加到传统菜单工具栏toolbar:org.eclipse.ui.main.toolbar添加到工具栏 style 值含义显示效果push普通按钮(默…...
asp.net core api RESTful 风格控制器
在 ASP.NET Core API 中,遵循 RESTful 风格的控制器一般具备以下几个关键特征: ✅ RESTful 风格控制器的命名规范 控制器命名 使用 复数名词,表示资源集合,如 ProductsController、UsersController。 路由风格 路由使用 [Rout…...
智能合约调用全景实战:前端 JS 与后端 Java 两种方式全面解析
目录 前言前端调用以太坊合约新建一个智能合约将合约部署到Hardhat本地链前端(HTML + JavaScript)调用合约后端调用以太坊合约生成java类调用智能合约(maven 插件方式)不生成Java类,通过合约ABI直接调用智能合约前后端调用方式对比开发建议结语前言 随着 Web3 的兴起,越…...
Javascript:WebAPI
获取网页元素 queryselector queryselector是 JavaScript 中用于选择 DOM 元素的重要方法,它允许使用 CSS 选择器语法来查找页面中的元素。 一般queryselector获取的元素都是html中第一个选择器的元素 支持选择器类型:类选择器(.class) ,…...
(4)python爬虫--JsonPath
文章目录 前言一、安装JsonPath库第一步: 打开pycharm第二步: 安装jsonpath 二、 jsonpath的基本使用2.1 基础语法2.2 语法测试2.2.1 准备json文件(store.json)2.2.2 jsonpath解析json语法 三、实战练习需求:爬取淘票票上所有的城市3.1 下载城市json文件3.2 解析城市…...
CentOS 上配置 Docker 使用 NVIDIA GPU
CentOS 上配置 Docker 使用 NVIDIA GPU(前提是已安装 NVIDIA 驱动): 在 CentOS 上配置 Docker 使用 NVIDIA GPU 本文介绍如何在已安装 NVIDIA 驱动的 CentOS 系统中,配置 Docker 使用 GPU 资源进行加速。 ✅ 前提条件 已安装 Cent…...
JAVA Spring MVC+Mybatis Spring MVC的工作流程*
目录 注解总结 将传送到客户端的数据转成json数据 **描述一下Spring MVC的工作流程** 1。属性赋值 BeanUtils.copyProperties(addUserDTO,user); 添加依赖: spring web、mybatis framework、mysql driver Controller和ResponseBody优化 直接改成RestControl…...
【人工智能】DeepSeek解码:揭秘AI大模型训练的创新密码
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 DeepSeek作为开源AI领域的先锋,以其高效、低成本的大模型训练技术震撼业界。本文深入剖析DeepSeek-V3和R1模型的训练密码,聚焦其创新的混…...
Java 方法向 Redis 里操作字符串有什么需要注意的?
在 Java 开发中,Redis 作为高性能的键值存储数据库,常被用于缓存数据、处理高并发场景等。当我们使用 Java 方法向 Redis 中操作字符串类型数据时,有许多关键要点需要格外注意。这些要点不仅关系到代码的正确性和性能,还影响着整个…...
C#与KepOPC通讯
使用C#连接KepOPC服务器进行数据读写的基础示例 using System; using Opc; using System.Threading;namespace KepOPCDemo {class Program{static void Main(string[] args){// OPC服务器连接参数string serverName "Kepware.KEPServerEX.V6"; // 根据实际安装的服…...
【软件测试】性能测试 —— 工具篇 LoadRunner 介绍与使用
🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 文章目录 1. LoadRunner 是什么?2. LoadRunner 安装前提:浏览器的选择 —— IE / 360极速浏览器…...
Linux面试题集合(6)
创建多级目录或者同级目录 mkdir -p 文件名/文件名/文件名 mkdir -p 文件名 文件名 文件名 Linux创建一个文件 touch 文件名 DOS命令创建文件 echo 内容>文件名(创建一个有内容的文件) echo >文件名(创建一个没有内容的文件)…...
技术测评:小型单文件加密工具的功能解析
最近在测试一款名为OEMexe的文件加密工具,发现它确实有一些独特之处值得分享。这款软件体积非常小巧,仅209KB,属于绿色单文件版程序,无需安装即可直接运行。 主要特点 多格式支持:能够处理多种常见文件格式࿰…...
06、基础入门-SpringBoot-依赖管理特性
06、基础入门-SpringBoot-依赖管理特性 Spring Boot 的依赖管理特性是其核心优势之一,极大地简化了项目的构建和维护过程。以下是其主要特点: ## 1. 父项目依赖管理 ### 1.1 继承 spring-boot-starter-parent 在 pom.xml 文件中,通过继承 spr…...
基于 Python 的界面程序复现:标准干涉槽型设计计算及仿真
基于 Python 的界面程序复现:标准干涉槽型设计计算及仿真 在工业设计与制造领域,刀具的设计与优化是提高生产效率和产品质量的关键环节之一。本文将介绍如何使用 Python 复现一个用于标准干涉槽型设计计算及仿真的界面程序,旨在帮助工程师和…...
我的创作纪念日——《惊变256天》
我的创作纪念日——《惊变256天》 机缘收获日常成就憧憬 最近,博主收到了 CSDN 发来的系统消息,这才惊觉,自上次第128天创作纪念日之后,竟又悄然走过了 128 天。站在 256 天这个颇具意义的里程碑前回望,博主在2023 年 …...
Linux 的 UDP 网络编程 -- 回显服务器,翻译服务器
目录 1. 回显服务器 -- echo server 1.1 相关函数介绍 1.1.1 socket() 1.1.2 bind() 1.1.3 recvfrom() 1.1.4 sendto() 1.1.5 inet_ntoa() 1.1.6 inet_addr() 1.2 Udp 服务端的封装 -- UdpServer.hpp 1.3 服务端代码 -- UdpServer.cc 1.4 客户端代码 -- UdpClient.…...
回溯法理论基础 LeetCode 77. 组合 LeetCode 216.组合总和III LeetCode 17.电话号码的字母组合
目录 回溯法理论基础 回溯法 回溯法的效率 用回溯法解决的问题 如何理解回溯法 回溯法模板 LeetCode 77. 组合 回溯算法的剪枝操作 LeetCode 216.组合总和III LeetCode 17.电话号码的字母组合 回溯法理论基础 回溯法 回溯法也可以叫做回溯搜索法,它是一…...
LeetCode --- 156双周赛
题目列表 3541. 找到频率最高的元音和辅音 3542. 将所有元素变为 0 的最少操作次数 3543. K 条边路径的最大边权和 3544. 子树反转和 一、找到频率最高的元音和辅音 分别统计元音和辅音的出现次数最大值,然后相加即可,代码如下 // C class Solution {…...
第五项修炼:打造学习型组织
最近一直接到的需求,都是公司董事长或总经理都特别推崇《第五项修炼:打造学习型组织》的内容,让各个层级的管理者都持续学习、应用、实践。我不禁开始反思,这背后到底隐藏着什么原因? 随着商业环境的变化和复杂性的增加…...
Bellman - Ford 算法与 SPFA 算法求解最短路径问题 ——从零开始的图论讲解(4)
目录 前言 为什么Dijkstra算法面对负权值图会有误差??? 举例说明 什么是Bellman -Ford算法? BF算法的核心思想 什么是松弛 为什么最多松弛N-1次? 代码实现 举例 初始状态(dist[] 数组) 第 1 轮松弛(遍历所有边) …...
Python训练营打卡 Day27
函数专题2:装饰器 知识点回顾: 装饰器的思想:进一步复用函数的装饰器写法注意内部函数的返回值 昨天我们接触到了函数大部分的功能,然后在你日常ctrl点进某个复杂的项目,发现函数上方有一个xxx,它就是装饰器 装饰器本质…...
初识计算机网络。计算机网络基本概念,分类,性能指标
初识计算机网络。计算机网络基本概念,分类,性能指标 本系列博客源自作者在大二期末复习计算机网络时所记录笔记,看的视频资料是B站湖科大教书匠的计算机网络微课堂,祝愿大家期末都能考一个好成绩! 视频链接地址 一、…...
5月16日day27打卡
函数专题2:装饰器 知识点回顾: 装饰器的思想:进一步复用函数的装饰器写法注意内部函数的返回值 作业: 编写一个装饰器 logger,在函数执行前后打印日志信息(如函数名、参数、返回值) logger def …...
【生成式AI文本生成实战】DeepSeek系列应用深度解析
目录 🌟 前言🏗️ 技术背景与价值🩹 当前技术痛点🛠️ 解决方案概述👥 目标读者说明 🧠 一、技术原理剖析📊 核心概念图解💡 核心作用讲解🔧 关键技术模块说明⚖️ 技术选…...
【Pandas】pandas DataFrame kurt
Pandas2.2 DataFrame Computations descriptive stats 方法描述DataFrame.abs()用于返回 DataFrame 中每个元素的绝对值DataFrame.all([axis, bool_only, skipna])用于判断 DataFrame 中是否所有元素在指定轴上都为 TrueDataFrame.any(*[, axis, bool_only, skipna])用于判断…...
2025年渗透测试面试题总结-安恒[实习]安全服务工程师(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 安恒[实习]安全服务工程师 1. SQLMap爆出当前库名的参数是什么? 2. Nmap探测系统的参数&am…...
在 Visual Studio Code (VSCode) 中配置 MCP(Model Context Protocol)
前提条件 安装 VSCode:确保已安装最新版本的 VSCode(建议使用 1.99 或以上版本,支持 MCP)。安装 GitHub Copilot 扩展:MCP 通常与 GitHub Copilot 的代理模式(Agent Mode)结合使用,…...
顶层架构 - 消息集群推送方案
一、推送基础概念简述 在即时通讯(IM)系统中,最基础的一件事就是“如何把消息推送给用户”。为了实现这个过程,我们要先了解两种常见的网络通信方式:HTTP 和 WebSocket。 1. HTTP 是什么? HTTP 就像一次性…...
C++性能测试工具——Vtune等的介绍
一、介绍 我们在前面的相关文章中对C性能的测试和分析工具(见“C性能测试工具gprof和gperftools基础”等)有一个初步的了解和应用,其实类似的相关工具还有不少。为了进一步的让开发者们掌握更多的相关性能测试分析相关的方法,对另…...
车道线检测----CLRKDNet
今天的最后一篇 车道线检测系列结束 CLRKDNet:通过知识蒸馏加速车道检测 摘要:道路车道是智能车辆视觉感知系统的重要组成部分,在安全导航中发挥着关键作用。在车道检测任务中,平衡精度与实时性能至关重要,但现有方法…...
【AI模型部署】
解决python引入huggingface_hub模块下载超时问题 背景问题解决 背景 AMD Ryzen™ AI处理器通过独特的NPUGPU异构架构,为AI工作负载提供强大的并行计算能力。本方案展示了如何将YOLOv8目标检测、RCAN超分辨率重建和Stable Diffusion文生图三类模型分别部署到NPU和GP…...
排序01:多目标模型
用户-笔记的交互 对于每篇笔记,系统记录曝光次数、点击次数、点赞次数、收藏次数、转发次数。 点击率点击次数/曝光次数 点赞率点赞次数/点击次数 收藏率收藏次数/点击次数 转发率转发次数/点击次数 转发是相对较少的,但是非常重要,例如转发…...
电子电器架构 --- Zonal架构正在开创汽车电子设计新时代
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...
如何阅读、学习 Tcc (Tiny C Compiler) 源代码?如何解析 Tcc 源代码?
阅读和解析 TCC(Tiny C Compiler) 的源代码需要对编译器的基本工作原理和代码结构有一定的了解。以下是分步骤的指南,帮助你更高效地学习和理解 TCC 的源代码: 1. 前置知识准备 C 语言基础:TCC 是用 C 语言编写的&…...
Java 泛型与类型擦除:为什么解析对象时能保留泛型信息?
引言:泛型的“魔术”与类型擦除的困境 在 Java 中,泛型为开发者提供了类型安全的集合操作,但其背后的**类型擦除(Type Erasure)**机制却常常让人困惑。你是否遇到过这样的场景? List<String> list …...