日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

歷史上的今天

今天是:2025年07月23日(星期三)

2019年07月23日 | stm32以太網(wǎng)LWIP學(xué)習(xí)筆記之UDP通信

發(fā)布者:JoyfulSunflower 來源: eefocus關(guān)鍵字:stm32  以太網(wǎng)  LWIP  UDP通信 手機看文章 掃描二維碼
隨時隨地手機看文章

初始化配置步驟

第一:硬件底層DMA緩存以及以太網(wǎng)內(nèi)存初始化


if(ETH_Mem_Malloc())return 1;       //內(nèi)存申請失敗

    if(lwip_comm_mem_malloc())return 1; //內(nèi)存申請失敗


u8 ETH_Mem_Malloc(void)

    DMARxDscrTab=mymalloc(SRAMIN,ETH_RXBUFNB*sizeof(ETH_DMADESCTypeDef));//申請內(nèi)存

    DMATxDscrTab=mymalloc(SRAMIN,ETH_TXBUFNB*sizeof(ETH_DMADESCTypeDef));//申請內(nèi)存  

    Rx_Buff=mymalloc(SRAMIN,ETH_RX_BUF_SIZE*ETH_RXBUFNB);   //申請內(nèi)存

    Tx_Buff=mymalloc(SRAMIN,ETH_TX_BUF_SIZE*ETH_TXBUFNB);   //申請內(nèi)存

    if(!DMARxDscrTab||!DMATxDscrTab||!Rx_Buff||!Tx_Buff)

    {

        ETH_Mem_Free();

        return 1;   //申請失敗

    }   

    return 0;       //申請成功

}


//lwip中mem和memp的內(nèi)存申請

//返回值:0,成功;

//    其他,失敗

u8 lwip_comm_mem_malloc(void)

{

    u32 mempsize;

    u32 ramheapsize; 

    mempsize=memp_get_memorysize();         //得到memp_memory數(shù)組大小

    memp_memory=mymalloc(SRAMIN,mempsize);  //為memp_memory申請內(nèi)存

    ramheapsize=LWIP_MEM_ALIGN_SIZE(MEM_SIZE)+2*LWIP_MEM_ALIGN_SIZE(4*3)+MEM_ALIGNMENT;//得到ram heap大小

    ram_heap=mymalloc(SRAMIN,ramheapsize);  //為ram_heap申請內(nèi)存 

    if(!memp_memory||!ram_heap)//有申請失敗的

    {

        lwip_comm_mem_free();

        return 1;

    }

    return 0;   

 }


第二步:網(wǎng)卡硬件初始化


LAN8720_Init()


第三步:以太網(wǎng)初始化


lwip_init();


第四步:設(shè)置IP地址


//靜態(tài):

IP4_ADDR(&ipaddr,192.168.1.100);

IP4_ADDR(&netmask,192.168.1.1);

IP4_ADDR(&gw,255.255.255.0);


//動態(tài)暫時為0,待會自動獲?。?p>IP4_ADDR(&ipaddr,0.0.0.0);

IP4_ADDR(&netmask,0.0.0.0);

IP4_ADDR(&gw,0.0.0.0);


第五步:添加網(wǎng)卡


Netif_Init_Flag=netif_add(&lwip_netif,&ipaddr,&netmask,&gw,NULL,ðernetif_init,ðernet_input);

1

第六步:如果為動態(tài)IP則開啟動態(tài)IP服務(wù)


lwipdev.dhcpstatus=0;   //DHCP標記為0

    dhcp_start(&lwip_netif);    //開啟DHCP服務(wù)


第七步:設(shè)置默認網(wǎng)口,并打開


netif_set_default(&lwip_netif); //設(shè)置netif為默認網(wǎng)口

        netif_set_up(&lwip_netif);      //打開netif網(wǎng)口


第八步:等待動態(tài)獲取IP,如果獲取失敗,則使用靜態(tài)IP


while((lwipdev.dhcpstatus!=2)&&(lwipdev.dhcpstatus!=0XFF))//等待DHCP獲取成功/超時溢出

    {

        lwip_periodic_handle();

    }


//LWIP輪詢?nèi)蝿?wù)

void lwip_periodic_handle()

