上位机图像处理和嵌入式模块部署(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.mzph.cn/web/22868.shtml

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

相关文章

【数据分享】中国第三产业统计年鉴(1991-2022)

大家好!今天我要向大家介绍一份重要的中国第三产业统计数据资源——《中国第三产业统计年鉴》。这份年鉴涵盖了从1991年到2022年中国第三产业统计全面数据,并提供限时免费下载。(无需分享朋友圈即可获取) 数据介绍 每年的《中国…

LeetCode.55 跳跃游戏

LeetCode.55 跳跃游戏 题目描述解题思路错误的解题思路解题思路 代码 题目描述 解题思路 错误的解题思路 我一开始的思路是累加可跳范围内的最大值sum,如果最终sum > nums.size()那么就返回true,这种思路是错误的,因为在你选择最大值的…

2004NOIP普及组真题 3. FBI树

线上OJ 地址: [04NOIP普及组] FBI树 本题的意思是:给定一个 01字符串 (对应一棵完全二叉树的最后一层叶子节点),将树的每一个节点的值用字母“F、B、I”表示。规则(如下图所示)为: 1…

Spring AI 第二讲 之 Chat Model API 第二节Ollama Chat

通过 Ollama,您可以在本地运行各种大型语言模型 (LLM),并从中生成文本。Spring AI 通过 OllamaChatModel 支持 Ollama 文本生成。 先决条件 首先需要在本地计算机上运行 Ollama。请参阅官方 Ollama 项目 README,开始在本地计算机上运行模型…

curl 92 HTTP/2 stream 5 was not closed cleanly: CANCEL

source ~/.bash_profile flutter clean Command exited with code 128: git fetch --tags Standard error: 错误:RPC 失败。curl 92 HTTP/2 stream 5 was not closed cleanly: CANCEL (err 8) 错误:预期仍然需要 2737 个字节的正文 fetch-pack: unexpec…

GPT革命:AI如何重塑我们的未来!

GPT革命:AI如何重塑我们的未来! 😄生命不息,写作不止 🔥 继续踏上学习之路,学之分享笔记 👊 总有一天我也能像各位大佬一样 🏆 博客首页 怒放吧德德 To记录领地 🌝分享…

普通人也能弄的 16 个AI搞钱副业,门槛低,易上手!

大家好,我是灵魂画师向阳 本期给大家分享的是利用AI 做副业的一些方法,大家可以挑选适合自己的赛道去搞钱 现在是人工智能时代,利用好AI 工具,可以降低普通人做副业的门槛,同时也能提高工作效率, 因此AI …

【微机原理与汇编语言】循环程序设计

一、实验目的 1.熟练掌握8086/8088常用汇编指令的使用方法 2.熟练掌握循环结构程序编程技巧 3.熟练掌握汇编语言程序运行调试方法 二、实验要求 认真分析实验题目,设计程序流程图,独立完成代码编写及运行调试。 三、实验题目 给出不大于255的十个…

图片裁剪与上传处理方案 —— 基于阿里云 OSS 处理用户资料

目录 01: 通用组件:input 构建方案分析 02: 通用组件:input 构建方案 03: 构建用户资料基础样式 04: 用户基本资料修改方案 05: 处理不保存时的同步问题 06: 头像修改方案流程分析 07: 通用组件:Dialog 构建方案分析 08: 通用组件&…

计算机组成原理·考点知识点整理

根据往年考试题,对考点和知识点的一个整理。 校验编码 码距 一种编码的最小码距,其实就是指这种编码的码距。码距有两种定义: 码距所描述的对象含义 2 2 2 个特定的码其二进制表示中不同位的个数一种编码这种编码中任意 2 2 2 个合法编码的…

【linux进程控制(三)】进程程序替换--如何自己实现一个bash解释器?

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:Linux从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学更多操作系统知识   🔝🔝 进程程序替换 1. 前言2. exec…

【JMeter接口自动化】第8讲 Fiddler抓包Jmeter

1)配置好Fiddler 设置Fiddler-Tools-Options-HTTPS 设置Fiddler-Tools-Options-Connections,设置端口为8888 2)查看IP 在CMD中输入ipconfig 查看IP地址 3)配置Jmeter Http请求——基本,设置Http请求,使用…

轻量管理内核复杂级别的项目

在嵌入式开发中,管理大型项目(例如Linux内核)往往是一个复杂的过程。常规的版本控制系统如Git在处理小型项目时非常高效,但面对庞大的代码库时可能会显得笨重且占用大量存储空间。本文将介绍几种轻量级的方法来管理内核级别的项目…

Python 快速入门

1. 语言基础 1.1 数据类型与变量 Python 是一门动态类型语言,这意味着你不需要显式声明变量的类型。Python 解释器会根据你赋予变量的值自动推断其类型。这使得 Python 代码简洁易懂,但同时也需要注意一些潜在的问题。 1.1.1 Python 数据类型概述 Py…

408链表的创建和初始化

首先第一个头文件,定义结构体类型 typedef struct LNode {int data;struct LNode* next; }LNode,*LinkList; //可能作为第一次写c语言的小伙伴看不懂这一段typedef是如何定义的 //基本的解释如下所示 //typedef struct LNode LNode; //typedef struct LNode* LinkL…

apex代码发送邮件时进行抄送

在 Salesforce 中使用 Apex 代码发送电子邮件时,可以通过 ccAddresses 属性来添加抄送(CC)收件人。以下是一个示例代码,展示了如何使用 Messaging.SingleEmailMessage 类来发送带有抄送的电子邮件。 示例代码 public class Emai…

北航数据结构与程序设计第四次作业选填题复习

首先都是线性的,线性包括顺序和链式,栈和队都可以用两种方式实现。栈只能存于栈顶取于栈顶,队列先进先出,因此存取点是固定的。 函数栈帧创建原理 画图即可。 A.显然不行,5如果第一个出来说明5是最后一个进的&#xf…

Lambda表达式与函数式工具在Python中的应用详解

目录 一、引言 二、Lambda表达式 Lambda表达式的定义 Lambda表达式的使用场景 Lambda表达式的示例 三、函数式工具 map()函数 filter()函数 reduce()函数 itertools模块 functools模块 四、Lambda表达式与函数式工具的结合使用 五、Lambda表达式与函数式工具的注意…

C语言面试题(拓展)

1、字符串中获取最长无重复字符子串。 要在字符串中找到最长的无重复字符的子串,可以使用滑动窗口技术。滑动窗口通过两个指针来表示当前窗口的起始和结束位置,并且维护一个哈希表来记录字符及其最后出现的位置,以此来确保字符不重复。 以下…

【云岚家政】-day00-开发环境配置

文章目录 1 开发工具版本2 IDEA环境配置2.1 编码配置2.2 自动导包设置2.3 提示忽略大小写2.4 设置 Java 编译级别 3 Maven环境3.1 安装Maven3.2 配置仓库3.3 IDEA中配置maven 4 配置虚拟机4.1 导入虚拟机4.2 问题 5 配置数据库环境5.1 启动mysql容器5.2 使用MySQL客户端连接数据…