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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4946|回復: 0
打印 上一主題 下一主題
收起左側

UDP數據發送程序,緩沖區可以擴展,不過得有足夠的SRAM

[復制鏈接]
跳轉到指定樓層
樓主
ID:82781 發表于 2015-6-13 16:54 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
三個功能:
1.UDP標準配置
2.IP校驗
3.向以太網中送UDP包!

  1. /**本函數是一個類初始化函數
  2.    主要是一些不變的參數和部分數據的初始化
  3.    **/
  4. void UDP_Frame_Set(
  5.      TypeDef_MAC_Frame_H *MAC_Frame,
  6.      TypeDef_IP_Frame_H  *IP_Frame,
  7.      TypeDef_UDP_Frame_H *UDP_Frame
  8.      )//設置UDP相關參數
  9. {


  10.   /**

  11.     整個UDP幀是由
  12.     MAC幀+IP幀+UDP幀構成的。。。。
  13.    編譯器要開在大端模式!主要考慮用的外部RAM
  14.   */
  15.   /*****MAC部首設置***************************************************/  
  16.            /********目標MAC地址***************/
  17.      MAC_Frame->Destination_MAC[0]=0;
  18.     MAC_Frame->Destination_MAC[1]=0;
  19.     MAC_Frame->Destination_MAC[2]=0;
  20.     MAC_Frame->Destination_MAC[3]=0;
  21.     MAC_Frame->Destination_MAC[4]=0;
  22.     MAC_Frame->Destination_MAC[5]=0;
  23.      /********源MAC地址*************/
  24.     MAC_Frame->Source_add_MAC[0]=0x00;
  25.     MAC_Frame->Source_add_MAC[1]=0x26;
  26.     MAC_Frame->Source_add_MAC[2]=0x9E;
  27.     MAC_Frame->Source_add_MAC[3]=0xC7;
  28.     MAC_Frame->Source_add_MAC[4]=0x6C;   //本機MAC固定的
  29.     MAC_Frame->Source_add_MAC[5]=0xF3;
  30.      /********類型長度******8*****/
  31.        MAC_Frame->Type[0]=0x08;
  32.        MAC_Frame->Type[1]=0x00;//0X0800IP包 0x0806ARP
  33. /**************IP部首設置**************************************************/
  34.     IP_Frame ->IP_Version_Head=0x45;//IP版本是4,部首長度是20個字節
  35.     IP_Frame ->IP_Tos=0;//IP的TOS一般設為0
  36.     IP_Frame ->IP_Total_Length[0]=0;//設置總長度
  37.     IP_Frame ->IP_Total_Length[1]=0;//設置總長度
  38.     IP_Frame ->IP_Indentification[0]=0;
  39.     IP_Frame ->IP_Indentification[1]=1; //標識字段,發送一個都會加一
  40.     IP_Frame ->IP_Flage_FRAGMENT_OFFSET[0]=0;    //3位標識和片偏移,這里是指IP分片,盡量不產生IP分片
  41.     IP_Frame ->IP_Flage_FRAGMENT_OFFSET[1]=0;
  42.     IP_Frame ->IP_TTL=64;//生存時間默認為32或者64,過一個路由器減去一!當此值為0此份報文被丟棄
  43.     IP_Frame ->IP_Protocol=0x11;//表示協議,這是UDP協議
  44.     /*IP部首校驗和*/
  45.     IP_Frame ->IP_Check_sum[0]=0;
  46.     IP_Frame ->IP_Check_sum[1]=0; //0;
  47.      /*本機IP*/
  48.     IP_Frame ->IP_Source[0]=192;
  49.     IP_Frame ->IP_Source[1]=168;
  50.     IP_Frame ->IP_Source[2]=1;
  51.     IP_Frame ->IP_Source[3]=233;
  52.      /*目標IP地址這個得由ARP獲得這里做初始化設置*/
  53.     IP_Frame ->IP_Dstination[0]=0;
  54.     IP_Frame ->IP_Dstination[1]=0;
  55.     IP_Frame ->IP_Dstination[2]=0;
  56.     IP_Frame ->IP_Dstination[3]=0;
  57. /***************UDP設置***************************************/

  58.        UDP_Frame->UDP_Source_Port[0]=0x1f;
  59.     UDP_Frame->UDP_Source_Port[1]=0x90;//源端口是8080
  60.     UDP_Frame->UDP_Dstination_Port[0]=0x1f;
  61.     UDP_Frame->UDP_Dstination_Port[1]=0x90;//目標端口是8080
  62.     /*這個長度也得有實際數據決定
  63.    他的長度是UDP長度+數據比如數據長度是1個字節, 那么
  64.    這個長度就是UDP部首+1=8個字節+1個字節=9
  65.          
  66.    */
  67.      // UDP_Frame->UDP_Length[0]=0;
  68.   // UDP_Frame->UDP_Length[1]=0;
  69.    /*
  70.   校驗和也是得有數據才可以算出來,這里只是 初次賦值!
  71.    */
  72.    UDP_Frame->UDP_check_sum[0]=0;
  73.    UDP_Frame->UDP_check_sum[1]=0;
  74.    //UDP_Frame->UDP_Data[0];//數據



  75. }
  76. /***************************************
  77. IP部首的校驗和!他把IP部首看做是一連串的16位
  78. 數據,然后把這些數據加起來然后取反,所謂的二進制
  79. 反碼求和,并不是字面上的先去凡在求和,其實是相加后再取反!坑爹啊
  80. 他的作用是:
  81. 1.在發送端他首先把校驗字段清0,其后進行二進制反碼求和,
  82. 結果送到校驗子段,
  83. 2。在發送端他接收到后直接的把所有數據進行反碼求和,然后再讀取這個值,如果是0,那么是對的,如果不是
  84. 那么證明這個IP數據幀是有問題的應該丟棄或者發送差錯報文!
  85. 2012年3月3日
  86. 日照高科園
  87. 王均偉
  88. ************************************/
  89. uint IP_Check_Sum_Verify(TypeDef_IP_Frame_H *IP_Frame_Sum)
  90. {
  91. /*
  92.      一下算法源于百度,感謝再感謝!!
  93.      計算對IP首部檢驗和的算法如下:  
  94.    (1)把IP數據包的校驗和字段置為0;
  95.  。2)把首部看成以16位為單位的數字組成,依次進行二進制求和
  96.         (注意:求和時應將最高位的進位保存,所以加法應采用32位加法);
  97.  。3)將上述加法過程中產生的進位(最高位的進位)加到低16位
  98.        (采用32位加法時,即為將高16位與低16位相加,之后還要把該次加
  99.          法最高位產生的進位加到低16位)
  100.  。4)將上述的和取反,即得到校驗和。

  101.    2012年3月3日于日照高科園
  102.    按照以上算法便可以!
  103. */
  104. xdata unsigned long a,b;
  105. xdata uchar i;
  106.     xdata uint tab[10];
  107. xdata uint msb,lsb;
  108.   
  109. msb=IP_Frame_Sum->IP_Version_Head; //IP的版本號和IP的部首長度,默認為0X45,版本是4,部首是20字節
  110.     msb=msb<<8;
  111. lsb=IP_Frame_Sum->IP_Tos; //ip的TOS據我抓包觀察一般是00
  112. tab[0]=msb+lsb;
  113. msb=IP_Frame_Sum->IP_Total_Length[0];//總數據報文長度
  114. msb=msb<<8;
  115. lsb=IP_Frame_Sum->IP_Total_Length[1];//總數據報文長度
  116. tab[1]=msb+lsb;
  117. msb=IP_Frame_Sum->IP_Indentification[0];//IP標識字段,標識字段唯一地標識主機發送的每一份數據報。通常每發送一份報文它的值就會加1
  118. msb=msb<<8;
  119. lsb=IP_Frame_Sum->IP_Indentification[1];
  120. tab[2]=msb+lsb;

  121.    msb=IP_Frame_Sum->IP_Flage_FRAGMENT_OFFSET[0];//標志位和片偏移
  122.    msb=msb<<8;
  123.    lsb=IP_Frame_Sum->IP_Flage_FRAGMENT_OFFSET[1];//標志位和片偏移
  124.     tab[3]=msb+lsb;
  125.     msb=IP_Frame_Sum->IP_TTL; //生存時間
  126.   msb=msb<<8;
  127. lsb=IP_Frame_Sum->IP_Protocol; //協議類型
  128. tab[4]=msb+lsb;
  129. msb=IP_Frame_Sum->IP_Check_sum[0];//部首校驗和
  130. msb=msb<<8;
  131. lsb=IP_Frame_Sum->IP_Check_sum[0];//部首校驗和
  132. tab[5]=msb+lsb;
  133.     msb=IP_Frame_Sum->IP_Source[0];//32IP位源地址
  134. msb=msb<<8;
  135. lsb=IP_Frame_Sum->IP_Source[1];//32IP位源地址
  136. tab[6]=msb+lsb;
  137. msb=IP_Frame_Sum->IP_Source[2];//32IP位源地址
  138. msb=msb<<8;
  139. lsb=IP_Frame_Sum->IP_Source[3];//32IP位源地址
  140. tab[7]=msb+lsb;
  141. msb=IP_Frame_Sum->IP_Dstination[0];//32位IP目標地址
  142. msb=msb<<8;
  143. lsb=IP_Frame_Sum->IP_Dstination[1];//32位IP目標地址
  144. tab[8]=msb+lsb;
  145. msb=IP_Frame_Sum->IP_Dstination[2];//32位IP目標地址
  146. msb=msb<<8;
  147. lsb=IP_Frame_Sum->IP_Dstination[3];//32位IP目標地址
  148. tab[9]=msb+lsb;
  149.   /**我操原來是沒有清空變量草,費了我一天時間,我說第一次運行正確,其后不對
  150. 沒有清零!我擦我操!
  151. 2012年3月7日
  152. 日照高科園
  153. 王均偉*/   
  154.   
  155.    a=0;  //清零
  156.    b=0;
  157.    
  158.    for(i=0;i<10;i++)
  159.    {
  160.    a=a+tab[i]; //變量加
  161. b=a;//暫存A中
  162. b+=(a>>16)&0x0000ffff; //取高位與地位相加,并且加完了清0高八位
  163. }
  164.     b=~b; //取反

  165.    return b;
  166. }
  167. /*******************************8


  168.    發送UDP數據包
  169.   指定目標IP,本地IP,本地端口,目標端口
  170.   還有數據大小,什么數據,第幾個包
  171.         uchar *MAC_Target_add,//MAC地址。一般情況下由ARP計算得出
  172.                         uchar *IP_Source_add,//IP源地址
  173.         uchar *IP_Target_add,//IP目標地址
  174.         uint   UDP_Source_Port,UDP源端口
  175.         uint   UDP_Target_Port,UDP目標端口
  176.         uchar * UDP_Send_Data, UDP數據
  177.         uchar UDP_Send_Data_length UDP數據長度
  178. **********************************/
  179. void Send_UDP_packet(   uchar *MAC_Target_add,
  180.         uchar *IP_Target_add,
  181.         uchar *UDP_Source_Port,
  182.         uchar *UDP_Target_Port,
  183.         uchar *UDP_Send_Data,
  184.         uchar UDP_Send_Data_length
  185.        )
  186. {

  187. TypeDef_MAC_Frame_H xdata  MAC_Frame_H;//MAC定義一個結構體頭
  188. TypeDef_IP_Frame_H  xdata  IP_Frame_H; //IP定義一個結構體頭
  189. TypeDef_UDP_Frame_H xdata  UDP_Frame_H;//UDP定義數據結構  
  190. xdata uchar  d;
  191. xdata uchar MSB,LSB;   //中間量
  192. xdata uint da; //
  193.    /*傳遞了一個結構指針進去指向了上面建立的變量
  194.        就是建立了一個映射,把所有的都映射了,
  195.     目的是要初始化
  196.     表示這里面的都是標準配置,一般不改變
  197.     要隨時改變的就在這個函數下面設置了
  198.     比如MAC_Frame_H.Destination_MAC
  199.     他是個傳遞參量!
  200.      */
  201. UDP_Frame_Set(&MAC_Frame_H,&IP_Frame_H,&UDP_Frame_H);//設置UDP相關參數

  202.      /*MAC目標地址*/
  203.   MAC_Frame_H.Destination_MAC[0]=MAC_Target_add[0];
  204.   MAC_Frame_H.Destination_MAC[1]=MAC_Target_add[1];
  205.   MAC_Frame_H.Destination_MAC[2]=MAC_Target_add[2];
  206.   MAC_Frame_H.Destination_MAC[3]=MAC_Target_add[3];
  207.   MAC_Frame_H.Destination_MAC[4]=MAC_Target_add[4];
  208.   MAC_Frame_H.Destination_MAC[5]=MAC_Target_add[5];
  209.      /*IP目標地址*/
  210.   IP_Frame_H.IP_Dstination[0]=IP_Target_add[0];
  211.   IP_Frame_H.IP_Dstination[1]=IP_Target_add[1];
  212.   IP_Frame_H.IP_Dstination[2]=IP_Target_add[2];
  213.   IP_Frame_H.IP_Dstination[3]=IP_Target_add[3];
  214.       //數據長度,
  215. /*這個長度等于IP部首20字節+UDP部首8字節+UDP數據,這里是1字節UDP_Send_Data_length表示這是數據長度*/
  216.     da=28+UDP_Send_Data_length;
  217.     LSB=da;
  218.              MSB=(da>>8)&0x00ff;
  219.   IP_Frame_H.IP_Total_Length[0]=MSB;//設置總長度
  220.   IP_Frame_H.IP_Total_Length[1]=LSB;//設置總長度  //29字節
  221.          
  222.    
  223.     /*加入IP校驗和*/
  224. da=IP_Check_Sum_Verify(&IP_Frame_H); //計算IP部首校驗和
  225. LSB=da;
  226. MSB=(da>>8)&0x00ff;
  227. IP_Frame_H.IP_Check_sum[0]=MSB;
  228. IP_Frame_H.IP_Check_sum[1]=LSB; //寫入IP部首校驗和

  229. /*****************UDP***********************/
  230.   UDP_Frame_H.UDP_Source_Port[0]=UDP_Source_Port[0];
  231.   UDP_Frame_H.UDP_Source_Port[1]=UDP_Source_Port[1];//源端口是8080
  232.   UDP_Frame_H.UDP_Dstination_Port[0]=UDP_Target_Port[0];
  233.   UDP_Frame_H.UDP_Dstination_Port[1]=UDP_Target_Port[1];//目標端口是8080
  234.     /*這個長度也得有實際數據決定
  235.    他的長度是UDP長度+數據比如數據長度是1個字節, 那么
  236.    這個長度就是UDP部首+1=8個字節+1個字節=9
  237.          
  238.    */
  239.    da=8+UDP_Send_Data_length; //計算UDP數據長度
  240.     LSB=da;
  241.              MSB=(da>>8)&0x00ff;
  242.       UDP_Frame_H.UDP_Length[0]=MSB;
  243.    UDP_Frame_H.UDP_Length[1]=LSB;
  244.            /*加載數據*/
  245.        //注意這里的UDP數據我只分配了10個字節,要想加大數據量就得改結構體!
  246.    for(d=0;d<UDP_Send_Data_length;d++)
  247.    {
  248.       UDP_Frame_H.UDP_Data[d]=UDP_Send_Data[d];//數據寫入
  249.    }

  250. //以上實際上就是設置了三個結構體,全部圍繞這三個結構體展開的
  251.    
  252. /*              物理操作            */
  253. set_send_buffer_add(0x0200,0x023f);//緩沖區的大小設定,開始200結束1fff

  254. write_buffer_add(0x0200,0x0e);//控制字節
  255. //        MAC
  256. write_buffer_add(0x0201,MAC_Frame_H.Destination_MAC[0]);//
  257. write_buffer_add(0x0202,MAC_Frame_H.Destination_MAC[1]);//
  258. write_buffer_add(0x0203,MAC_Frame_H.Destination_MAC[2]);//
  259. write_buffer_add(0x0204,MAC_Frame_H.Destination_MAC[3]);//
  260. write_buffer_add(0x0205,MAC_Frame_H.Destination_MAC[4]);//   MAC目的地址
  261. write_buffer_add(0x0206,MAC_Frame_H.Destination_MAC[5]);//
  262. write_buffer_add(0x0207, MAC_Frame_H.Source_add_MAC[0]);//
  263. write_buffer_add(0x0208, MAC_Frame_H.Source_add_MAC[1]);//
  264. write_buffer_add(0x0209, MAC_Frame_H.Source_add_MAC[2]);//  MAC源地址
  265. write_buffer_add(0x020A, MAC_Frame_H.Source_add_MAC[3]);//
  266. write_buffer_add(0x020B, MAC_Frame_H.Source_add_MAC[4]);//
  267. write_buffer_add(0x020C, MAC_Frame_H.Source_add_MAC[5]);//
  268. write_buffer_add(0x020D, MAC_Frame_H.Type[0]);//   MAC類型
  269. write_buffer_add(0x020E, MAC_Frame_H.Type[1]);//
  270.    

  271.     //IP
  272. write_buffer_add(0x020F,IP_Frame_H.IP_Version_Head);//
  273. write_buffer_add(0x0210,IP_Frame_H.IP_Tos);//
  274. write_buffer_add(0x0211,IP_Frame_H.IP_Total_Length[0]);
  275. write_buffer_add(0x0212,IP_Frame_H.IP_Total_Length[1]);
  276. write_buffer_add(0x0213,IP_Frame_H.IP_Indentification[0]);
  277. write_buffer_add(0x0214,IP_Frame_H.IP_Indentification[1]);
  278. write_buffer_add(0x0215,IP_Frame_H.IP_Flage_FRAGMENT_OFFSET[0]);
  279. write_buffer_add(0x0216,IP_Frame_H.IP_Flage_FRAGMENT_OFFSET[1]);
  280. write_buffer_add(0x0217,IP_Frame_H.IP_TTL);
  281. write_buffer_add(0x0218,IP_Frame_H.IP_Protocol);
  282. write_buffer_add(0x0219,IP_Frame_H.IP_Check_sum[0]);
  283. write_buffer_add(0x021A,IP_Frame_H.IP_Check_sum[1]);
  284. write_buffer_add(0x021B,IP_Frame_H.IP_Source[0]);
  285. write_buffer_add(0x021C,IP_Frame_H.IP_Source[1]);
  286. write_buffer_add(0x021D,IP_Frame_H.IP_Source[2]);
  287. write_buffer_add(0x021E,IP_Frame_H.IP_Source[3]);
  288. write_buffer_add(0x021F,IP_Frame_H.IP_Dstination[0]);
  289. write_buffer_add(0x0220,IP_Frame_H.IP_Dstination[1]);
  290. write_buffer_add(0x0221,IP_Frame_H.IP_Dstination[2]);
  291. write_buffer_add(0x0222,IP_Frame_H.IP_Dstination[3]);

  292.        //UDP
  293. write_buffer_add(0x0223,UDP_Frame_H.UDP_Source_Port[0]);
  294. write_buffer_add(0x0224,UDP_Frame_H.UDP_Source_Port[1]);
  295. write_buffer_add(0x0225,UDP_Frame_H.UDP_Dstination_Port[0]);
  296. write_buffer_add(0x0226,UDP_Frame_H.UDP_Dstination_Port[1]);
  297. write_buffer_add(0x0227,UDP_Frame_H.UDP_Length[0]);
  298. write_buffer_add(0x0228,UDP_Frame_H.UDP_Length[1]);
  299. write_buffer_add(0x0229,UDP_Frame_H.UDP_check_sum[0]);
  300. write_buffer_add(0x022A,UDP_Frame_H.UDP_check_sum[1]);
  301.     //數據  //發送數量UDP_Send_Data_length
  302.             //數據在 UDP_Frame_H.UDP_Data[]里;
  303.    
  304.     for(d=0;d<UDP_Send_Data_length;d++)
  305.     {
  306. write_buffer_add((0x022B+d),UDP_Frame_H.UDP_Data[d]);
  307.    
  308.     }

  309. write_ENC28J60_REG_SPI(ECON1,0x0c);//允許發送,允許接收
  310.   for(;;)
  311.   {

  312.    d=read_ENC28J60_REG_SPI(EIR);//讀取數據包接收標志位
  313.    if((d&0x08)==0x08)break;  //發送完畢??OK退出ifNO死在里面
  314.   
  315.      }   




  316. }