{

#if LWIP_TCP

    //每250ms調(diào)用一次tcp_tmr()函數(shù)

  if (lwip_localtime - TCPTimer >= TCP_TMR_INTERVAL)

  {

    TCPTimer =  lwip_localtime;

    tcp_tmr();

  }

#endif

  //ARP每5s周期性調(diào)用一次

  if ((lwip_localtime - ARPTimer) >= ARP_TMR_INTERVAL)

  {

    ARPTimer =  lwip_localtime;

    etharp_tmr();

  }


#if LWIP_DHCP //如果使用DHCP的話

  //每500ms調(diào)用一次dhcp_fine_tmr()

  if (lwip_localtime - DHCPfineTimer >= DHCP_FINE_TIMER_MSECS)

  {

    DHCPfineTimer =  lwip_localtime;

    dhcp_fine_tmr();

    if ((lwipdev.dhcpstatus != 2)&&(lwipdev.dhcpstatus != 0XFF))

    { 

      lwip_dhcp_process_handle();  //DHCP處理

    }

  }


  //每60s執(zhí)行一次DHCP粗糙處理

  if (lwip_localtime - DHCPcoarseTimer >= DHCP_COARSE_TIMER_MSECS)

  {

    DHCPcoarseTimer =  lwip_localtime;

    dhcp_coarse_tmr();

  }  

#endif

}


void lwip_dhcp_process_handle(void)

{

    u32 ip=0,netmask=0,gw=0;

    switch(lwipdev.dhcpstatus)

    {

        case 0:     //開啟DHCP

            dhcp_start(&lwip_netif);

            lwipdev.dhcpstatus = 1;     //等待通過DHCP獲取到的地址

            printf("正在查找DHCP服務(wù)器,請稍等...........rn");  

            break;

        case 1:     //等待獲取到IP地址

        {

            ip=lwip_netif.ip_addr.addr;     //讀取新IP地址

            netmask=lwip_netif.netmask.addr;//讀取子網(wǎng)掩碼

            gw=lwip_netif.gw.addr;          //讀取默認網(wǎng)關(guān) 


            if(ip!=0)           //正確獲取到IP地址的時候

            {

                lwipdev.dhcpstatus=2;   //DHCP成功

                printf("網(wǎng)卡en的MAC地址為:................%d.%d.%d.%d.%d.%drn",lwipdev.mac[0],lwipdev.mac[1],lwipdev.mac[2],lwipdev.mac[3],lwipdev.mac[4],lwipdev.mac[5]);

                //解析出通過DHCP獲取到的IP地址

                lwipdev.ip[3]=(uint8_t)(ip>>24); 

                lwipdev.ip[2]=(uint8_t)(ip>>16);

                lwipdev.ip[1]=(uint8_t)(ip>>8);

                lwipdev.ip[0]=(uint8_t)(ip);

                printf("通過DHCP獲取到IP地址..............%d.%d.%d.%drn",lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]);

                //解析通過DHCP獲取到的子網(wǎng)掩碼地址

                lwipdev.netmask[3]=(uint8_t)(netmask>>24);

                lwipdev.netmask[2]=(uint8_t)(netmask>>16);

                lwipdev.netmask[1]=(uint8_t)(netmask>>8);

                lwipdev.netmask[0]=(uint8_t)(netmask);

                printf("通過DHCP獲取到子網(wǎng)掩碼............%d.%d.%d.%drn",lwipdev.netmask[0],lwipdev.netmask[1],lwipdev.netmask[2],lwipdev.netmask[3]);

                //解析出通過DHCP獲取到的默認網(wǎng)關(guān)

                lwipdev.gateway[3]=(uint8_t)(gw>>24);

                lwipdev.gateway[2]=(uint8_t)(gw>>16);

                lwipdev.gateway[1]=(uint8_t)(gw>>8);

                lwipdev.gateway[0]=(uint8_t)(gw);

                printf("通過DHCP獲取到的默認網(wǎng)關(guān)..........%d.%d.%d.%drn",lwipdev.gateway[0],lwipdev.gateway[1],lwipdev.gateway[2],lwipdev.gateway[3]);

            }else if(lwip_netif.dhcp->tries>LWIP_MAX_DHCP_TRIES) //通過DHCP服務(wù)獲取IP地址失敗,且超過最大嘗試次數(shù)

            {

                lwipdev.dhcpstatus=0XFF;//DHCP超時失敗.

                //使用靜態(tài)IP地址

                IP4_ADDR(&(lwip_netif.ip_addr),lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]);

                IP4_ADDR(&(lwip_netif.netmask),lwipdev.netmask[0],lwipdev.netmask[1],lwipdev.netmask[2],lwipdev.netmask[3]);

                IP4_ADDR(&(lwip_netif.gw),lwipdev.gateway[0],lwipdev.gateway[1],lwipdev.gateway[2],lwipdev.gateway[3]);

                printf("DHCP服務(wù)超時,使用靜態(tài)IP地址!rn");

                printf("網(wǎng)卡en的MAC地址為:................%d.%d.%d.%d.%d.%drn",lwipdev.mac[0],lwipdev.mac[1],lwipdev.mac[2],lwipdev.mac[3],lwipdev.mac[4],lwipdev.mac[5]);

                printf("靜態(tài)IP地址........................%d.%d.%d.%drn",lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]);

                printf("子網(wǎng)掩碼..........................%d.%d.%d.%drn",lwipdev.netmask[0],lwipdev.netmask[1],lwipdev.netmask[2],lwipdev.netmask[3]);

                printf("默認網(wǎng)關(guān)..........................%d.%d.%d.%drn",lwipdev.gateway[0],lwipdev.gateway[1],lwipdev.gateway[2],lwipdev.gateway[3]);

            }

        }

        break;

        default : break;

    }

}

