<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)圖像采集與網(wǎng)絡(luò)傳輸

          單片機(jī)圖像采集與網(wǎng)絡(luò)傳輸

          作者: 時(shí)間:2012-03-20 來(lái)源:網(wǎng)絡(luò) 收藏

          3.4 數(shù)據(jù)的封裝

          32.gif

          DB200完1幀后,通過(guò)數(shù)據(jù)總線傳送給89C52;89C52則將數(shù)據(jù)按TCP/IP協(xié)議封裝成以太網(wǎng)幀(圖3),然后通過(guò)數(shù)據(jù)總線送給RTL8019AS;RTL8019AS則將以太網(wǎng)幀經(jīng)RJ45接口送到10M以太網(wǎng)上。

          從圖3可以看到,每個(gè)以太網(wǎng)幀的最大長(zhǎng)度為1518字節(jié),最小為64字節(jié)。其數(shù)據(jù)部分最大為1500字節(jié),最小為46字節(jié)。每個(gè)UDP數(shù)據(jù)傳輸前,必須加上 8字節(jié)的UDP頭來(lái)構(gòu)成UDP數(shù)據(jù)報(bào);再加上20字節(jié)的IP頭來(lái)構(gòu)成IP數(shù)據(jù)報(bào);最后加上14字節(jié)的幀頭來(lái)構(gòu)成以太網(wǎng)幀。這就是所謂的數(shù)據(jù)包封裝。為了避免分段操作的麻煩,UDP數(shù)據(jù)報(bào)的最大長(zhǎng)度應(yīng)為1500 - 28=1472字節(jié)。在實(shí)際應(yīng)用中,我們采用每行圖像數(shù)據(jù)(385字節(jié))封裝一個(gè)包的方式傳輸數(shù)據(jù)。
          void Data_send( UINT src_port, UINT datalen) // (例程5--UDP數(shù)據(jù)報(bào)封裝):
          { UDP_HEADER xdata * udp;
          udp = (UDP_HEADER xdata *)(outbuf + 34); // 34=14(以太網(wǎng)幀頭長(zhǎng))+ 20(IP報(bào)頭長(zhǎng)) udp->dest_port = 2001; // 目的端口號(hào)
          udp->source_port = 20011; // 源端口號(hào)
          udp->length = 8 + datalen; // UDP包總長(zhǎng)= UDP頭長(zhǎng)度+數(shù)據(jù)長(zhǎng)度
          udp->checksum = 0; // 不校驗(yàn)UDP數(shù)據(jù)報(bào)
          ip_pack(outbuf, dest_ipaddr, udp->length); // 封裝IP包
          }
          void ip_pack(UCHAR xdata * outbuf, ULONG dest_ipaddr, UINT datalen)//(例程6-封裝IP包)
          { IP_HEADER xdata * ip; static UINT ip_ident; // datalen為UDP數(shù)據(jù)報(bào)總長(zhǎng)度
          ip = (IP_HEADER xdata *)(outbuf + 14); // 14字節(jié)為以太網(wǎng)幀頭長(zhǎng)度。
          ip->ver_len = 0x45; ip->type_of_service = 0; // 版本號(hào)和服務(wù)類(lèi)型。
          ip->total_length = 20 + datalen; // 數(shù)據(jù)報(bào)總長(zhǎng)=IP頭長(zhǎng)度+數(shù)據(jù)長(zhǎng)度
          ip->identifier = ip_ident++; // IP數(shù)據(jù)報(bào)序列號(hào)。
          ip->fragment_info = 0; // IP數(shù)據(jù)報(bào)不分段。
          ip->time_to_live = 32; // 生存時(shí)間。
          ip->protocol_id = UDP_TYPE; // 協(xié)議類(lèi)型為UDP=17。
          ip->header_cksum = 0; // 校驗(yàn)和清0。
          ip->dest_ipaddr = 0xEA050607L; // 0xEA050607L=234.5.6.7 為目標(biāo)組播地址
          ip->source_ipaddr = 0xD224446FL; // 0xD224446FL=210.36.68.111為本地IP地址
          ip->header_cksum = ~cksum(outbuf + 14, 20); // 計(jì)算20字節(jié)的IP數(shù)據(jù)報(bào)頭校驗(yàn)和
          eth_send(outbuf, 34 + datalen); // 封裝以太網(wǎng)幀并發(fā)送。
          }

          在上述例程5和例程6中,UDP的校驗(yàn)和是可選的,IP頭的校驗(yàn)和是必需的。例程5將UDP檢驗(yàn)和置為0,例程6則用cksum( )函數(shù)來(lái)計(jì)算IP頭校驗(yàn)和。本地IP地址可取任意有效值。

          3.5 以太網(wǎng)幀的封裝和發(fā)送

          從圖3可知,以太網(wǎng)幀封裝就是要將目的MAC地址、源MAC地址和所要傳輸?shù)臄?shù)據(jù)類(lèi)型放到待發(fā)送的IP數(shù)據(jù)報(bào)前(成為以太網(wǎng)幀頭)。因?yàn)槲覀円M(jìn)行的是組播發(fā)送,所以目的MAC地址也必須是組播的MAC地址;而本地的源MAC地址我們就用01:02:03:04:05:06。



          評(píng)論


          相關(guān)推薦

          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();