当前位置: 首页 > news >正文

基于正点原子阿波罗F429开发板的LWIP应用(1)——网络ping通

说在开头

        正点原子F429开发板主芯片采用的是STM32F429IGT6,网络PHY芯片采用的是LAN8720A(V1)和YT8512C(V2),采用的是RMII连接,PHY_ADDR为0;在代码中将会对不同的芯片做出适配。

        CubeMX版本:6.6.1;

        F4芯片组Pack包版本:STM32Cube FW_F4 V1.27.0;

1、CubeMX配置过程

  • 打开System Core点击RCC使能外部高速时钟(25M晶振)和低速设置时钟(32.768K晶振);
  • 打开RTC:点击Timers——>RTC,勾选“Active ClockSource”,其余参数保持默认
  • 打开Clock Configuration设置系统时钟树:系统时钟拉满,设为180M(记得时钟树需要手动设置PLL来源是HSE、sSystem Clock来源是HSE经过PLL分频后的PLLCLK);将RTC的时钟源设为LSE(外部32.768K晶振);
  • 设置LED引脚,PB0和PB1都为GPIO_Output模式,默认输出低电平;
  • 使能串口1:点击Connectivity——>USART1,模式设置为Asynchronous,其余参数默认;
  • 使能I2C2:点击Connectivity——>I2C2,模式设置为I2C2,在下面的“Parameter Settings”将Primary slave address的值设为64(设置FC8574的地址是64),之后将I2C2的GPIO设置为PH4和PH5;
  • 使能ETH:点击Connectivity——>ETH,设置为RMII模式,在下面的“Parameter Settings”将Primary slave address的值设为1536;在旁边的“NVIC Settings”勾选“ETH global interrupt”;将ETH_TXD0和ETH_TXD1的引脚设为PG13和PG14;
  • 使能LWIP:点击Middleware——>LWIP,勾选Enable,在下面的“Platform Settings”将Driver PHY设为LAN8742,将BSP_COMPONENT_DRIVER也设为LAN8742;在下面的“Key Options”中找到“Network Interfaces Options”类,展开它的选项,将“LWIP_NETIF_HOSTNAME”设为Enable;
  • 进入Project Manager页面设置工程设置:工程名和保存地址自定义,设置IDE为MDK;然后进入Code Generator选项,先勾选只添加必要的库文件到工程、然后勾选“Generate peripheral initialization as a pair of ".c/h' fles per periphera”,其含义是生成的外设初始化代码是否要拆分成.c和.h文件;
  • 最后点击右上角的“GENENATE CODE”即可生成代码;