#endif 


第九步:測試


udp_demo_test(); 

1

UDP協(xié)議測試的步驟

第一步:如果對方IP是動態(tài)的,則第一步為設(shè)置遠程IP


udp_demo_set_remoteip();

//部分代碼

/*前三一般較為固定,實際是只需設(shè)置第四部分*/

lwipdev.remoteip[0]=lwipdev.ip[0]; //192

lwipdev.remoteip[1]=lwipdev.ip[1]; //168

lwipdev.remoteip[2]=lwipdev.ip[2]; //1 


while(1)

    {

        key=KEY_Scan(0);

        if(key==WKUP_PRES)break;

        else if(key)

        {

            if(key==KEY0_PRES)lwipdev.remoteip[3]++;//IP增加

            if(key==KEY2_PRES)lwipdev.remoteip[3]--;//IP減少

            LCD_ShowxNum(xoff,150,lwipdev.remoteip[3],3,16,0X80);//顯示新IP

        }

    }


第二步:創(chuàng)建DCP控制塊


udppcb=udp_new();


第三步:連接指定IP,指定端口


err=udp_connect(udppcb,&rmtipaddr,UDP_DEMO_PORT);//UDP客戶端連接到指定IP地址和端口號的服務(wù)器


第四步:綁定本地IP和端口號


err=udp_bind(udppcb,IP_ADDR_ANY,UDP_DEMO_PORT);//綁定本地IP地址與端口號

1

第五步:注冊接收回調(diào)函數(shù),只要接收到數(shù)據(jù),這個回調(diào)函數(shù)會被lwip內(nèi)核調(diào)用


udp_recv(udppcb,udp_demo_recv,NULL);//注冊接收回調(diào)函數(shù) 

//回調(diào)函數(shù)的編寫


void udp_demo_recv(void *arg,struct udp_pcb *upcb,struct pbuf *p,struct ip_addr *addr,u16_t port)

{

    u32 data_len = 0;

    struct pbuf *q;

    if(p!=NULL) //接收到不為空的數(shù)據(jù)時

    {

        memset(udp_demo_recvbuf,0,UDP_DEMO_RX_BUFSIZE);  //數(shù)據(jù)接收緩沖區(qū)清零

        for(q=p;q!=NULL;q=q->next)  //遍歷完整個pbuf鏈表

[1] [2]
關(guān)鍵字:stm32  以太網(wǎng)  LWIP  UDP通信 引用地址:stm32以太網(wǎng)LWIP學(xué)習(xí)筆記之UDP通信

上一篇:STM32_IAP遠程升級及C#上位機
下一篇:STM32移植lwip之建立tcp客戶端

推薦閱讀

中車株洲所旗下中車時代電氣上海中車艾森迪海洋裝備有限公司生產(chǎn)的全球最大馬力無人遙控潛水器近日在上海下線。這是中國中車并購英國SMD公司后,在國內(nèi)研制生產(chǎn)的首臺套作業(yè)級深海裝備。它能潛入3000米海底,提起4噸重貨物,功率達250馬力,彌補了我國在深海作業(yè)設(shè)備上的短板,能進一步提升我國在海洋救撈,海底施工等方面的深海作業(yè)能力。無人遙控潛水器...
隨著人工智能、物聯(lián)網(wǎng)和AR等技術(shù)的發(fā)展,這些流行詞正轉(zhuǎn)變?yōu)殚L期國家經(jīng)濟潛力的基礎(chǔ),全球經(jīng)濟處于另一個關(guān)鍵時刻。而這種經(jīng)濟增長的催化劑則來自無線通信技術(shù)的新標準——5G。今年中國頒發(fā)了5G的商業(yè)牌照,可以說中國已經(jīng)進入了5G的商業(yè)元年。5G從標準設(shè)立之初就是以商務(wù)場景應(yīng)用,高速率、低時延、大帶寬,可以說給產(chǎn)業(yè)界帶來巨大的變化。 2019集微半導(dǎo)...
STM8S系列觸摸按鍵軟件庫基本結(jié)構(gòu)如下圖所示,分成下面幾個部分:基于上述軟件庫架構(gòu)1) 用戶軟件通過API接口調(diào)用相應(yīng)的函數(shù)啟動按鍵信號采集,通過訪問相應(yīng)的變量來獲得按鍵 的狀態(tài),以及通過對一些控制變量的配置來修改觸摸式按鍵的工作參數(shù)。2) 后處理部分是STM8S系列軟件庫的核心部分,包含了一些列的校準,濾波算法。通過ECS (環(huán)境處理系統(tǒng))的...
7月22日,上能電氣宣布寧夏同心縣10GW高效智能逆變器工廠正式投產(chǎn),標志著上能電氣產(chǎn)能擴張項目落地再提速。吳忠市委副書記、同心縣委書記王偉,同心縣委副書記、縣人民政府代縣長楊春燕,中國核工業(yè)集團副總經(jīng)理申彥鋒,中核匯能有限公司副總經(jīng)理肖亞飛,上能電氣董事長吳強,上能電氣副總裁、CTO李建飛等三方多位領(lǐng)導(dǎo)共同出席了投產(chǎn)儀式,儀式由同心縣委...