復制代碼



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩久久久久 | 欧美vide | 久久精品亚洲一区 | 精品视频一区二区 | 91.xxx.高清在线 | 天天操天天射天天舔 | 日日天天| 国产麻豆乱码精品一区二区三区 | 国产yw851.c免费观看网站 | japan25hdxxxx日本 做a的各种视频 | 日韩欧美国产精品综合嫩v 一区中文字幕 | 96av麻豆蜜桃一区二区 | h视频在线免费 | 日韩中文字幕一区二区三区 | 国产高清精品一区二区三区 | 亚洲精品欧美 | 日日操夜夜摸 | 国产精品久久久久久婷婷天堂 | www.99re| 欧美啪啪 | 午夜视频在线观看视频 | 免费看大片bbbb欧美 | 久国久产久精永久网页 | 欧美综合一区二区 | 日本一区二区不卡视频 | 一级片免费在线观看 | 激情影院久久 | 99久热在线精品视频观看 | 国产91久久久久蜜臀青青天草二 | www成人免费视频 | 久久精品成人 | 亚洲福利视频网 | 欧美一区二区三区四区在线 | 网站国产 | 欧美高清一级片 | 久久久久久美女 | 免费小视频在线观看 | 狠狠av| 日韩最新网站 | 婷婷精品| 日韩伦理一区二区三区 |