久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機圖像采集與網絡傳輸

單片機圖像采集與網絡傳輸

作者: 時間:2012-03-20 來源:網絡 收藏

3.4 數據的封裝

32.gif

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

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

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

3.5 以太網幀的封裝和發送

從圖3可知,以太網幀封裝就是要將目的MAC地址、源MAC地址和所要傳輸的數據類型放到待發送的IP數據報前(成為以太網幀頭)。因為我們要進行的是組播發送,所以目的MAC地址也必須是組播的MAC地址;而本地的源MAC地址我們就用01:02:03:04:05:06。



評論


相關推薦

技術專區

關閉