2、MDK代码修改

  • 修改MDK设置;
  • main.h添加头文件和宏定义;
    #include "stdio.h"
    #include "string.h"#define LAN8720A  0
    #define YT8512C   1extern uint8_t PHY_TYPE;#define YT8512C_PHYSCSR                 ((uint16_t)0x0011U)		
    #define YT8512C_PHYSCSR_AUTONEGO_DONE   ((uint16_t)0x0800U)
    #define YT8512C_PHYSCSR_HCDSPEEDMASK    ((uint16_t)0xE000U)
    #define YT8512C_PHYSCSR_10BT_HD         ((uint16_t)0x0000U)
    #define YT8512C_PHYSCSR_10BT_FD         ((uint16_t)0x2000U)
    #define YT8512C_PHYSCSR_100BTX_HD       ((uint16_t)0x4000U)
    #define YT8512C_PHYSCSR_100BTX_FD       ((uint16_t)0x6000U)
    #define YT8512C_PHYSCSR_1000BTX_HD      ((uint16_t)0x8000U)
    #define YT8512C_PHYSCSR_1000BTX_FD      ((uint16_t)0xA000U) 
  • usart.c添加串口重定向;
    int fputc(int ch, FILE *f)
    {//具体哪个串口可以更改huart1为其它串口HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1 , 0x0f);return ch;
    }
  • stm32f4xx_it.c添加程序运行指示灯LED;
    //stm32f4xx_it.c开头添加:static uint16_t led_count = 0;
    //SysTick_Handler函数中“ HAL_IncTick();”后添加以下代码:led_count++;if(led_count >= 250){led_count = 0;HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);//LED0翻转}
  • i2c.c增加PCF8574驱动代码;
    //i2c.c添加:
    void PCF8574_WriteBit(uint8_t IO_Num,uint8_t IO_Sta)
    {uint8_t IO_Sta_Get[2]={0};HAL_I2C_Master_Receive(&hi2c2, 0x40, IO_Sta_Get, 1, 1000);if(IO_Sta==0)//清零{IO_Sta_Get[0]=IO_Sta_Get[0]&(~(1<<IO_Num));}else{IO_Sta_Get[0]=IO_Sta_Get[0]|(1<<IO_Num);}HAL_I2C_Master_Transmit(&hi2c2, 0x40, IO_Sta_Get, 1, 1000);
    }uint8_t PCF8574_ReadBit(uint8_t IO_Num)
    {uint8_t IO_Sta_Get[2]={0};HAL_I2C_Master_Receive(&hi2c2, 0x40, IO_Sta_Get, 1, 1000);return IO_Sta_Get[0];
    }
    //i2c.h添加:
    void PCF8574_WriteBit(uint8_t IO_Num,uint8_t IO_Sta);
    uint8_t PCF8574_ReadBit(uint8_t IO_Num);
  • lan8742.c增加PHY芯片适配代码;
    //开头增加头文件:
    #include "main.h"//修改LAN8742_GetLinkState函数为如下内容:
    int32_t LAN8742_GetLinkState(lan8742_Object_t *pObj)
    {uint32_t readval = 0;/* Read Status register  */if(pObj->IO.ReadReg(pObj->DevAddr, LAN8742_BSR, &readval) < 0){return LAN8742_STATUS_READ_ERROR;}/* Read Status register again */if(pObj->IO.ReadReg(pObj->DevAddr, LAN8742_BSR, &readval) < 0){return LAN8742_STATUS_READ_ERROR;}if((readval & LAN8742_BSR_LINK_STATUS) == 0){/* Return Link Down status */return LAN8742_STATUS_LINK_DOWN;    }/* Check Auto negotiaition */if(pObj->IO.ReadReg(pObj->DevAddr, LAN8742_BCR, &readval) < 0){return LAN8742_STATUS_READ_ERROR;}/*判断BCR寄存器的第12位是否为1,1 开启自协商;0  关闭自协商*/if((readval & LAN8742_BCR_AUTONEGO_EN) != LAN8742_BCR_AUTONEGO_EN)//关闭{/*未开启自协商就读取BCR寄存器判断速率和双工状态:LAN8720A第13位,1:100M, 0 10M第8位,1:FULLDUPLEX, 0 HALFDUPLEXYT8512C:第6位+第13位:(0,1) 100M,(0,0)10M 第8位,1:FULLDUPLEX, 0 HALFDUPLEX*/if(PHY_TYPE == YT8512C){if((readval & 0x0040) == 0x0040) //只有在第6位为0时才可以通过判断第13位来判断状态{return LAN8742_STATUS_READ_ERROR;}}if(((readval & LAN8742_BCR_SPEED_SELECT) == LAN8742_BCR_SPEED_SELECT) && ((readval & LAN8742_BCR_DUPLEX_MODE) == LAN8742_BCR_DUPLEX_MODE)) {return LAN8742_STATUS_100MBITS_FULLDUPLEX;}else if ((readval & LAN8742_BCR_SPEED_SELECT) == LAN8742_BCR_SPEED_SELECT){return LAN8742_STATUS_100MBITS_HALFDUPLEX;}        else if ((readval & LAN8742_BCR_DUPLEX_MODE) == LAN8742_BCR_DUPLEX_MODE){return LAN8742_STATUS_10MBITS_FULLDUPLEX;}else{return LAN8742_STATUS_10MBITS_HALFDUPLEX;}  		}else /* Auto Nego enabled 开启自协商*/{/*开启自协商后读取SR寄存器判断速率和双工状态:LAN8720A(SR寄存器地址:0x1f):第12位:判断自协商状态,1 已完成自协商;0 未进行或未开启自协商第4到2位:001 = 10BASE-T half-duplex     ==0x0004101 = 10BASE-T full-duplex     ==0x0014010 = 100BASE-TX half-duplex   ==0x0008110 = 100BASE-TX full-duplex	 ==0x0018YT8512C(SR寄存器地址:0x11):--一定要在自协商结束后才有效第11位:判断自协商状态,1 已完成自协商;0 未进行或未开启自协商第15到13位:000 = 10BASE-T half-duplex     ==0x0000001 = 10BASE-T full-duplex     ==0x2000010 = 100BASE-TX half-duplex   ==0x4000011 = 100BASE-TX full-duplex	 ==0x6000100 = 1000BASE-TX half-duplex  ==0x8000101 = 1000BASE-TX full-duplex	 ==0xA000*/		if(PHY_TYPE == LAN8720A){if(pObj->IO.ReadReg(pObj->DevAddr, LAN8742_PHYSCSR, &readval) < 0){return LAN8742_STATUS_READ_ERROR;}/* Check if auto nego not done */if((readval & LAN8742_PHYSCSR_AUTONEGO_DONE) == 0){return LAN8742_STATUS_AUTONEGO_NOTDONE;}if((readval & LAN8742_PHYSCSR_HCDSPEEDMASK) == LAN8742_PHYSCSR_100BTX_FD){return LAN8742_STATUS_100MBITS_FULLDUPLEX;}else if ((readval & LAN8742_PHYSCSR_HCDSPEEDMASK) == LAN8742_PHYSCSR_100BTX_HD){return LAN8742_STATUS_100MBITS_HALFDUPLEX;}else if ((readval & LAN8742_PHYSCSR_HCDSPEEDMASK) == LAN8742_PHYSCSR_10BT_FD){return LAN8742_STATUS_10MBITS_FULLDUPLEX;}else{return LAN8742_STATUS_10MBITS_HALFDUPLEX;}}else if(PHY_TYPE == YT8512C){if(pObj->IO.ReadReg(pObj->DevAddr, YT8512C_PHYSCSR, &readval) < 0){return LAN8742_STATUS_READ_ERROR;}		/* Check if auto nego not done */if((readval & YT8512C_PHYSCSR_AUTONEGO_DONE) == 0){return LAN8742_STATUS_AUTONEGO_NOTDONE;}if((readval & YT8512C_PHYSCSR_HCDSPEEDMASK) == YT8512C_PHYSCSR_100BTX_FD){return LAN8742_STATUS_100MBITS_FULLDUPLEX;}else if ((readval & YT8512C_PHYSCSR_HCDSPEEDMASK) == YT8512C_PHYSCSR_100BTX_HD){return LAN8742_STATUS_100MBITS_HALFDUPLEX;}else if ((readval & YT8512C_PHYSCSR_HCDSPEEDMASK) == YT8512C_PHYSCSR_10BT_FD){return LAN8742_STATUS_10MBITS_FULLDUPLEX;}else if ((readval & YT8512C_PHYSCSR_HCDSPEEDMASK) == YT8512C_PHYSCSR_10BT_HD){return LAN8742_STATUS_10MBITS_HALFDUPLEX;}			}}return LAN8742_STATUS_READ_ERROR;
    }
  • lwip.c增加热插拔代码;
    //修改ethernet_link_status_updated函数为如下内容:
    static void ethernet_link_status_updated(struct netif *netif)
    {if (netif_is_up(netif)){
    /* USER CODE BEGIN 5 */netif_set_up(netif);
    #if(LWIP_DHCP == 1)		dhcp_start(netif);
    #endifprintf("网线插入\n");
    /* USER CODE END 5 */}else /* netif is down */{
    /* USER CODE BEGIN 6 */netif_set_down(netif);
    #if(LWIP_DHCP == 1)		dhcp_stop(netif);
    #endifprintf("网线拔出\n");
    /* USER CODE END 6 */}
    }
  • ethernetif.c增加开启自协商和PHY复位代码
    //low_level_init函数最后LAN8742_Init(&LAN8742);语句后添加开启自协商代码:
    LAN8742_StartAutoNego(&LAN8742);
    HAL_Delay(2000);//HAL_ETH_MspInit函数最后添加PHY识别和复位代码:
    #include "i2c.h"	uint32_t regval;
    HAL_ETH_ReadPHYRegister(&heth, 0, 2, &regval);if (regval && 0xFFF == 0xFFF)                           /* 旧板卡(LAN8720A)*/
    {PHY_TYPE = LAN8720A;PCF8574_WriteBit(7,1);                  /* 硬件复位 */HAL_Delay(100);PCF8574_WriteBit(7,0);                  /* 复位结束 */HAL_Delay(100);
    }
    else                                                    /* 新板卡(YT8512C) */
    {PHY_TYPE = YT8512C;PCF8574_WriteBit(7,0);                  /* 硬件复位 */HAL_Delay(100);PCF8574_WriteBit(7,1);                  /* 复位结束 */HAL_Delay(100);
    }	
  • main.c增加变量和业务代码;
    //main.c开头添加:
    extern struct netif gnetif;uint8_t PHY_TYPE = LAN8720A;//main函数while(1)前增加以下代码:
    #if(LWIP_DHCP == 1)while(gnetif.ip_addr.addr == 0){MX_LWIP_Process();}printf("DHCP succeed:%d.%d.%d.%d\n\n", ((gnetif.ip_addr.addr)&0x000000ff), (((gnetif.ip_addr.addr)&0x0000ff00)>>8), (((gnetif.ip_addr.addr)&0x00ff0000)>>16), ((gnetif.ip_addr.addr)&0xff000000)>>24);
    #endif//main函数while(1)中增加以下代码:MX_LWIP_Process();
    

