lwip接收檔案 stm32 接收資料

2021-10-13 20:45:51 字數 1660 閱讀 5480

參考火哥的lwip教程,還有

啊啊

增加了對lwip的初始化, lwip_init函式用於初始化 lwip協議棧,一般在 main 函式中呼叫。首先是記憶體相關初 始化,mem_init函式是動態記憶體堆初始化,memp_init函式是儲存池初始化,lwip是實現 記憶體的高效利用,內部需要不同形式的記憶體管理模式。 還有就是對靜態ip位址,mac位址,掩碼,閘道器的設定。如下:

然後就是新增了eth_checkframereceived,檢測接收到資料報的函式。然後對資料報進行相應的處理。

lwip_pkt_handle 函式用於從乙太網儲存器讀取乙個乙太網幀並將其傳送給 lwip,它 在接收到乙太網幀時被呼叫,它是直接呼叫 ethernetif_input 函式實現的,該函式定義在 ethernetif.c檔案中。

接著是乙個被無限迴圈呼叫的函式:lwip_periodic_handle

lwip_periodic_handle 函式是乙個必須被無限迴圈呼叫的 lwip支援函式,一般在 main函式的無限迴圈中呼叫,主要功能是為 lwip各個模組提供時間並查詢鏈路狀態,該 函式有乙個形參,用於指示當前時間,單位為 ms。 對於 tcp功能,每 250ms執行一次 tcp_tmr函式;對於 arp(位址解析協議),每 5s 執 行一次 etharp_tmr函式;對於鏈路狀態檢測,每 1s 執行一次 eth_checklinkstatus 函式; 對於 dhcp功能,每 500ms執行一次 dhcp_fine_tmr函式,如果 dhcp處於dhcp_start 或 dhcp_wait_address 狀態就執行 lwip_dhcp_process_handle 函式,對於 dhcp功 能,還有每 60s 執行一次 dhcp_coarse_tmr函式。

然後用wireshark抓包的時候,比較奇怪。如下:

奇怪的地方就是,我初始化的時候只傳送了上面的第二個資料報,也就是192.168.2.240的(使用dp83848send(mydata, 60); 傳送的),第乙個資料報是192.168.1.122發的,這個我並沒有傳送,按邏輯推算,這應該是 在 lwip_init(); 初始化ip,mac的時候傳送的。而且兩個資料報都是請求包,也就是opcode=1。找了一下沒找到程式是在什麼時候傳送出去的。。

最後串列埠助手輸出如下:

也就是收到資料報了,可是並不知道收到了啥。

顯然,我這個程式設計得不合理,本來以為ping一下會觸發lwip_periodic_handle 裡的字串列印函式的,結果想太多了。 沒錯,接著再設計乙個程式,要把收到的資料報列印出來。

在區域網中ping 微控制器ip的報文:

注意,這裡ping是乙個icmp報文,data裡面基本就是26個字母。

然後

TCP接收檔案隨筆

tcp接收檔案隨筆 由於接收不及時,導致tcp接收快取區黏包,我需要對接收到的資料進行拆包,當然這需要我們傳送的資料報 包含 包頭 資料型別 負載長度 負載 包尾 校驗碼 最簡單的一包資料就這樣形成。我們對接收到的資料buffer進行遍歷,分包,最好先做乙個狀態機,方便自己清晰的注意到處於資料報的哪...

STM32 匯流排空閒 DMA 方式接收

stm32 的 usart 支援乙個匯流排空閒中斷,如果這個中斷和dma配合,能夠較好的實現接收不定長資料的功能。匯流排空閒中斷是在檢測到在接收資料後,資料匯流排上乙個位元組的時間內,沒有再接到資料後發生。也就是rxne位被置位之後,才開始檢測,只被置位一次,除非再次檢測到rxne位被置位,然後才開...

STM32串列埠接收策略

如果我們需要接收乙個序列協議,怎麼做呢?先放到緩衝區然後再檢查標誌位是一種思路。道理簡單,關鍵要看怎麼設計。這裡介紹的方法是巧妙利用定時器,與串列埠中斷進行耦合,得到一種魯棒的接收方法。具體 開啟定時器與串列埠中斷 首先用示波器檢視完整幀所需要的時間,並且設定為timmax。定時器以適當的中斷頻率開...