stm32+lwip(二):UDP测试
我是卓波,很高兴你来看我的博客。
系列文章:
stm32+lwip(一):使用STM32CubeMX生成项目
ST官方有lwip的例程,下载地址如下:
本文例子参考ST官方给出的例程。
一、准备
ST例程文档关于lwip的介绍如下:
由此可以看到LWIP有三种API,在本文中,使用Raw API。
本文用到的UDP Raw API如下:
二、udp client
/**
*****************************************************************************
* @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" /* 定义端口号 */
#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 + ),
*((uint8_t *)&addr->addr + ), *((uint8_t *)&addr->addr + ), port); if (p != NULL)
{
struct pbuf *ptmp = p; while(ptmp != NULL)
{
for (i = ; 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, , , , ); /* 创建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");
}
}
} /******************************** END OF FILE ********************************/
本例用到的上位机IP为192.168.2.194,开放端口为8881
STM32的IP为192.168.2.8,开放端口为8880
先将网络调试助手的UDP连接打开,然后给STM32上电。
网络调试助手将会收到如下信息:
然后点击网络调试助手的发送,STM32调试串口输出以下信息:
get msg from ::: port::
hello zorb
三、udp server
/**
*****************************************************************************
* @file udp_server.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" /* 定义端口号 */
#define UDP_REMOTE_PORT 8881 /* 远端端口 */
#define UDP_LOCAL_PORT 8880 /* 本地端口 */ /******************************************************************************
* 描述 : 接收回调函数
* 参数 : -
* 返回 : 无
******************************************************************************/
static void udp_server_receive_callback(void *arg, struct udp_pcb *upcb,
struct pbuf *p, const ip_addr_t *addr, u16_t port)
{
uint32_t i; /* 数据回传 */
// 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 + ),
*((uint8_t *)&addr->addr + ), *((uint8_t *)&addr->addr + ), port); if (p != NULL)
{
struct pbuf *ptmp = p; while(ptmp != NULL)
{
for (i = ; i < p->len; i++)
{
printf("%c", *((char *)p->payload + i));
} ptmp = p->next;
} printf("\r\n");
} /* 释放缓冲区数据 */
pbuf_free(p);
} /******************************************************************************
* 描述 : 初始化UDP服务器端
* 参数 : 无
* 返回 : 无
******************************************************************************/
void udp_server_init(void)
{
struct udp_pcb *upcb;
err_t err; /* 创建udp控制块 */
upcb = udp_new(); if (upcb)
{
/* 绑定端口接收,接收对象为所有ip地址 */
err = udp_bind(upcb, IP_ADDR_ANY, UDP_LOCAL_PORT); if(err == ERR_OK)
{
/* 注册接收回调函数 */
udp_recv(upcb, udp_server_receive_callback, NULL);
}
else
{
/* 删除控制块 */
udp_remove(upcb); printf("can not bind pcb\r\n");
}
}
} /******************************** END OF FILE ********************************/
本例用到的上位机IP为192.168.2.194,开放端口为8881
STM32的IP为192.168.2.8,开放端口为8880
先将STM32上电,然后通过网络调试助手发送hello zorb。
STM32调试串口输出以下信息:
get msg from ::: port::
hello zorb
四、最后
本文测试了lwip的udp功能,能正常收发,撒花。
github:https://github.com/54zorb/stm32-lwip
版权所有,转载请打赏哟
如果你喜欢我的文章,可以通过微信扫一扫给我打赏哟
stm32+lwip(二):UDP测试的更多相关文章
- stm32+lwip(三):TCP测试
我是卓波,很高兴你来看我的博客. 系列文章: stm32+lwip(一):使用STM32CubeMX生成项目 stm32+lwip(二):UDP测试 stm32+lwip(三):TCP测试 stm32 ...
- stm32+lwip(五):以太网帧发送测试
我是卓波,很高兴你来看我的博客. 系列文章: stm32+lwip(一):使用STM32CubeMX生成项目 stm32+lwip(二):UDP测试 stm32+lwip(三):TCP测试 stm32 ...
- stm32+lwip(四):网页服务器测试
我是卓波,很高兴你来看我的博客. 系列文章: stm32+lwip(一):使用STM32CubeMX生成项目 stm32+lwip(二):UDP测试 stm32+lwip(三):TCP测试 stm32 ...
- stm32+lwip(一):使用STM32CubeMX生成项目
我是卓波,很高兴你来看我的博客. 系列文章: stm32+lwip(一):使用STM32CubeMX生成项目 stm32+lwip(二):UDP测试 stm32+lwip(三):TCP测试 stm32 ...
- 总结Selenium自动化测试方法(二)测试环境搭建
(接上期内容) 二.测试环境搭建 1.安装python 现在python3.0比python2.0多了一些改进的功能(详见http://zhidao.baidu.com/link?url=3sT1g7 ...
- centos安装netcat TCP UDP测试工具 简称 nc,安全界叫它瑞士军刀
centos安装netcat 今天安装swoole后,测试UDP服务需要用到netcat,然而百度了很多安装方法,并没有一个好用的.几经尝试,终于安装成功,现在就分享给大家,以供参考. 配置环境:ce ...
- Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401开发
Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...
- 使用stm32开发 USB_CAN 适配器测试
USB_CAN 适配器测试例程 采用CDC透传模式 一.简介 CAN总线无处不在,在设计开发中,到处需要用到CAN总线调试工具,本工具可以作为CAN的基础测试工具,用于监听CAN总线,或测试CAN数据 ...
- NodeJs 开发微信公众号(二)测试环境部署
由于卤煮本人是做前端开发的,所以在做公众号过程中基本上没有遇到前端问题,在这方面花的时间是最少的.加上用了mui框架(纯css界面)和自己积累的代码,很快地开发出了界面来.接着是后台开发.卤煮选的是n ...
随机推荐
- 关于git的认识与想法
1.什么是git: Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目.Git的读音为/gɪt/. Git是一个 ...
- OC category(分类)
// ()代表着是一个分类 // ()中的Test代表着分类的名称 @interface Student (Test) // 分类只能扩展方法,不能增加成员变量 - (void)test2; @end
- 设计模式——观察者模式(ObserverPattern)
观察者模式(ObserverPattern):观察者模式又称发布-订阅(Publish/Subscribe)模式,定义了一个中一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状 ...
- 【BZOJ3495】PA2010 Riddle
题目大意 有\(n\)个城镇被分成了\(k\)个郡,有\(m\)条连接城镇的无向边.要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都. 题目分析 每条边至少有一个端点是首都,每个郡至多 ...
- UOJ 35 后缀数组
后缀数组裸题,求排名第1~n的后缀,想相邻后缀的最长公共前缀. 集训队模板就是硬lO(∩_∩)O哈哈~ #include <cstdio> #include <cmath> # ...
- 2018.9.30 Java中数组的存储与内存分配
java 数组与集合的区别 集合:长度可变,可以存放不同类型的元素,只能存放引用类型! 数组:长度固定,只可以存放相同的同种类型的元素,可以存放数据类型也可以存放引用类型! 数组定义的三种方式 // ...
- Css 截取字符串长度
.shortNameShow{ overflow:hidden; text-overflow:ellipsis; -o-text-overflow:ellipsis; white-space:nowr ...
- Android学习笔记_22_服务Service应用之—与Activity进行相互通信的本地服务
一.启动服务的两种方法方法: 第一种: startService()和stopService()启动关闭服务.适用于服务和Activity之间没有调用交互的情况.如果相互之间需要方法调用或者传递参数 ...
- PAT1087. All Roads Lead to Rome
PAT1087. All Roads Lead to Rome 题目大意 给定一个图的边权和点权, 求边权最小的路径; 若边权相同, 求点权最大; 若点权相同, 则求平均点权最大. 思路 先通过 Di ...
- 与JSON相关的问题
1.JSON.stringify 与 JSON.parse 相关的问题 JSON.stringify 把字符串转化为字符串,JSON.parse把字符串转化为JSON格式 会出现的问题Unexpect ...