修改完成后编译:0警告和0错误;

烧录后插入路由器中串口打印板子的IP地址,我这打印的是:DHCP succeed:192.168.1.251。(一定要插入路由器中,因为当前代码采用的是DHCP模式,下一篇将教大家如何在此代码的基础上加入静态IP代码)

本文对应的MDK工程和CubeMX工程如下:
 

相关文章:

基于正点原子阿波罗F429开发板的LWIP应用(1)——网络ping通

说在开头 正点原子F429开发板主芯片采用的是STM32F429IGT6&#xff0c;网络PHY芯片采用的是LAN8720A(V1)和YT8512C(V2)&#xff0c;采用的是RMII连接&#xff0c;PHY_ADDR为0&#xff1b;在代码中将会对不同的芯片做出适配。 CubeMX版本&#xff1a;6.6.1&#xff1b; F4芯片组…...

第 1 章:数字 I/O 与串口通信(GPIO UART)

本章目标: 掌握 GPIO 的硬件原理、寄存器配置与典型驱动框架 深入理解 UART/USART 的帧格式、波特率配置、中断与 DMA 驱动 通过实战案例,将 GPIO 与 UART 结合,实现 AT 命令式外设控制 章节结构 GPIO 概述与硬件原理 GPIO 驱动实现:寄存器、中断与去抖 UART/USART 原理与帧…...

