首页 > 其他分享 >LWIP UDP使用

LWIP UDP使用

时间:2025-01-23 14:55:01浏览次数:1  
标签:UDP LWIP addr void upcb udp 使用 include

MCU: 小华HC32F4A0
板子没有合适的接口作为串口输出了,调试有点困难,想了个办法把lwip的UDP重定向到fputc函数
代码参考:https://www.cnblogs.com/54zorb/p/9609021.html
UDP相关代码

/********************************* UDP测试 ************************************/
/* udp控制块 */
static struct udp_pcb *upcb;

/******************************************************************************
 * 描述  : 接收回调函数
 * 参数  : -
 * 返回  : 无
******************************************************************************/
static void udp_receive_callback(void *arg, struct udp_pcb *upcb,
    struct pbuf *p, const ip_addr_t *addr, u16_t port)
{
    uint32_t i;

    /* 数据回传 */
    udp_send(upcb, p);
//    udp_sendto(upcb, p, addr, port);

    /* 打印接收到的数据 */
    printf("get msg from %d:%d:%d:%d port:%d:\r\n",
    *((uint8_t *)&addr->addr), *((uint8_t *)&addr->addr + 1),
    *((uint8_t *)&addr->addr + 2), *((uint8_t *)&addr->addr + 3), port);

    if (p != NULL)
    {
        struct pbuf *ptmp = p;

        while(ptmp != NULL)
        {
            for (i = 0; i < p->len; i++)
            {
                printf("%c", *((char *)p->payload + i));
            }

            ptmp = p->next;
        }

        printf("\r\n");
    }

    /* 释放缓冲区数据 */
    pbuf_free(p);
}

/******************************************************************************
 * 描述  : 发送udp数据
 * 参数  : (in)pData 发送数据的指针
 * 返回  : 无
******************************************************************************/
void UDP_Client_Send(char *pData, uint16_t len)
{
    struct pbuf *p;

    /* 分配缓冲区空间 */
    p = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_POOL);

    if (p != NULL)
    {
        /* 填充缓冲区数据 */
        pbuf_take(p, pData, len);

        /* 发送udp数据 */
        udp_send(upcb, p);

        /* 释放缓冲区空间 */
        pbuf_free(p);
    }
}

/******************************************************************************
 * 描述  : 创建udp客户端
 * 参数  : 无
 * 返回  : 无
******************************************************************************/
void UDP_Client_Init(void)
{
    ip_addr_t serverIP;
    err_t err;

    IP4_ADDR(&serverIP, 192, 168, 1, 20);

    /* 创建udp控制块 */
    upcb = udp_new();

    if (upcb!=NULL)
    {
        /* 配置本地端口 */
        upcb->local_port = UDP_LOCAL_PORT;

        /* 配置服务器IP和端口 */
        err= udp_connect(upcb, &serverIP, UDP_REMOTE_PORT);

        if (err == ERR_OK)
        {
            /* 注册接收回调函数 */
            udp_recv(upcb, udp_receive_callback, NULL);

            /* 发送udp数据 */
			char text[] = "udp client connected";
            UDP_Client_Send(text, sizeof(text));

            printf("udp client connected\r\n");
        }
        else
        {
            udp_remove(upcb);

            printf("can not connect udp pcb\r\n");
        }
    }
}

在主函数里调用UDP_Client_Init即可

相关头文件

/* LWIP 相关 */
#include "ethernetif.h"
#include "netif/etharp.h"
#include "lwip/init.h"
#include "lwip/netif.h"
#include "lwip/debug.h"
#include "lwip/tcp.h"
#include "lwip/udp.h"
#include "lwip/apps/httpd.h"
#include "lwip/timeouts.h"
#include "lwip/mem.h"

#define UDP_REMOTE_PORT			2025
#define UDP_LOCAL_PORT			2024
// UDP相关
extern void UDP_Client_Init(void);
extern void UDP_Client_Send(char *pData, uint16_t len);

头文件多了一些,有的是其他功能的

lwipopts.h里的UDP开关需要开启,设为1

/* ---------- UDP options ---------- */
#define LWIP_UDP                        1

hc32_ll_utility.c里修改fputc函数

int32_t fputc(int32_t ch, FILE *f)
{
    (void)f;  /* Prevent unused argument compilation warning */
	char a = ch;
    UDP_Client_Send(&a, 1);
    return ch;
}

效果如下图
netassist

