LWIP UDP使用

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

posted @ 2025-01-23 14:38  T3rra  阅读(123)  评论(0)    收藏  举报
window.opts = config;