MCU 温度采样理论(-ADC Temperature sensor)

温度传感器可以使用ADC来测量芯片温度。   为了准确测量运行时的芯片温度,请使用在生产过程中运行的参考测量值,此参考值与其他校准数据一起存放在SFlash中。 一、温度测量流程 1、ADC校准:关于偏移和增益调整的实例,见9.3。 2、检查CREFH和VREL:参见8.2。 3、设置参考…...

stm32week16

stm32学习 十一.中断 4.使用中断 EXTI的配置步骤&#xff1a; 使能GPIO时钟设置GPIO输入模式使能AFIO/SYSCFG时钟设置EXTI和IO对应关系设置EXTI屏蔽&#xff0c;上/下沿设置NVIC设计中断服务函数 HAL库的使用&#xff1a; 使能GPIO时钟&#xff1a;__HAL_RCC_GPIOx_CLK_EN…...

隨筆 20250519 基于MAUI Blazor整合SQLite数据库与Star打印机的详细步骤

以下是基于MAUI Blazor整合SQLite数据库与Star打印机的详细步骤&#xff0c;包含必要的NuGet包引入及核心代码实现&#xff1a; 零、目錄結構 ​​ 一、整合SQLite数据库​​ ​​1. 安装NuGet包​​ # SQLite核心库 Install-Package sqlite-net-pcl # SQLite平台适配库&am…...

电子电路原理第十六章(负反馈)

1927年8月,年轻的工程师哈罗德布莱克(Harold Black)从纽约斯塔顿岛坐渡轮去上班。为了打发时间,他粗略写下了关于一个新想法的几个方程式。后来又经过反复修改, 布莱克提交了这个创意的专利申请。起初这个全新的创意被认为像“永动机”一样愚蠢可笑,专利申请也遭到拒绝。但…...

推客小程序系统开发:全栈式技术解决方案与行业赋能实践​

​ 在数字化营销深度渗透各行业的当下&#xff0c;传统推广模式已难以满足企业精细化运营与高效获客的需求。专业的推客小程序系统凭借其强大的裂变传播能力与灵活的推广机制&#xff0c;成为企业构建私域流量池、提升推广效能的核心工具。我们基于多年技术沉淀与行业洞察&…...

【prometheus+Grafana篇】基于Prometheus+Grafana实现Oracle数据库的监控与可视化

&#x1f4ab;《博主主页》&#xff1a; &#x1f50e; CSDN主页 &#x1f50e; IF Club社区主页 &#x1f525;《擅长领域》&#xff1a;擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对SQLserver、NoSQL(MongoDB)有了…...

【Android构建系统】Soong构建系统,通过.bp + .go定制编译

背景介绍 本篇是一篇实操内容&#xff0c;是对【Android构建系统】如何在Camera Hal的Android.bp中选择性引用某个模块的优化与改进。本篇内容主要想通过一个具体例子介绍Soong构建系统较复杂的定制化方法和步骤&#xff0c;以便在今后的工作学习中更好的使用Soong构建系统。 …...

Qt开发:QUdpSocket的详解

文章目录 一、QUdpSocket 简介二、常用函数的介绍和使用三、接收端完整示例四、发送端完整示例 一、QUdpSocket 简介 在 Qt 中&#xff0c;UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是通过 QUdpSocket 类实现的。UDP 是一种无连接的、轻量…...

【android bluetooth 协议分析 01】【HCI 层介绍 9】【ReadLocalSupportedCommands命令介绍】

1. HCI_Read_Local_Supported_Commands 命令介绍 1. 命令介绍&#xff08;Description&#xff09; HCI_Read_Local_Supported_Commands 是 HCI 层中非常重要的查询命令。它允许 Host&#xff08;如 Android 系统中的 Bluetooth stack&#xff09;获取 Controller&#xff08;…...

Model 速通系列(一)nanoGPT

这个是新开的一个系列用来手把手复现一些模型工程&#xff0c;之所以开这个系列是因为有人留言说看到一个工程不知道从哪里读起&#xff0c;出于对自身能力的提升与兴趣&#xff0c;故新开了这个系列。由于主要动机是顺一遍代码并提供注释。 该系列第一篇博客是 nanoGPT &…...

星际争霸小程序:用Java实现策略模式的星际大战

在游戏开发的世界里&#xff0c;策略模式是一种非常实用的设计模式&#xff0c;它允许我们在运行时动态地选择算法或行为。今天&#xff0c;我将带你走进一场星际争霸的奇幻之旅&#xff0c;用Java实现一个简单的星际争霸小程序&#xff0c;通过策略模式来模拟不同种族单位的战…...

网络Tips20-007

网络威胁会导致非授权访问、信息泄露、数据被破坏等网络安全事件发生&#xff0c; 其常见的网络威胁包括窃听、拒绝服务、病毒、木马、( 数据完整性破坏 )等&#xff0c; 常见的网络安全防范措施包括访问控制、审计、身份认证、数字签名、( 数据加密 )、 包过滤和检测等。 AE…...

2.微服务-配置

引入springcloud的pom配置 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.12</version><relativePath/></parent> <dependencyManagemen…...

python实现pdf转图片(针对每一页)

from pdf2image import convert_from_path import ospdf_file rC:\Users\\Desktop\拆分\产权证.pdf poppler_path rC:\poppler-24.08.0\Library\bin # 这里改成你自己的路径output_dir rC:\Users\\Desktop\拆分\output_images os.makedirs(output_dir, exist_okTrue)image…...

Python编程从入门到实践 PDF 高清版

各位程序员朋友们&#xff0c;还在为找不到合适的Python学习资料而烦恼吗&#xff1f;还在为晦涩难懂的编程书籍而头疼吗&#xff1f;今天&#xff0c;就给大家带来一份重磅福利——237完整版PDF&#xff0c; 我用网盘分享了「Python编程&#xff1a;从入门到实践__超清版.pdf…...

CVE-2015-3934 Fiyo CMS SQL注入

CVE-2015-3934 Fiyo CMS SQL注入 页面抓登录数据包 构造延时注入语句在user处’%2B(select(0)from(select(sleep(5)))v)%2B’ 存在延时注入&#xff0c;使用脚本即可...

【Pandas】pandas DataFrame mode

Pandas2.2 DataFrame Computations descriptive stats 方法描述DataFrame.abs()用于返回 DataFrame 中每个元素的绝对值DataFrame.all([axis, bool_only, skipna])用于判断 DataFrame 中是否所有元素在指定轴上都为 TrueDataFrame.any(*[, axis, bool_only, skipna])用于判断…...

