上位機圖像處理和嵌入式模塊部署(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.pswp.cn/web/22868.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/22868.shtml
英文地址,請注明出處:http://en.pswp.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客戶端連接數據…