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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

哈哈我成功了《TCP下的數據發送&接收》通過看手冊搞定的

[復制鏈接]
跳轉到指定樓層
樓主
ID:82781 發表于 2015-6-13 16:59 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  哈哈我今晚上終于搞定了網卡的TCP包的接收,我是星期一來上班的,師傅就給我一個網卡讓我做個類似服務器性質終端,幸好去年我搞過一點ENC的ARP要不直接不會,每天都是看手冊看手冊看手冊,程序也一點一點的建立起來,但是昨天和今天所有的路子都鋪好了,就差包接收和發送了,發送的時候算法是自己搞的結果出了問題,今天又高接收,搞了一天,問題是我老是受到TCP數據后會出現亂碼,后來反復實驗發現這是溢出緩存造成的數據過沖,今晚上看了DATESHEET才發現人家有算法,把人家的算法編程后,哈哈爽!
下面是程序:(部分代碼)亂了點卻是原汁原味的
2012年2月9日于日照高科園
20:52
據我測試沒有丟包
沒有亂碼
流程:
PC發送TCP數據流到路由器
路由器轉發到網卡
網卡轉發到MCU
MCU通過串口發到PC
形成一個環回數據流
估計今晚上睡不著了。。。。。。

   uchar flage;
               uint get_size; //接收的數據大小
              uint get_offset; //偏移地址
              uint get_start_address;//緩存的物理地址
              uint upper_size;//多余的字節
              //uint destination_addr;//中間地址
              uint left_size;//
             // uint destination_addr;
     /*******用來做接收計數使*********/
            uint  S0_RX_NUMB; //接收的數據字節總個數
   uchar S0_RX_NUMB_DAT1; //中間量用于16-8位轉換
      /*******************
      
         要讀接受的數據就要知道當前的物理地址
       而當前的物理地址就得要讀這兩個寄存器
       間接的計算出物理地址
       計算方法就是手冊上的
      **************/
   uint  S0_RX_RD;//當前接收緩存地址
   uchar S0_RX_RD_DAT0,S0_RX_RD_DAT1; //中間量用于16-8位轉換
            uint numb; //計數參照
   uint  S0_RX_START_ADDRESS;//接收緩存的實際物理地址
   uchar  a;
   /***************
     
   *************/
while(read_register(S0_SSR)!=0x17);//客戶端:TCP連接成功轉入了SOCKT_EASTABLISHED狀態(可以進行數據收發)
/******************************************************
    判斷是否接收導數據
****************************************************/
do
{
//SendOneByte(read_register(S0_IR));//
a=read_register(S0_IR);
a=a&0x04;
}
while(a!=0x04);//是否姐收到數據包是向下
write_register(S0_IR,0xFF);

               S0_RX_NUMB=read_register(S0_RX_RSR0);
                                 S0_RX_NUMB_DAT1=read_register(S0_RX_RSR1);
      
             S0_RX_NUMB<<=8;
             S0_RX_NUMB+=S0_RX_NUMB_DAT1;
              get_size=S0_RX_NUMB;
                  
                  S0_RX_RD=read_register(S0_RX_RD0);
                              S0_RX_RD_DAT1=read_register(S0_RX_RD1);
         
                  S0_RX_RD<<=8;
                  S0_RX_RD+=S0_RX_RD_DAT1;
              get_offset=(S0_RX_RD&gS0_RX_MASK);
              get_start_address=gS0_RX_BASE+get_offset;


              if((get_offset+get_size)>(gS0_RX_MASK+1))
              {
              
                upper_size=(gS0_RX_MASK+1)-get_offset;
             for(numb=0;numb<upper_size;numb++)
             {

                SendOneByte(read_register((get_start_address+numb)));

             }
                 
            
             for(numb=0;numb<left_size;numb++)
             {

                SendOneByte(read_register((gS0_RX_BASE+numb)));

             }
           
              
              }
              else
              {
              
                  for(numb=0;numb<get_size;numb++)
             {
               flage=read_register((get_start_address+numb));
                SendOneByte(read_register((get_start_address+numb)));
               if(flage==0x31)
             {
      
            bell=0;
             }
             if(flage==0x32)
             {
      
              bell=1;
              }
      
                }
            
              
              
              }
      
         S0_RX_RD+=get_size;
         S0_RX_RD_DAT1=S0_RX_RD;
        S0_RX_RD_DAT0=(S0_RX_RD>>8);
     write_register(S0_RX_RD0,S0_RX_RD_DAT0);  
     write_register(S0_RX_RD1, S0_RX_RD_DAT1);
      
         write_register(S0_CR,RECV);//
      

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