(思维题、贪心)洛谷 P11232 CSPS2024 超速检测 题解

这一题在 2024 将我击败&#xff0c;但我怎么现在才补题解 …… 题意 原题 思路 对于每一辆车&#xff0c;我们可以算出&#xff0c;其在距离左端点哪段位置会超速 [ l , r ] [l,r] [l,r]&#xff0c;那么这辆车会被 l l l 右侧最近的测速仪到 r r r 左侧最近的测速仪检…...

C#:多线程

一.线程常用概念 线程&#xff08;Thread&#xff09;&#xff1a;操作系统执行程序的最小单位 进程&#xff08;Process&#xff09;&#xff1a;程序在内存中的运行实例 并发&#xff08;Concurrency&#xff09;&#xff1a;多个任务交替执行&#xff08;单核CPU&#xff0…...

虚拟币制度钱包开发:功能设计与成本全解析

虚拟币制度钱包开发&#xff1a;功能设计与成本全解析 ——从基础架构到合规风控的完整解决方案 一、开发成本&#xff1a;分层定价与关键影响因素 根据2024-2025年行业数据显示&#xff0c;虚拟币钱包App开发成本跨度较大&#xff0c;主要受功能复杂度、技术架构与合规要求三…...

TransmittableThreadLocal实现上下文传递-笔记

1.TransmittableThreadLocal简介 com.alibaba.ttl.TransmittableThreadLocal&#xff08;简称 TTL&#xff09;是阿里巴巴开源的一个工具类&#xff0c;旨在解决 ThreadLocal 在线程池中无法传递上下文变量 的问题。它是对 InheritableThreadLocal 的增强&#xff0c;尤其适用…...

应对WEEE 2025:猎板PCB的区块链追溯与高温基材创新

在全球电子产业加速向循环经济转型的背景下&#xff0c;欧盟《绿色新政》与《WEEE指令》对PCB行业提出更高要求。作为行业先行者&#xff0c;猎板PCB&#xff08;Hunter PCB&#xff09;以生物降解基材为核心&#xff0c;结合全球合规体系与产业链协同创新&#xff0c;构建从材…...

大陆资产在香港发行RWA的合规路径与核心限制

大陆资产在香港发行RWA的合规路径与核心限制 ——从“双重合规原则”到资产准入边界的全景解读 一、法律框架&#xff1a;双重合规原则的刚性约束 根据香港金管局Ensemble沙盒项目要求&#xff0c;大陆资产在香港发行RWA需遵循“双重合规原则”&#xff0c;即底层资产需同时符…...

爬虫攻防战:从入门到放弃的完整对抗史与实战解决方案

爬虫攻防战:从入门到放弃的完整对抗史与实战解决方案 这张有趣的图片生动描绘了爬虫开发者与反爬工程师之间的"军备竞赛"。作为技术博主,我将基于这张图的各个阶段,深入分析爬虫技术的演进与对应的反制措施,提供一套完整的反爬解决方案,包括技术原理、实施方法…...

Fabric初体验(踩坑笔记)

搭建fabric部署合约学习笔记 环境准备CURl安装docker 参照官网文档实现&#xff08;2025.05.19&#xff09;根据前言交代的文章去尝试&#xff08;失败版&#xff09;安装fabric-samples安装指定2.2.0版本Fabric二进制文件和配置文件直接手动下载&#xff08;不建议&#xff09…...

区块链blog2_中心化与效率

&#x1f33f;中心化出现原因 信息/服务分散在各处会浪费时间且不方便使用&#xff0c;由此&#xff0c;把信息/服务集中在一起&#xff0c;便于管理&#xff0c;避免了不必要的效率损失。 即集中资源&#xff0c;使得对信息处理的全过程效率升高。中心化不是网络中产生的&…...

2024年ASOC SCI2区TOP,多机制群优化算法+多风场输电线路巡检中多无人机任务分配与路径规划,深度解析+性能实测

目录 1.摘要2.考虑风场影响的多无人机任务分配3.基于双向蚁群和离散蜜獾算法求解多无人机任务分配问题(BACOHBA)4.考虑风场的多无人机路径规划5.结果展示6.参考文献7.代码获取8.读者交流 1.摘要 随着电力系统规模的不断扩大&#xff0c;复杂环境下的电力线路及设施的巡检与维护…...

