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
用sscom更方便看UDP输出的调试信息
标签:UDP,LWIP,addr,void,upcb,udp,使用,include From: https://www.cnblogs.com/T3rra/p/18687753