第6章 STM32 UDP配置和测试
本文介绍了在STM32平台上实现UDP通信的配置过程。主要内容包括:1)在Keil中新建C文件并添加UDP客户端代码;2)实现UDP数据收发功能,包含初始化、发送和接收回调函数;3)在main.h和freertos.c中添加相关声明和初始化调用;4)通过网络助手测试验证UDP通信功能。文章提供了完整的源码链接和参考文档,适合快速实现STM32的UDP通信功能。
·
文章目录
前言
硬件的配置由前面的工程递增,会根据目的修改部分控制代码
由于本人较懒,记录主要是过程,原理性的东西网上一大把,我就不赘述了,由于懒,主要由图片和代码加少量文字组成
源码地址https://gitcode.com/qq_36517072/stm32,第x章为cx文件夹
一、KEIL新建文件
新建C文件
源码来自参考文章做了一点修改
/**
*****************************************************************************
* @file udp_client.c
* @author Zorb
* @version V1.0.0
* @date 2018-09-04
* @brief udp客户端的实现
*****************************************************************************
* @history
*
* 1. Date:2018-09-04
* Author:Zorb
* Modification:建立文件
*
*****************************************************************************
*/
#include "stm32f4xx_hal.h"
#include "lwip.h"
#include "udp.h"
#include "string.h"
#include "main.h"
/* 定义端口号 */
#define UDP_REMOTE_PORT 8881 /* 远端端口 */
#define UDP_LOCAL_PORT 8880 /* 本地端口 */
/* 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)
{
struct pbuf *p;
/* 分配缓冲区空间 */
p = pbuf_alloc(PBUF_TRANSPORT, strlen(pData), PBUF_POOL);
if (p != NULL)
{
/* 填充缓冲区数据 */
pbuf_take(p, pData, strlen(pData));
/* 发送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, 0, 11);
/* 创建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数据 */
udp_client_send("udp client connected");
printf("udp client connected\r\n");
}
else
{
udp_remove(upcb);
printf("can not connect udp pcb\r\n");
}
}
}
在main.h
里添加udp_client_init
函数的声明
/* USER CODE BEGIN EFP */
void udp_client_init(void);
/* USER CODE END EFP */
在freertos.c
里添加UDP初始化的调用
/* USER CODE BEGIN StartDefaultTask */
shell_init();
udp_client_init();
/* Infinite loop */
二、代码和测试
连接好烧录器编译并烧录
打开网络助手软件,设置IP和端口后往板卡发送,能收到回复
总结
主要介绍了STM32 UDP的配置
参考
更多推荐
所有评论(0)