上位机图像处理和嵌入式模块部署(f407 mcu中的udp server开发)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        既然lwip已经port到407上面了,接下来其实就可以做一些测试了。本身lwip支持tcp、udp,也支持client和server,既然我们选择了无os版本,那么功能上可以简单一点也行,这里我们就以udp server作为范例,看看407怎么和上位机配合进行测试。

1、测试代码逻辑

        测试的逻辑不复杂,就是开发板上有两个按钮。按钮1按下去的时候,启动udp server;按钮2按下去的时候,结束udp server。其他报文处理逻辑没有发生改变。

	while(1){if(Key_Scan(KEY1_GPIO_PORT,KEY1_PIN)==KEY_ON&&(flag==0)){LED1_ON;if (EthLinkStatus == 0){printf("create udp server\n");/* Initialize the server application */ udp_echoserver_init();flag=1;}}if(Key_Scan(KEY2_GPIO_PORT,KEY2_PIN)==KEY_ON&&(flag==1)){LED1_OFF;udp_echoserver_Stop();flag=0;}/* check if any packet received */if (ETH_CheckFrameReceived()){ /* process received ethernet packet */LwIP_Pkt_Handle();}/* handle periodic timers for LwIP */LwIP_Periodic_Handle(LocalTime);}

2、udp server的初始化

        初始化比较简单,主要就是创建一个udp_pcb,把这个udp_pcb和对应的ip、port绑定在一起。如果没有问题,继续注册一个报文接收的回调函数。当然,如果出错的话,就删除这个udp_pcb。

void udp_echoserver_init(void)
{err_t err;/* Create a new UDP control block  */upcb = udp_new();if (upcb){/* Bind the upcb to the UDP_PORT port *//* Using IP_ADDR_ANY allow the upcb to be used by any local interface */err = udp_bind(upcb, IP_ADDR_ANY, UDP_SERVER_PORT);if(err == ERR_OK){/* Set a receive callback for the upcb */udp_recv(upcb, udp_echoserver_receive_callback, NULL);#ifdef SERIAL_DEBUGprintf("Start the server application\n");#endif}else{udp_remove(upcb);printf("can not bind pcb");}}else{printf("can not create pcb");} 
}

3、udp server的报文接收

        如果有client端给udp server发送报文了,那么这个接收函数就会被调用到。毕竟,它也是在udp_echoserver_init函数中刚刚被注册上去的。首先,upcb会和client端的addr、port连接在一起,主要是为了发送报文用的。接着,打印一下接收到的内容。然后,把这些内容发送回去。最后,upcb会再次和addr、port分开。最后,收到的报文缓存p也会被释放掉。

        原示例代码中的UDP_CLIENT_PORT要改成port。

void udp_echoserver_receive_callback(void *arg, struct udp_pcb *upcb, struct pbuf *p, struct ip_addr *addr, u16_t port)
{char recdata[100]={0};/* Connect to the remote client *///udp_connect(upcb, addr, UDP_CLIENT_PORT);udp_connect(upcb, addr, port);#ifdef SERIAL_DEBUGmemcpy((char *)recdata,p->payload,p->len);printf("upd_rec:%s\r\n",recdata);#endif	/* Tell the client that we have accepted it */udp_send(upcb, p);/* free the UDP connection, so we can accept new clients */udp_disconnect(upcb);/* Free the p buffer */pbuf_free(p);}

4、udp server的停止

        相比较前两个函数,udp server的停止就简单很多。直接调用udp_remove即可。

void udp_echoserver_Stop(void)
{#ifdef SERIAL_DEBUGprintf("Stop the server application\n");#endif	udp_remove(upcb);
}

5、pc客户端准备

        因为407开发板上面是一个udp server端,所以pc这边也要写一个udp client端。本着简单、方便的原则,我们用python写了一个udp客户端。

#!/usr/bin/python
import socket
import timedef send_udp_message(host, port, message):sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)try:sock.sendto(message.encode(), (host, port))print(f"UDP message sent to {host}:{port}: {message}")except Exception as e:print(f"Error: {e}")time.sleep(0.05)response, server = sock.recvfrom(1024)print(f"Response received from server: {response.decode('utf-8')}")if __name__ == '__main__':host = '192.168.0.122' port = 5000        num = 0message = "Hello, this is a UDP message, "while True:send_udp_message(host, port, message + str(num))time.sleep(0.05) num += 1

6、测试和验证

        按照之前的做法,需要把固件的ip改成192.168.0.122,网关改成192.168.0.1,pc的ip改成192.168.0.240。下面就是常规操作。首先编译keil代码,烧录。接着复位启动,确认有打印,而且网口灯有闪烁。这个时候,按下按键1,在串口上确认udp server开启。后续的话,就可以用python启动udp client脚本。这样,开发板上的打印就是这样的,

        而pc侧的打印就是这样的,有兴趣的同学可以自己测试下。

        当然这个时候,大家可以按下2,看看打印会不会停止。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/341814.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

金属切削机床5G智能工厂工业物联数字孪生,推进制造业数字化转型

金属切削机床5G智能工厂工业物联数字孪生,推进制造业数字化转型。随着工业4.0时代的到来,制造业正面临着前所未有的变革与挑战。在这场变革中,金属切削机床智能工厂工业物联数字孪生平台正成为推动制造业数字化转型的重要力量。 数字孪生是指…

DPDK基础组件一(mbuf、ring、pktmbuf_pool)

一、rte_mbuf 此部分转自:https://zhuanlan.zhihu.com/p/616314276 1.mbuf结构 mbuf是报文中的描素的结构体,是整个转发过程中最核心的数据结构之一。主要针对于mbuf的常用API与基本原理做一个简单的介绍。 mbuf:报文内存存储结构,存储在mempool中mempool:使用环形缓冲…

【主流分布式算法总结】

文章目录 分布式常见的问题常见的分布式算法Raft算法概念Raft的实现 ZAB算法Paxos算法 分布式常见的问题 分布式场景下困扰我们的3个核心问题(CAP):一致性、可用性、分区容错性。 1、一致性(Consistency):…

Linux 磁盘分区步骤

1.lsblk用于查看磁盘分区情况,lsblk -f用于查看uuid字符串以及挂载点。 以下是虚拟机部分添加磁盘的步骤。 其余没展示的都按照默认设置进入下一步即可。 2.添加完成后使用reboot重新进入后再使用lsblk就会发现磁盘sdb已经有了,但是没有分区。现在添加分…

现代控制中可控性的Gramian判据

知乎三角猫frank对于这块内容写的非常好,但这个输入的构造还是很难过于没头没尾 数学好的人,可能看一眼根据形式就能推出gramian的构造,但对我这种比较钻牛角尖的人,我就想有一个逻辑链条——gramian是怎么被构造出来的&#xff1…

FreeBSD原生虚拟化Jail的管理软件比较

当前流行的虚拟化技术,除了VMWare、VirtualBox等重型虚拟机,Docker等中型虚拟机外,还有jail等轻型虚拟机解决方案。 jail的简介 Jail最早在FreeBSD 4.X便可使用,并且一直在持续强化它的功能、效率、稳定性以及安全性。 Jail建立…

node mysql的增删改查基础

学习koa时,不选择mongodb,而是MySQL,虽然node对mongodb更亲和,但是我感觉MySQL的键值对的储存结构更正规 1.首选确认你的数据库有个库。有个表,我的如下 2.配置 let mySqlConfig{host:localhost,user:root,password:123456,data…

VS2022,lib调用dll工程的一个函数

lib工程本身是一个静态库工程,没有链接器设置。然而,我们依然可以在lib工程中调用DLL工程中的函数,只需要确保头文件正确导入,并在最终使用lib的可执行文件项目中正确链接DLL的.lib文件。下面是一个详细的步骤说明: 假…

基于Keil5移植LVGL,懂得原理之后什么开发板都可以移植

今天我们来移植一下LVGL,其实LVGL和Qt差不多,操作起来都很简单,看着官方文档都可以自己学习使用。 难就难在移植上面,移植个LVGL花了我三天才弄明白(虽然最后发现在一个很弱智的问题上耽误了我两天)&#…

AI大模型时代必须关注的数据库 DuckDB1.0 正式发布

开源数据库DuckDB1.0 经过内部6年的打磨,积累了30万行代码,1.8万star,2024.06.03号正式发布了1.0版本(代号 Snow Duck)。 我们新一代程序员,没能见证MySQL 1.0、PostgreSQL 1.0、Windows 1.0、Linux 1.0、…

HTML跳动的爱心

目录 写在前面 HTML简介 程序设计 修改文字 推荐系列 写在后面 写在前面 本期小编给大家分享可以写字的html动态爱心代码,一起来看看叭~ HTML简介 HTML(HyperText Markup Language)是一种用于创建网页的标记语言。它是互联网的基础&…

Etcd Raft架构设计和源码剖析1:宏观架构

Etcd Raft架构设计和源码剖析1:宏观架构 | Go语言充电站 序言 Etcd提供了一个样例contrib/raftexample,用来展示如何使用etcd raft。这篇文章通过raftexample介绍如何使用etcd raft。 raft服务 raftexample是一个分布式KV数据库,客户端可…

三十六、openlayers官网示例Earthquake Clusters解析——在聚合图层鼠标触摸显示五角星

官网demo地址: Earthquake Clusters 这篇展示了鼠标触摸聚合图层点位显示五角星的效果。 首先是初始化地图,加载了一个KML格式的矢量数据源,extractStyles为false表示不从kml数据源中提取样式。使用Select添加了鼠标选中的交互事件 vector …

《微服务大揭秘:SpringBoot与SpringCloud的魔法组合》

加入我们的探险队伍,一起深入SpringBoot与SpringCloud构建的微服务世界。以轻松幽默的笔触,带你一步步揭开微服务架构的神秘面纱,从服务发现的智能地图Eureka,到API网关Zuul的城市门卫,每一个环节都充满了惊喜。不仅如…

htb_solarlab

端口扫描 80,445 子域名扫描 木有 尝试使用smbclient连接445端口 Documents目录可查看 将Documents底下的文件下载到本地看看 xlsx文件里有一大串用户信息,包括username和password 先弄下来 不知道在哪登录,也没有子域名,于是返回进行全端…

chat4-Server端保存聊天消息到mysql

本文档描述了Server端接收到Client的消息并转发给所有客户端或私发给某个客户端 同时将聊天消息保存到mysql 服务端为当前客户端创建一个线程,此线程接收当前客户端的消息并转发给所有客户端或私发给某个客户端同时将聊天消息保存到mysql 本文档主要总结了将聊天…

UnityAPI学习之游戏物体的方法使用

目录 游戏物体 创建游戏物体的三种方式 组建的获取和查找 游戏物体的方法与其他成员变量 游戏物体的生成 游戏物体的激活状态/标签(tag)/层级(layer) 游戏物体的激活与失活 游戏物体的查找 1. 名称查找(Find) 2. 通过标签查找游戏物体(FindGameObjectWithT…

v1.2.70-FastJson的AutoType机制研究

v1.2.70-FastJson的AutoType机制研究 最近在对接Alexa亚马逊语音技能,Smart Home Skill Apis时,有一个配置的JSON字符串是这样的: { "capabilityResources": {"friendlyNames": [{"type": "asset",…

json和axion结合

目录 java中使用JSON对象 在pom.xml中导入依赖 使用 public static String toJSONString(Object object)把自定义对象变成JSON对象 json和axios综合案例 使用的过滤器 前端代码 响应和请求都是普通字符串 和 请求时普通字符串,响应是json字符串 响应的数据是…

使用 Django 连接 MySQL 数据库

文章目录 步骤一:安装必要的库和驱动步骤二:配置数据库连接步骤三:执行数据库迁移步骤四:开始使用 MySQL 数据库创建一个模型迁移模型到数据库使用模型进行数据操作创建新记录:查询记录:更新记录&#xff1…