image

用sscom更方便看UDP输出的调试信息

image

标签:UDP,LWIP,addr,void,upcb,udp,使用,include
From: https://www.cnblogs.com/T3rra/p/18687753

相关文章

  • 深入探索LLM架构,使用pytorch实现Transformer
    深入探究架构并利用从RNN到Transformer的NLP模型构建实际应用本系列文章1.LLM大模型架构专栏||从NLP基础谈起2.LLM大模型架构专栏||自然语言处理(NLP)之建模3.LLM大模型架构之词嵌入(Part1)4.LLM大模型架构之词嵌入(Part2)5.LLM大模型架构之词嵌入(Part3)6.LLM架构从基础......
  • 使用 PyInstaller 打包 Python 应用并解决依赖问题
    使用PyInstaller打包Python应用并解决依赖问题在Python开发中,有时需要将程序打包成独立的可执行文件,以便分发和部署。PyInstaller是一个广泛使用的工具,可以将Python程序及其依赖打包成可执行文件。然而,在打包过程中,我们经常会遇到一些问题,尤其是在处理复杂依赖或特定环......
  • ChatGPT高效处理图片技巧使用详解
    ChatGPT,作为OpenAI开发的预训练语言模型,主要用于生成自然语言文本的任务。然而,通过一些技巧和策略,我们可以将ChatGPT与图像处理模型结合,实现一定程度上的图像优化和处理。本文将详细介绍如何使用ChatGPT高效处理图片,内容精炼,层次分明,让读者在阅读后有所收获。一、ChatGPT与......
  • 折腾笔记[11]-使用rust进行直接法视觉里程计估计
    摘要使用rust实现了一个完整的直接法视觉里程计系统,能够通过比较两幅图像中的像素强度来估计相机的运动。它通过单层和多层的优化策略,结合图像金字塔和并行计算,提高了位姿估计的精度和效率。最终,代码输出了优化后的相机位姿变换矩阵,并可视化了投影点的位置。Thisisacomplete......
  • HTTPS 证书自动化运维:使用Certbot来申请https证书实践指南
    简介在第一篇文章中,我们介绍了HTTPS证书的基础知识和自动化运维的重要性。本篇文章将进一步深入,提供具体的实践指南和案例分析,帮助您在实际操作中更有效地管理HTTPS证书,采用使用最广泛的证书Let’sEncrypt,实现自动化运维的最佳效果。一、HTTPS证书自动化运维实践指南1.......
  • HTTPS 证书自动化运维:HTTPS 证书管理系统之使用指南
    简介在前三篇文章中,我们介绍了HTTPS证书的基础知识、自动化运维的重要性、功能与优势。本文将提供https证书管理系统的详细配置和使用指南,帮助您从注册到实际应用,全面掌握该系统的使用方法,页面顶部菜单有详细的【视频教程】和【图文教程】。一、注册账户配置邮箱访问https证......
  • docker-py:在Python中轻松使用Docker引擎API,更加灵活地管理和使用容器性
    Docker是一种流行的容器技术,让开发者能够在各种环境中快速地构建、部署和管理应用程序。而docker-py是一个强大的Python库,可以让你通过Python代码与Docker引擎API进行互动,实现与Docker命令相同的功能。本文将详细介绍docker-py的安装、使用以及一些常见的操作示例,帮助你更好地利用......
  • 【Linux日志】syslog协议的Linux系统日志服务程序使用
    一、什么是syslog协议syslog协议为网络设备间传输日志信息提供了标准化解决方案。借助该协议,服务器、路由器、防火墙等各类设备能够将日志消息发送至中央日志服务器,实现日志的集中管理与分析。下面为您详细介绍syslog协议的关键概念和组成部分:1.协议版本RFC3164:早期的s......
  • 【9.8】树结构-使用字典树解单词搜索 II
    一、题目        给定一个 mxn二维字符网格 board 和一个单词(字符串)列表words, 返回所有二维网格上的单词 。        单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字......
  • ASP.NET Core 使用响应压缩中间件提高程序性能
    20250104_ASP.NETCore使用响应压缩中间件提高程序性能ASP.NETCore中的响应压缩中间件1.什么是响应压缩中间件响应压缩中间件是ASP.NETCore的一部分,它通过应用支持的压缩算法(如Gzip和Brotli)来减小服务器发送到客户端的响应体积。这有助于加速数据传输,尤其适用于大段文本和......