stm32开发之netxduo网口通讯,网线热插拔处理

前言

  1. 在使用netxduo组件时,如果在上电过程中,未插入网线,eth驱动使能过程中未正常初始化
  2. 本次使用以下几种方式进行设置

问题原因

在这里插入图片描述

使用定时器+事件回调方式

网络组件中进行调整

/*
 * Copyright (c) 2024-2024,shchl
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2024-4-15     shchl   first version
 */
#include <nx_ip.h>

#include "lan8742.h"
#include "main.h"
#include "nx_stm32_eth_driver.h"
#include "nx_stm32_phy_driver.h"

#if 1


#define     APP_NX_PACKET_SIZE              1536 /*数据包大小*/
#define     APP_NX_PACKET_POOL_SIZE         ((sizeof(NX_PACKET) + APP_NX_PACKET_SIZE) * 16)

#define     APP_NX_IP_STACK_SIZE            2048
#define     APP_NX_IP_PRIORITY              10

#define     APP_NX_ARP_CACHE_SIZE           1024

#define     APP_NX_IP_ADDR                  IP_ADDRESS(192,168,8,9)
#define     APP_NX_IP_SUB_MASK              IP_ADDRESS(255,255,255,0)

/*
*******************************************************************************************************
*                               外部引入变量
*******************************************************************************************************
*/

/*
*******************************************************************************************************
*                               变量
*******************************************************************************************************
*/

void *loc_ip_area;
void *packet_pool_area;
void *arp_cache_area;

NX_PACKET_POOL g_packet_pool; /*全局packet pool 池*/
NX_IP g_loc_ip; /*全局 本地ip实例*/
static TX_TIMER nx_link_status_timer;
/*
*********************************************************************************************************
*                                       静态全局变量
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                      函数声明
*********************************************************************************************************
*/
static VOID phy_link_status_change_notify(NX_IP *ip_ptr, UINT i, UINT link_up);

static VOID check_phy_link(ULONG id);

/*
*********************************************************************************************************
*                                      外部函数
*********************************************************************************************************
*/
int nx_application_define(void) {
    UINT stat = 0;
#if 1
    /*内存分配*/
    static CHAR nx_packet_pool[APP_NX_PACKET_POOL_SIZE];
    static CHAR nx_arp_cache[APP_NX_ARP_CACHE_SIZE];
    static CHAR nx_ip_stack[APP_NX_IP_STACK_SIZE];

    packet_pool_area = nx_packet_pool;
    loc_ip_area = nx_ip_stack;
    arp_cache_area = nx_arp_cache;
#else
    packet_pool_area = app_malloc(APP_NX_PACKET_POOL_SIZE);
    loc_ip_area = app_malloc(APP_NX_IP_STACK_SIZE);
    arp_cache_area = app_malloc(APP_NX_ARP_CACHE_SIZE);
#endif

    /*创建packet pool*/
    stat += nx_packet_pool_create(&g_packet_pool, "NX PACKET POOL",
                                  APP_NX_PACKET_SIZE,
                                  packet_pool_area, APP_NX_PACKET_POOL_SIZE);

    stat += nx_ip_create(&g_loc_ip,
                         "NX IP",
                         APP_NX_IP_ADDR,
                         APP_NX_IP_SUB_MASK,
                         &g_packet_pool,
                         nx_stm32_eth_driver,
                         loc_ip_area,
                         APP_NX_IP_STACK_SIZE,
                         APP_NX_IP_PRIORITY);

    nx_ip_link_status_change_notify_set(&g_loc_ip, phy_link_status_change_notify);
    /*ip 相关配置*/
    {
        /* 启用 ARP 并为 IP 实例  提供 ARP 缓存内存。 */
        stat += nx_arp_enable(&g_loc_ip, arp_cache_area, APP_NX_ARP_CACHE_SIZE);
        /* 启用 ICMP */
        stat += nxd_icmp_enable(&g_loc_ip);
        /* 为IP 实例启用 TCP 处理.  */
        stat += nx_tcp_enable(&g_loc_ip);
        /*禁止分包 */
        stat += nx_ip_fragment_disable(&g_loc_ip);
    }
    if (stat) {
        LOG_E("app_nx_ip_instance_create error:%d", stat);
    }
    tx_timer_create(&nx_link_status_timer, "phy check",
                    check_phy_link, 0, 1000, 5000, TX_AUTO_ACTIVATE);

    return NX_SUCCESS;
}

TX_APP_DEFINE_EXPORT(nx_application_define); /*首先创建模块应用*/


/*
*********************************************************************************************************
*                                      内部函数
*********************************************************************************************************
*/

static VOID check_phy_link(ULONG id) {
    // ;

    int32_t status = nx_eth_phy_get_link_state();
    UINT nx_link_status = g_loc_ip.nx_ip_interface[0].nx_interface_link_up;

    // 判断
    if (((nx_link_status == TX_TRUE) && status <= LAN8742_STATUS_LINK_DOWN) ||
        (nx_link_status == TX_FALSE && status > LAN8742_STATUS_LINK_DOWN)) {
        g_loc_ip.nx_ip_interface[0].nx_interface_link_status_change = TX_TRUE;
        _tx_event_flags_set(&g_loc_ip.nx_ip_events,NX_IP_LINK_STATUS_EVENT,TX_OR);
    }
}

/**
 *
 * @brief  物理链接状态改变通知回调函数
 * @param ip_ptr
 * @param i
 * @param link_up
 */
static VOID phy_link_status_change_notify(NX_IP *ip_ptr, UINT i, UINT link_up) {
    NX_IP_DRIVER driver_request;
    if (link_up == NX_TRUE) {
        LOG_D("nx link enable ", link_up);
        driver_request.nx_ip_driver_ptr = ip_ptr;
        driver_request.nx_ip_driver_command = NX_LINK_ENABLE;
        ip_ptr->nx_ip_interface[i].nx_interface_link_driver_entry(&driver_request);
    } else {
        // ip_ptr->nx_ip_interface[i].nx_interface_link_up=NX_FALSE;
        LOG_D("nx link diasble ", link_up);
        driver_request.nx_ip_driver_ptr = ip_ptr;
        driver_request.nx_ip_driver_command = NX_LINK_DISABLE;
        ip_ptr->nx_ip_interface[i].nx_interface_link_driver_entry(&driver_request);
    }
}


#endif

关键部分

在这里插入图片描述

关于这个事件接收部分的代码(设计到的源码重点部分说明)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

禁用部分(调整)

在这里插入图片描述

测试结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

openGL

open Graphics Library 核心是一个c库&#xff0c;同时支持多语言的派生。 可编程管线&#xff0c; 状态机&#xff08;State Machine&#xff09;是一种数学模型&#xff0c;用于描述对象在不同状态下的行为及状态之间的转换关系。状态机由一组状态&#xff08;States&#…

2010NOIP普及组真题 2. 接水问题

线上OJ&#xff1a; 一本通&#xff1a;http://ybt.ssoier.cn:8088/problem_show.php?pid1950 解法一、朴素模拟 核心思想&#xff1a; 朴素模拟&#xff1a; 1、先给每个b[i]水龙头分配一个人a[i]&#xff0c;b[i] 表示水龙头的剩余时间。同时标记该水龙头为 used 使用中 2…

深入解析:匹配网络(Matching Networks)的原理和应用

匹配网络&#xff08;Matching Networks&#xff09; 深入解析&#xff1a;匹配网络&#xff08;Matching Networks&#xff09;的原理和应用匹配网络的核心原理工作原理算法流程 匹配网络的实现应用示例结论 深入解析&#xff1a;匹配网络&#xff08;Matching Networks&#…

01_SpringBoot简单搭建入门程序

目录 1、先创建一个java项目2、导入依赖3、将Java项目修改为SpringBoot项目4、编写一个测试的Controller5、测试(创建一个*.http的文件)方式1&#xff1a;方式2&#xff1a;可以直接在浏览器访问该地址方式3&#xff1a;使用postman也可以 1、先创建一个java项目 我的项目结构…

FlinkSql使用ES sink并指定主键,为什么数据还是会被覆盖?

FlinkSql使用ES sink并指定主键&#xff0c;为什么数据还是会被覆盖&#xff1f; 1. 问题描述 根据ES connector文档中的描述&#xff0c;创建ES表并指定主键后将采用upsert模式。 但是在实际的使用过程中却发现部分数据仍然存在被直接覆盖的问题。 举个例子&#xff0c;假如…

NumPy库与PyTorch库的异同点

目录 1.单位的创建和操作 1.创建 2.形状变换 2.数学和统计操作 1.矩阵乘法 2.广播 3.统计计算 3.GPU支持 4.在深度学习中的作用 5.应用范围 NumPy库为数组服务&#xff0c;PyTorch库为张量服务&#xff0c;这是最本质的区别。 1.单位的创建和操作 1.创建 NumPy:使…

【busybox记录】【shell指令】md5sum

目录 内容来源&#xff1a; 【GUN】【md5sum】指令介绍 【busybox】【md5sum】指令介绍 【linux】【md5sum】指令介绍 使用示例&#xff1a; 128位MD5 - 默认输出 128位MD5 - 将每个文件当做二进制处理 128位MD5 - 从文件中读取MD5值并做检查 128位MD5 - 创建一个BSD风…

浅谈OpenCV 粗略计算工件轮廓面积和外接圆直径(Emgu.CV)

前言 最近领导在做库房工具管理这块的功能&#xff0c;希望能集成OpenCV 粗略的计算出工具的长度&#xff0c;以方便用户再归还工具的时候&#xff0c;提示用户该放在那种尺寸的盒子里面&#xff0c;这便是这篇文章的由来。 我们的系统是基于.net开发的&#xff0c;所以采用的是…

项目管理-项目采购管理1/2

项目管理&#xff1a;每天进步一点点~ 活到老&#xff0c;学到老 ヾ(◍∇◍)&#xff89;&#xff9e; 何时学习都不晚&#xff0c;加油 1.项目采购管理-主要内容 项目采购管理过程--重点&#xff1a; ①ITTO 输入&#xff0c;输出工具和技术。 ②问题和解决方案。 ③论文…

【白话机器学习系列】白话特征向量

白话特征向量 一个方阵 A A A 与列向量 v v v 的乘积会生成一个新的列向量。这个新向量通常与原向量有着不同的方向&#xff0c;矩阵在这里代表一个线性变换。然而&#xff0c;某些向量会保持其原始方向。我们称这种向量为矩阵 A A A 的特征向量&#xff08;eigenvector&…

python数据分析——业务指标分析

业务指标分析 前言一、业务指标分析的定义二、业务问题构建问题构建的要求 三、业务问题的识别在识别问题的阶段对于企业内部收益者的补充&#xff1a; 四、竞争者分析标题竞争者分析的内容&#xff1a;标题竞争者分析目的&#xff1a;案例&#xff1a; 黑莓公司为什么会消亡&a…

dynamic_cast 静态转换

dynamic_cast 静态转换 const_cast 常量转换 重新解释转换(reinterpret_cast) 最不安全

RocketMq详解:一、RocketMQ 介绍及基本概念

文章目录 前言1.RocketMQ简介2.RocketMQ 特点3.核心特性4.应用场景5.RocketMQ 优势6.RocketMQ 四大核心组件6.1 NameServer1.NameServer作用2.NameServer被设计为无状态的原因3.和NameServer和Zookeeper的区别4.NameServer的高可用保障 6.2 Broker1.Broker部署方式2.高可用与负…

ssm105基于JAVAEE技术校园车辆管理系统+jsp

校园车辆管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本校园车辆管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短…

泰克示波器电流探头如何抓浪涌电流波形?

泰克示波器是一种常见的电子测量仪器&#xff0c;广泛应用于电子工程、通信工程、医疗设备等领域。它的主要功能是实时显示电信号的波形&#xff0c;从而帮助工程师和技术人员分析和调试电路。而在一些特定的应用场景中&#xff0c;例如电源、电机、电器设备等&#xff0c;我们…

模型全参数训练和LoRA微调所需显存的分析

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

TypeScript 基础学习笔记:泛型 <T> vs 断言 as

TypeScript 基础学习笔记&#xff1a;泛型 <T> vs 断言 as &#x1f525; 引言 &#x1f44b; TypeScript (TS) 以其静态类型的魔力&#xff0c;让我们的代码更加健壮、易读且易于维护。今天&#xff0c;我们将深入探讨两个核心概念——泛型&#xff08;Generics&#x…

【华为】AC三层旁挂直接转发

【华为】AC三层旁挂直接转发 实验需求实验拓扑配置AC和AP二层通信ACLSW1LSW2AP2获取到的管理地址AP3获取到的管理地址 AP上线配置WLAN业务ACLSW1&#xff08;作DHCP地址池&#xff09;业务成功下发 访问公网&#xff08;NAT&#xff09;LSW1AR1 配置文档ACLSW1LSW2AR1ISP 实验需…

杭电acm1013 Digital Roots 数字根 Java解法 高精度

Problem - 1013 (hdu.edu.cn) 高精度算术模拟 开long没过想到开bI 开bl一次过 import java.math.BigInteger; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);BigInteger i;while (!(i sc.nextB…

Docker新建容器 修改运行容器端口

目录 一、修改容器的映射端口 二、解决方案 三、方案 一、修改容器的映射端口 项目需求修改容器的映射端口 二、解决方案 停止需要修改的容器 修改hostconfig.json文件 重启docker 服务 启动修改容器 三、方案 目前正在运行的容器 宿主机的3000 端口 映射 容器…