史海拾趣

問答坊 | AI 解惑

單片機基礎(chǔ)知識

單片機基礎(chǔ)知識…

查看全部問答∨

想買套ARM板子來學(xué)習(xí)學(xué)習(xí),請大家推薦下

想買套ARM板子來學(xué)習(xí)學(xué)習(xí),請大家推薦下…

查看全部問答∨

linux系統(tǒng)控制兩個gprs modem進行tcp/ip通信的問題

有兩個gprs modem,都可以通過串口發(fā)送at命令撥上gprs,相當(dāng)建立了兩個連接。作為客戶端去連接服務(wù)端時,怎么控制選擇那個modem的連接去通信呢? 即是說怎樣選擇連接通道去建立套接字,好像socket建立只能指定ip和端口,沒有選擇物理接口的參數(shù)吧…

查看全部問答∨

WINCE6.0 CETK編譯問題

在做CETK作業(yè)的時候,發(fā)現(xiàn)CETK的代碼有問題,想修改一下! 可是改過以后,發(fā)現(xiàn)竟不知道怎么編譯!哎! 請高手指點一下!怎么樣才能編譯CETK的代碼!…

查看全部問答∨

sirf and nmea 轉(zhuǎn)換

我現(xiàn)在在做一個nmea 和sirf 的轉(zhuǎn)換工具, 但是目前一直轉(zhuǎn)換不成功, 請各位分析一下原因。 根據(jù)NMEA Reference Manual.pdf 文章中提到, 從nmea 轉(zhuǎn)換到sirf 的命令如下: $PSRF100,0,9600,8,1,0*0C, 由于我機器上轉(zhuǎn)到到sirf 后的baunrate 是5760 ...…

查看全部問答∨

STM32串口收數(shù)后回發(fā)時出現(xiàn)問題

while (1)     {     if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)     {   GPIO_ResetBits(GPIOB, GPIO_Pin_9);       j = USART_ReceiveData(USART3);&n ...…

查看全部問答∨

msp430菜鳥求教,端口;

P5DIR |= 0x02; // Set P5.1 to output direction 我要怎么才能知道P5DIR的方向,和 它指的是哪個端口呢; 0x02是00000010; P5DIR是0x0032,即00110010嗎; 那P5DIR就是 00000010 00110010 ------------- 00110010 ...…

查看全部問答∨

無線通信的大蝦請進 求助

以前在實驗室移動信號在滿格和四格之間,自從聯(lián)通在相隔不到50米的地方的樓頂建的個信號發(fā)射設(shè)備(不知道是否基站),移動信號就幾乎沒信號(極少地方有點信號),求問是否有很大輻射,看到網(wǎng)上回答猜測是否阻塞式干擾 //GSM中,即使既不同頻也不鄰 ...…

查看全部問答∨

RTL Viewer和Technology Map Viewer區(qū)別?

請教大家,RTL Viewer和Technology Map Viewer區(qū)別?…

查看全部問答∨

【轉(zhuǎn)】無電解電容LED光引擎的缺點和問題

迄今為止,“光引擎”還沒有一個非常嚴格而又確切的定義,以致不少讀者還不知道到底什么是光引擎。有人把它定義為“LED光引擎(light engine)是指包含LED封裝(組件)或LED數(shù)組(模塊)、LED驅(qū)動器、以及其它亮度、熱學(xué)、機械和電氣組件的整體組合。該裝 ...…

查看全部問答∨
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved