久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3387|回復(fù): 0
收起左側(cè)

ENC28J60的UDP數(shù)據(jù)接收

[復(fù)制鏈接]
ID:82781 發(fā)表于 2015-6-13 16:56 | 顯示全部樓層 |閱讀模式
指定雙方IP地址
指定雙方端口號
就可以進(jìn)行UDP通信了
程序里面的接收文件如下:
  1. *********************************

  2. 接收數(shù)據(jù)包所有程序

  3. ************************************/
  4. #include "ARP.h"
  5. #include "ENC28J60_Buff_Operation.h"
  6. #include "ENC28J60_Receive.h"
  7. #include "ENC28J60_SPI.h"
  8. #include "UART.H"
  9. #include "ENC28J60_Send_Receive.h"
  10. uchar flage=0;//釋放FIFO的上部分還是下半部分FLAGE=0,釋放下半部分FLAGE=1釋放上半部分

  11. static xdata uint Receive_Next_Add_Pointer;//下個數(shù)據(jù)包的開始地址指針
  12. static xdata uint Receive_Now_Add_Pointer;//當(dāng)前地址指針
  13. static xdata uint Receive_MAC_Type;//數(shù)據(jù)包的類型
  14. static xdata uint Receive_Size_Packet;//數(shù)據(jù)包的大小
  15. static xdata uint Receive_Add_Pointer_MSB=0;
  16. static xdata uint Receive_Add_Pointer_LSB=0;
  17. static xdata uint Receive_MAC_Type_MSB;    /*接收數(shù)據(jù)包的臨時地址指針緩沖區(qū)*/
  18. static xdata uint Receive_MAC_Type_LSB;

  19. static xdata uint Receive_ARP_Type_MSB;
  20. static xdata uint Receive_ARP_Type_LSB;
  21. static xdata uint Receive_ARP_Type;
  22. xdata uchar Receive_Data[20];//接收到的UDP數(shù)據(jù)
  23. /*****************************


  24. 接收數(shù)據(jù)包

  25. 45頁
  26. *******************************/
  27. void Receiving_data_packet()
  28. {     uchar d2;

  29. Receive_Next_Add_Pointer=0;//緩沖區(qū)的數(shù)據(jù)包下一個地址指針. 初始化
  30. Receive_Now_Add_Pointer=0x300;//當(dāng)前數(shù)據(jù)緩沖區(qū)地址指針.


  31. ///檢測EPKTCNT是否為空

  32. while(1)  //死在里面么,這個是故意的
  33.    {

  34. write_ENC28J60_REG_SPI(ECON1,5);//開啟接收
  35.       for(;;)
  36.    {
  37.      d2=read_ENC28J60_REG_SPI(EPKTCNT);//有無數(shù)據(jù)報?
  38. // SendOneByte(d2);
  39.        if(d2>0)break;
  40.     }
  41.    


  42.      READ_N_Packet();//讀數(shù)據(jù)包
  43.   Check_The_remaining_space();//檢查是否釋放緩沖區(qū)
  44.      write_ENC28J60_REG_SPI(ECON2,0x40);//PACKET減一
  45.   
  46.        // SendOneByte(Receive_Add_Pointer_MSB);
  47.      //SendOneByte(Receive_Add_Pointer_LSB);

  48.   //SendOneByte(a);
  49. // SendOneByte(a<<8);

  50.    }
  51. }
  52.   /*******************************

  53.    檢查剩余空間,如果不夠就釋放空間
  54.    是這樣的流程:
  55.    首先解釋ERXRDPTL和ERXRDPTH這個寄存器是干什么的呢?他就是說硬件通過ERXWRPTL和ERXWRPTH寫入指定的緩存
  56.    那么他在那里停止呢?緩存器的底部?錯,這個接收緩沖區(qū)就是一個FIFO,他是循環(huán)的存儲結(jié)構(gòu),所以他在到底部
  57.    時不會停會跳到開始字節(jié)繼續(xù),那么這樣一來他不就停不下了嗎?顯然芯片設(shè)計的人不允許他這樣所以設(shè)置了這個
  58.    寄存器ERXRDPTL和ERXRDPTH,他就是停止一旦硬件寫到他的地址以后的數(shù)據(jù)他不在接收,全部丟棄,所以要想全部
  59.    一個包不少的把以太網(wǎng)上的數(shù)據(jù)接收回來就要周期性的更新這個地址,也就是說他需要程序自己控制而不要干涉他
  60.    否則你將不會得到連續(xù)的數(shù)據(jù)包,我程序里這樣設(shè)計的:首先在初始化設(shè)定接收緩存的開始地址和結(jié)束地址分別是
  61.    從0x300-0x1fff這7KB的區(qū)域全部是接收緩沖區(qū)(FIFO),初始化后ERXWRPTL和ERXWRPTH這個指針自動更新對準(zhǔn)0X300
  62.    這個寫指針是硬件控制的,用戶控制不了,所以呢不用管,只要在乎這個ERXRDPTL和ERXRDPTH地址指針,這個指針我首先
  63.    付給他一個地址0x0e7e,也就是差不多在這個FIFO的一半的位置什么意思呢?表示如果我不更新這個指針的話那么硬件從0X300寫到
  64.    0X0E7E就不在寫了,所以我要一邊讀下一個包的地址一邊計算他逼近的距離,當(dāng)小與400個字節(jié)的時候就把這個指針向下移動到0X1FFF
  65.    也就是FIFO的底部,這時候硬件就可以繼續(xù)向下,但是這時如果不更新這個指針,他就在0X1FFF的時候有就停止了,所以采取同樣的辦法
  66.    就是計算逼近距離小于400字節(jié)就更新指針到原來的位置0X0E7E,他又可以繼續(xù)寫了,就這樣有數(shù)據(jù)包就收數(shù)據(jù)包永遠(yuǎn)追不上指針,就像小時候
  67.    玩的一個游戲一個棍兩頭各一個動物轉(zhuǎn)動他們他們永遠(yuǎn)不相遇,就是這個道理,至于處理數(shù)據(jù)包這個就被抽象出來了,你想怎么處理就怎么處理
  68.    2011年11月23日
  69.   無錫第五項目部
  70.    王均偉

  71.   ******************************/

  72. /***********************

  73.    檢查是否釋放緩沖區(qū)函數(shù)
  74.   這個函數(shù)就是要不斷的檢查接收緩
  75.   存數(shù)據(jù)是不是達(dá)到臨界指針,到了
  76.   就要馬上讓指針下移以免數(shù)據(jù)重疊。
  77. *************************/                  /**************************/
  78. void Check_The_remaining_space()           //讀取當(dāng)前終止指針的值
  79. {     uint m,l,d,d2;           /**************************/

  80.   l=read_ENC28J60_REG_SPI(ERXRDPTL);
  81.   m=read_ENC28J60_REG_SPI(ERXRDPTH);
  82. d2=((l&0x00ff)+((m<<8)&0xff00));          /*****************************/
  83.     d=d2-Receive_Next_Add_Pointer; //              下一個數(shù)據(jù)包的地址和當(dāng)前終止地址作比較
  84.                 //看看是否接近到離終止指針400個字節(jié)的地方?
  85.                 //還有這個Flage表示以0X0E7E為界的緩存的釋放,
  86.                 //FLAGE=0表示釋放下半部分FIFO(0x0e7e-0x1fff)
  87.                 //FLAGE=1表示釋放上半部分FIFO(0X1FFF-0X0E7E)
  88.                  /***************************/
  89.   if((d<400)&(flage==0))//如果flage=0和
  90.   {
  91.    write_ENC28J60_REG_SPI(ERXRDPTL,0xff);
  92. write_ENC28J60_REG_SPI(ERXRDPTH,0x1f);
  93. flage=1;

  94.   }
  95.   else
  96.   if((d<400)&(flage==1))//如果flage=1和空間不足
  97.   {
  98.    write_ENC28J60_REG_SPI(ERXRDPTL,0x7e);
  99. write_ENC28J60_REG_SPI(ERXRDPTH,0x0e);
  100. flage=0;

  101.   }

  102. }

  103.    
  104. /************************************************
  105. 讀取數(shù)據(jù)包和處理將在這里進(jìn)行
  106. ************************************************/

  107. void READ_N_Packet()
  108. {   
  109.     /***********************數(shù)據(jù)處理開始*********************************************/   
  110.    uint i;
  111.    
  112.           /*定義接收到的包相關(guān)信息
  113.           比如MAC、源地址IP。目標(biāo)IP啥的
  114.           用來判斷是否需要ARP應(yīng)答
  115.           */
  116.     xdata uchar Receive_MAC_Source_add_MAC[6];
  117.     xdata uchar Receive_ARP_Frame_sender_IP[4];
  118.     xdata uchar Receive_ARP_Frame_Target_IP[4];
  119.     xdata uchar Receive_IP_Frame_Type;//定義IP協(xié)議類型
  120.    
  121.     xdata uchar Receive_Source_Port_MSB;
  122.     xdata uchar Receive_Source_Port_LSB;
  123.     xdata uchar Receive_Destination_MSB;
  124.     xdata uchar Receive_Destination_LSB;
  125.     xdata uint  Receive_Destination;
  126.     xdata uint  Receive_Source_Port;
  127.     xdata uchar Receive_Length_MSB;
  128.     xdata uchar Receive_Length_LSB;
  129.     xdata uint  Receive_Length;//UDP數(shù)據(jù)長度

  130.          //這都是從接收的數(shù)據(jù)包檢索出的數(shù)據(jù),讀出來存變量*/
  131.            /**這里解釋一下read_buffer_add(Receive_Now_Add_Pointer+18)為什么是18,
  132.            首先抓包后的數(shù)據(jù)內(nèi)個MAC層的類型位置在12字節(jié)上,而這里要注意,ENC28J60內(nèi)部
  133.            是有個緩存他要先把下一數(shù)據(jù)包的存放地址寫進(jìn)去,占兩個字節(jié),然后是4個字節(jié)的
  134.            狀態(tài)字,加起來是6個字節(jié),所以要在ENC28J60的接收緩存中找到MAC幀類型就得要加上6
  135.            所以這里是18,注意是ENC28J60,不是PC,詳細(xì)應(yīng)該看手冊的45頁。。。。
  136.            2012年3月1日
  137.            于日照高科園
  138.            王均偉
  139.            **/
  140.             Receive_MAC_Type_MSB=read_buffer_add(Receive_Now_Add_Pointer+18); /***讀取數(shù)據(jù)包的類型*****/
  141.         Receive_MAC_Type_LSB=read_buffer_add(Receive_Now_Add_Pointer+19);
  142.      Receive_MAC_Type=( ((Receive_MAC_Type_MSB<<8)&0xff00)+(Receive_MAC_Type_LSB&0x00ff));
  143.       
  144.      Receive_IP_Frame_Type=read_buffer_add(Receive_Now_Add_Pointer+29);//讀取IP部首的協(xié)議

  145.      Receive_Add_Pointer_MSB=read_buffer_add(Receive_Now_Add_Pointer+1);
  146.               Receive_Add_Pointer_LSB=read_buffer_add(Receive_Now_Add_Pointer);
  147.      Receive_Next_Add_Pointer=(((Receive_Add_Pointer_MSB<<8)&0xff00)+(Receive_Add_Pointer_LSB&0x00ff)); //計算下一個數(shù)據(jù)包的地址
  148.      Receive_ARP_Type_MSB=read_buffer_add(Receive_Now_Add_Pointer+26); /***讀取數(shù)據(jù)包的操作*****/
  149.         Receive_ARP_Type_LSB=read_buffer_add(Receive_Now_Add_Pointer+27);
  150.      Receive_ARP_Type=( ((Receive_ARP_Type_MSB<<8)&0xff00)+(Receive_ARP_Type_LSB&0x00ff));
  151.    
  152.      Receive_Size_Packet=(Receive_Next_Add_Pointer-Receive_Now_Add_Pointer);//計算接收到的這個數(shù)據(jù)包的大小
  153.          
  154.         /*************************************
  155.               如果是ARP請求就應(yīng)答
  156.         ***************************************/
  157.      if((Receive_MAC_Type==0x0806)&(Receive_ARP_Type==0x0001))//檢索ARP請求,回應(yīng)
  158.      {
  159.       
  160.         
  161.         
  162.       
  163.       
  164.     Receive_MAC_Source_add_MAC[0]=read_buffer_add(Receive_Now_Add_Pointer+12);
  165.     Receive_MAC_Source_add_MAC[1]=read_buffer_add(Receive_Now_Add_Pointer+13);
  166.     Receive_MAC_Source_add_MAC[2]=read_buffer_add(Receive_Now_Add_Pointer+14);
  167.     Receive_MAC_Source_add_MAC[3]=read_buffer_add(Receive_Now_Add_Pointer+15); //發(fā)送者M(jìn)AC
  168.     Receive_MAC_Source_add_MAC[4]=read_buffer_add(Receive_Now_Add_Pointer+16);
  169.         Receive_MAC_Source_add_MAC[5]=read_buffer_add(Receive_Now_Add_Pointer+17);

  170.    
  171.    Receive_ARP_Frame_sender_IP[0]=read_buffer_add(Receive_Now_Add_Pointer+34);
  172.    Receive_ARP_Frame_sender_IP[1]=read_buffer_add(Receive_Now_Add_Pointer+35);  //發(fā)送者IP
  173.    Receive_ARP_Frame_sender_IP[2]=read_buffer_add(Receive_Now_Add_Pointer+36);
  174.    Receive_ARP_Frame_sender_IP[3]=read_buffer_add(Receive_Now_Add_Pointer+37);
  175.    
  176.    Receive_ARP_Frame_Target_IP[0]=read_buffer_add(Receive_Now_Add_Pointer+44);
  177.    Receive_ARP_Frame_Target_IP[1]=read_buffer_add(Receive_Now_Add_Pointer+45);  //目標(biāo)IP
  178.    Receive_ARP_Frame_Target_IP[2]=read_buffer_add(Receive_Now_Add_Pointer+46);
  179.    Receive_ARP_Frame_Target_IP[3]=read_buffer_add(Receive_Now_Add_Pointer+47);
  180.       /***************************
  181.           如果IP地址是本機(jī)
  182.       ******************************/   
  183.      if((Receive_ARP_Frame_Target_IP[0]==192)&
  184.      (Receive_ARP_Frame_Target_IP[1]==168)&  
  185.      (Receive_ARP_Frame_Target_IP[2]==1) &
  186.      (Receive_ARP_Frame_Target_IP[3]==233))
  187.      {
  188.          
  189.             
  190.         
  191.       /*ARP 應(yīng)答*/     
  192.          
  193.   Send_ARP_Answer_packet( Receive_MAC_Source_add_MAC,Receive_ARP_Frame_sender_IP,Receive_ARP_Frame_Target_IP); //應(yīng)答
  194.       
  195.            
  196.       
  197.      }
  198.      
  199.       }
  200.    
  201.       else
  202.    /******************************************************************************
  203.                   如果不是ARP檢查是不是UDP是就接收數(shù)據(jù)
  204.    *********************************************************************************/
  205.        if((Receive_MAC_Type==0x0800)&(Receive_IP_Frame_Type==0x11))//檢索UDP數(shù)據(jù),接收
  206.      {
  207.               /*這個地方用的上滿ARP的變量由于是局部變量所以
  208.                 可以用,只是用它作為中間量獲取IP,工判斷用
  209.              無實際意義*/
  210.        Receive_ARP_Frame_sender_IP[0]=read_buffer_add(Receive_Now_Add_Pointer+32);
  211.        Receive_ARP_Frame_sender_IP[1]=read_buffer_add(Receive_Now_Add_Pointer+33);  //獲得發(fā)送者IP
  212.        Receive_ARP_Frame_sender_IP[2]=read_buffer_add(Receive_Now_Add_Pointer+34);
  213.        Receive_ARP_Frame_sender_IP[3]=read_buffer_add(Receive_Now_Add_Pointer+35);
  214.       
  215.        Receive_ARP_Frame_Target_IP[0]=read_buffer_add(Receive_Now_Add_Pointer+36);
  216.        Receive_ARP_Frame_Target_IP[1]=read_buffer_add(Receive_Now_Add_Pointer+37);  //獲得目標(biāo)IP
  217.        Receive_ARP_Frame_Target_IP[2]=read_buffer_add(Receive_Now_Add_Pointer+38);
  218.        Receive_ARP_Frame_Target_IP[3]=read_buffer_add(Receive_Now_Add_Pointer+39);

  219.          Receive_Source_Port_MSB=read_buffer_add(Receive_Now_Add_Pointer+40);
  220.          Receive_Source_Port_LSB=read_buffer_add(Receive_Now_Add_Pointer+41); //源端口
  221.          Receive_Source_Port=( ((Receive_Source_Port_MSB<<8)&0xff00)+(Receive_Source_Port_LSB&0x00ff));
  222.             Receive_Destination_MSB=read_buffer_add(Receive_Now_Add_Pointer+42);
  223.          Receive_Destination_LSB=read_buffer_add(Receive_Now_Add_Pointer+43); //目標(biāo)端口
  224.          Receive_Destination=( ((Receive_Destination_MSB<<8)&0xff00)+(Receive_Destination_LSB&0x00ff));
  225.       
  226.                            //數(shù)據(jù)長度
  227.       
  228.            /*如果是192.168.1.89發(fā)來*/
  229.          if((Receive_ARP_Frame_Target_IP[0]==192)
  230.         &&(Receive_ARP_Frame_sender_IP[1]==168)  
  231.         &&(Receive_ARP_Frame_sender_IP[2]==1)
  232.         &&(Receive_ARP_Frame_sender_IP[3]==89)
  233.         
  234.         )
  235.         {
  236.         
  237.             /*如果是8080端口發(fā)到8080的發(fā)來到本機(jī)8080的數(shù)據(jù)接收*/
  238.             if(   (Receive_Source_Port==8080)
  239.                 &&(Receive_Destination==8080)
  240.             )
  241.           {
  242.           /*計算接收到的數(shù)據(jù)字節(jié)*/
  243.            Receive_Length_MSB=read_buffer_add(Receive_Now_Add_Pointer+44); //
  244.                        Receive_Length_LSB=read_buffer_add(Receive_Now_Add_Pointer+45); //
  245.            Receive_Length=((((Receive_Length_MSB<<8)&0xff00)+(Receive_Length_LSB&0x00ff))-8);
  246.             /*讀取數(shù)據(jù)字節(jié)最大20個字節(jié)*/
  247.              for(i=0;i<Receive_Length;i++)
  248.              {
  249.               
  250.             Receive_Data[i]=read_buffer_add(Receive_Now_Add_Pointer+48+i);
  251.             
  252.              }
  253.              P0=Receive_Data[0];
  254.           }

  255.    
  256.    
  257.         
  258.         }
  259.       }

  260.    /***********************數(shù)據(jù)處理結(jié)束*********************************************/


  261.       Receive_Now_Add_Pointer=Receive_Next_Add_Pointer;//下一個數(shù)據(jù)包地址指針重裝如


  262. }
復(fù)制代碼




回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 免费在线精品视频 | 中文字幕在线视频一区二区三区 | 国产小视频在线 | 91国内产香蕉 | 欧美日韩亚洲三区 | 亚洲国产精品美女 | 黄色一级大片视频 | 免费一级欧美在线观看视频 | 久久与欧美 | 日韩三级在线 | 日韩一区二区三区av | 免费一看一级毛片 | 亚洲精品视频观看 | aaaa日韩| 欧美美女爱爱视频 | 先锋资源在线 | 四虎国产 | 国产高清av免费观看 | 精品粉嫩aⅴ一区二区三区四区 | 亚洲精品久久久久久久久久久 | 亚洲精品乱码久久久久久按摩 | 超碰97免费在线 | 中文字幕精品视频 | 在线播放国产一区二区三区 | 亚洲一区二区电影在线观看 | 日韩免费视频一区二区 | 国产精品有限公司 | 日韩午夜在线观看 | 国产三级精品三级在线观看四季网 | 一区二区在线不卡 | 中日韩毛片| 99精品在线观看 | 97久久精品午夜一区二区 | 精品国产欧美在线 | 国产在线激情视频 | 久草在线高清 | 中文字幕在线观看精品 | 国产成人在线视频免费观看 | 成人av一区二区三区 | 亚洲在线免费观看 | 羞羞色在线观看 |