智慧赋能光伏运维——无人机巡检+地面监控双链路覆盖,打造光伏电站管理新标杆

一、引言&#xff1a;光伏电站运维的挑战与机遇 在全球能源转型浪潮下&#xff0c;光伏电站作为清洁能源的重要载体&#xff0c;其高效运维管理成为行业核心命题。然而&#xff0c;传统光伏电站运维存在覆盖范围广、设备分散、人工巡检效率低、故障响应慢等痛点。为破解这一难…...

c/c++的opencv开闭操作

OpenCV 中的形态学开运算与闭运算 (C) 在计算机视觉和图像处理领域&#xff0c;形态学操作是用于分析和处理图像形状的一系列非线性操作。OpenCV 作为一个强大的开源计算机视觉库&#xff0c;提供了丰富的形态学转换函数。其中&#xff0c;“开运算”&#xff08;Opening&…...

Linux利用多线程和线程同步实现一个简单的聊天服务器

1. 概述 本文实现一个基于TCP/IP的简单多人聊天室程序。它包含一个服务器端和一个客户端&#xff1a;服务器能够接收多个客户端的连接&#xff0c;并将任何一个客户端发来的消息广播给所有其他连接的客户端&#xff1b;客户端则可以连接到服务器&#xff0c;发送消息并接收来自…...

无人机遥控器光纤通信模块技术要点!

一、技术要点 1. 长距离低损耗传输 采用单模光纤&#xff08;如G.654.E光纤&#xff09;&#xff0c;利用光纤的低衰减特性&#xff08;0.17 dB/km以下&#xff09;&#xff0c;支持10公里以上的远距离通信&#xff0c;突破了传统无线信号因衰减导致的覆盖限制。例如&…...

深入解析OkHttp与Retrofit:Android网络请求的黄金组合

前言 在移动应用开发中&#xff0c;网络请求是连接客户端与服务器的关键桥梁。对于Android开发者而言&#xff0c;OkHttp和Retrofit这对组合已经成为处理网络请求的事实标准。本文将全面剖析这两个框架的设计理念、核心功能、协同关系以及最佳实践&#xff0c;帮助开发者构建高…...

Python操作PDF书签详解 - 添加、修改、提取和删除

目录 简介 使用工具 Python 向 PDF 添加书签 添加书签 添加嵌套书签 Python 修改 PDF 书签 Python 展开或折叠 PDF 书签 Python 提取 PDF 书签 Python 删除 PDF 书签 简介 PDF 书签是 PDF 文件中的导航工具&#xff0c;通常包含一个标题和一个跳转位置&#xff08;如…...

Spring Boot与Kafka集成实践:从入门到实战

Spring Boot与Kafka集成实践 引言 在现代分布式系统中&#xff0c;消息队列是不可或缺的组件之一。Apache Kafka作为一种高吞吐量的分布式消息系统&#xff0c;广泛应用于日志收集、流处理、事件驱动架构等场景。Spring Boot作为Java生态中最流行的微服务框架&#xff0c;提供…...

luckysheet的使用——17.将表格作为pdf下载到本地

luckysheet源码里面自带有打印按钮&#xff0c;但是功能是无法使用的&#xff0c;所以我把该功能重写了一遍 1.在menuButton.js文件中找到源码打印按钮的触发事件&#xff1a; $("#luckysheet-icon-print").click(function () {}2.使用自己写的挂载方法 window.pr…...

矿井支架LCYVB-6钢丝编织护套连接器介绍

LCYVB-6钢丝编织护套连接器是一种专为矿井支架设计的连接装置&#xff0c;主要用于增强支架的稳定性和安全性。该连接器采用高强度钢丝编织护套&#xff0c;具有优异的抗拉强度和耐磨性&#xff0c;适用于恶劣的矿井环境。 主要特点 高强度钢丝编织护套&#xff1a;采用优质钢…...

git仓库中.git 文件很大,怎么清理掉一部分

查询 .git 文件大小&#xff0c;在 git-bash 里执行&#xff08;后面有些命令不能执行&#xff0c;也请在 git-bash 里执行&#xff09; windows11 安装好后右键没有 git bash 命令-CSDN博客 du -sh .git // 592m .git 操作前最好先备份一份&#xff0c;避免推送到远程时出错…...

Qt框架核心组件完全指南:从按钮交互到定时器实现

文章目录 前言一、QAbstractButton 按钮类概述1.1 常用属性1.2 常用信号1.3QButtonGroup 按钮组 二、QComboBox 组合框三、若干与数字相关的组件四、QString 字符串类五、Qt容器类5.1 顺序容器 QList5.2 关联容器 QMap 六、QVariant七、跨平台数据类型7.1 基础数据类型7.2 特殊…...

Axure设计数字乡村可视化大屏:从布局到交互的实战经验分享

乡村治理正从传统模式向“数据驱动”转型。数字乡村可视化大屏作为数据展示的核心载体&#xff0c;不仅能直观呈现乡村发展全貌&#xff0c;还能为决策提供科学依据。本文以Axure为工具&#xff0c;结合实际案例&#xff0c;分享如何从零设计一个功能完备、交互流畅的数字乡村大…...

60天python训练计划----day30

DAY 30 模块和库的导入 知识点回顾&#xff1a; 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑&#xff1a;找到根目录&#xff08;python解释器的目录和终端的目录不一致&#xff09; 一.导入官方库 我们复盘下学习python的逻辑&#xff0c;所谓学习pyth…...

HJ3 明明的随机数【牛客网】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路3.1 快排去重3.2 散列 四、参考代码4.1 快排去重4.2 散列 零、原题链接 HJ3 明明的随机数 一、题目描述 二、测试用例 三、解题思路 3.1 快排去重 基本思路&#xff1a;   先将序列进行快速排序&#xff0c;然后…...

BGP选路

一、拓扑图 二、要求及分析 1.要求 1.使用Preva1策略&#xff0c;确保R4通过R2到达192.168.10.0/24 2、用As Path策略&#xff0c;确保R4通过R3到达192.168.11.0/24 3.配置MED策略&#xff0c;确保R4通过R3到达192.168.12.0/24 4.使用Local Preference策略&#xff0c;确保…...

践行“科学智能”!和鲸打造 AI for Science 专属应用

AI for good, AI for Science. 在传统科研领域&#xff0c;人力与经验的局限始终如影随形。而“AI for Science”正逐渐改变科学研究的模式&#xff0c;以科学数据为基石、以强大算力为支撑&#xff0c;借助人工智能技术&#xff0c;开展计算密集度高且能够实现高效迭代的科学…...

【vs2022的C#窗体项目】打开运行+sql Server改为mysql数据库+发布

1. vs2022打开运行原sql Server的C#窗体项目更改为mysql数据库 1.1. vs2022安装基础模块即可 安装1️⃣vs核心编辑器2️⃣.net桌面开发必选&#xff0c;可选均不安装&#xff01;&#xff01;&#xff01; 为了成功连接mysql数据库&#xff0c;需要安装组件NuGet包管理器 安…...

wpf DataGrid 行选择事件

在WPF中处理DataGrid行选择事件主要有以下几种实现方式: 1.SelectionChanged事件处理 ‌ 通过直接订阅DataGrid的SelectionChanged事件实现行选择响应: <DataGrid SelectionChanged="DataGridAccurateLocationList_SelectionChanged" .../>后台代码中处理…...

Spring Cloud Seata 深度解析:原理与架构设计

文章目录 前言&#xff1a;为什么我们需要理解分布式事务&#xff1f;一、Seata 核心架构深度拆解1.1 分布式事务核心模型1.2 Seata undo_log 存储结构与版本控制存储结构版本控制核心算法 1.3 Seata 事务模型深度对比与实现原理AT 模式&#xff08;Auto Transaction&#xff0…...

从产品展示到工程设计:3DXML 转 STP 的跨流程数据转换技术解析

在数字化设计与制造领域&#xff0c;不同格式的三维模型文件常常需要进行转换&#xff0c;以满足不同软件和工作流程的需求。3DXML 和 STP&#xff08;STEP AP214/AP242&#xff09;是工业领域常用的两种三维模型文件格式&#xff0c;3DXML 格式以其轻量化和便于网络传输、可视…...

基于RT-Thread的STM32F4开发第五讲——软件模拟I2C

文章目录 前言一、RT-Thread工程创建二、AT24C02三、函数编写1.I2C_soft.c2.I2C_soft.h3.main.h 四、效果展示五、资源分享总结 前言 本章是基于RT-Thread studio实现软件模拟I2C&#xff0c;开发板是正点原子的STM32F4探索者&#xff0c;使用的RT-Thread驱动是5.1.0&#xff0…...