使用道具 舉報

沙發
ID:82781 發表于 2015-6-13 17:00 | 只看該作者
         哈哈原來就是這么簡單,奧秘都在手冊里呢。!要什么有什么!中文手冊真是不敢恭維,還是人家老外牛逼不服不行。
發包程序:
/*********************

  發TCP送數據包
  完全根據DATESHEET做的
  2012年2月10日
  與日照
  王均偉
9::31
**********************/
void send_packet_tcp()
{
     uint  S0_TX_WR;//發送寫指針
     uchar S0_TX_WR0_DAT0,S0_TX_WR0_DAT1;//中間變量
//     uint  S0_TX_START_ADDRESS;//發送緩存的實際物理地址
     uint numb;               
      
                        uint get_free_size;//發送區剩余空間
                     uint send_size;//發送字節數
                     uint get_offset;//偏移地址
                                             uint get_start_address;//緩存的物理地址
                     uint upper_size;
                     uint left_size;                 
                     
                     
                     while(read_register(S0_SSR)!=0x17);//客戶端:TCP連接成功轉入了SOCKT_EASTABLISHED狀態(可以進行數據收發)   
                       send_size=30;//發送字節為10個
                    
                     //抓取剩余空間大小
                      get_free_size=read_register(S0_TX_FSR0);
                      get_free_size<<=8;
                      get_free_size+=read_register(S0_TX_FSR1);
                          //如果發送空間小于發送數據字節那么出錯
                        if(get_free_size<send_size)
                     {
                     
                     //ERRO
                      while(1);
                     
                     }
                       
                     S0_TX_WR=read_register(S0_TX_WR0);
                     S0_TX_WR<<=8;
                     S0_TX_WR+=read_register(S0_TX_WR1);
                    
                     get_offset=S0_TX_WR&gS0_TX_MASK;//計算偏移
                     get_start_address=gS0_TX_BASE+get_offset;//計算物理地址
                     if((get_offset+send_size)>(gS0_TX_MASK+1))
                     {
                     
                      upper_size=(gS0_TX_MASK+1)-get_offset;
                     for(numb=0;numb<upper_size;numb++)
                     {
                       write_register(get_start_address+numb,0xcc);//發送數據
                     
                     }
                     
                       left_size=send_size-upper_size;
                     
                      for(numb=0;numb<left_size;numb++)
                      {
                     
                        write_register(gS0_TX_BASE+numb,0xcc);//發送數據
                     
                      }


                     }
                     else
                     {
                     
                     
                        for(numb=0;numb<send_size;numb++)
                       {
                       
                      write_register(get_start_address+numb,0xcc);//發送數據
                       }
                     
                     
                     }

                     S0_TX_WR+=send_size;
                            S0_TX_WR0_DAT1=S0_TX_WR;
                        S0_TX_WR0_DAT0=((S0_TX_WR>>8)&0x00ff);
                    write_register(S0_TX_WR0,S0_TX_WR0_DAT0);
                    write_register(S0_TX_WR1,S0_TX_WR0_DAT1);//寫發送緩存區最開始字節從0x4000+(S0_TX_WR&0x07ff)

                      write_register(S0_CR,SEND);//發送

                  
                  
                             
// SendOneByte(read_register(S0_TX_FSR0));//串口發送發送緩沖的剩余空間
// SendOneByte(read_register(S0_TX_FSR1));//串口發送發送緩沖的剩余空間

//write_register(S0_TX_RD0,0x0);
   // write_register(S0_TX_RD1,0);//寫發送緩存區最開始字節從0x4000+(S0_TX_WR&0x07ff)
  /*  S0_TX_WR0_DAT1=S0_TX_WR;
    S0_TX_WR0_DAT0=((S0_TX_WR>>8)&0x00ff);
write_register(S0_TX_WR0,S0_TX_WR0_DAT0);
write_register(S0_TX_WR1,S0_TX_WR0_DAT1);//寫發送緩存區最開始字節從0x4000+(S0_TX_WR&0x07ff)
                               //帶入得:0X4000+0=0X4000;這就是端口0的開始地址也是我要開始寫數據的地址
   

      S0_TX_START_ADDRESS=(S0_TX_BASE+(S0_TX_WR&S0_TX_MASK));  
      
   for(numb=0;numb<1024;numb++)
     {     
     S0_TX_START_ADDRESS++;
                      //寫緩存
write_register(S0_TX_START_ADDRESS,0xcc);//
      }
     */

   //發送數據后得把寫指針原先的值加上數據長度在寫入寫指針,表示數據后移   
/* S0_TX_WR=S0_TX_WR+numb;
       S0_TX_WR0_DAT1=S0_TX_WR;
    S0_TX_WR0_DAT0=((S0_TX_WR>>8)&0x00ff);
write_register(S0_TX_WR0,S0_TX_WR0_DAT0);
write_register(S0_TX_WR1,S0_TX_WR0_DAT1);//寫發送緩存區最開始字節從0x4000+(S0_TX_WR&0x07ff)

write_register(S0_CR,SEND);//發送
   while((read_register(S0_IR)&0x10)!=0x10);
write_register(S0_IR,0xff);//發送
SendOneByte(read_register(S0_SSR));//
SendOneByte(read_register(S0_IR));//
SendOneByte(read_register(S0_TX_RD0));//串口發送發送緩沖的剩余空間
SendOneByte(read_register(S0_TX_RD1));//串口發送發送緩沖的剩余空間
SendOneByte(read_register(S0_TX_WR0));//串口發送發送緩沖的剩余空間
SendOneByte(read_register(S0_TX_WR1));//串口發送發送緩沖的剩余空間
// SendOneByte(read_register(S0_TX_FSR0));//串口發送發送緩沖的剩余空間
// SendOneByte(read_register(S0_TX_FSR1));//串口發送發送緩沖的剩余空間

// SendOneByte(read_register(S0_TX_START_ADDRESS));//串口發送發送緩沖的剩余空間
// SendOneByte(read_register(S0_TX_START_ADDRESS-1));//串口發送發送緩沖的剩余空間
*/



回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一区二区三区四区视频 | 综合网视频 | 久久6视频 | 中文字幕视频在线观看 | 亚洲精品免费观看 | 国产福利久久 | 免费色网址 | 精品电影 | 国产九九精品 | 日韩在线免费视频 | 91九色在线观看 | 久久久久久免费毛片精品 | 五月香婷婷 | 日韩在线观看中文字幕 | 久久久99国产精品免费 | 国产视频久久久久 | 欧美区在线观看 | 黄色在线免费网站 | 综合五月| 国产精品精品视频一区二区三区 | 日韩一区二区三区在线 | 久久久久国产精品一区二区 | 一区二区精品 | 天天人人精品 | 色爽女 | 日韩欧美天堂 | 久久69精品久久久久久久电影好 | 精品一区二区三区在线视频 | 亚洲不卡在线观看 | 一区二区三区国产 | 一级毛片免费看 | 色资源站| 一区二区三区成人 | 日韩在线国产 | 亚洲一区二区视频在线观看 | 91欧美精品成人综合在线观看 | 国产伦一区二区三区四区 | 福利一区二区在线 | 91av国产在线视频 | 精品久久成人 | 天天拍夜夜爽 |