日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀]1前言 UDP協(xié)議全稱為用戶數(shù)據(jù)協(xié)議,是一種簡單有效的運輸協(xié)議。和以太網(wǎng)首部和IP首部相似,UDP首部也有自身的數(shù)據(jù)結(jié)構(gòu)定義。從運輸協(xié)議開始引入端口的概念,端口相當(dāng)于一個應(yīng)用程序的標(biāo)識符。相對于TCP協(xié)議而言,UD

1前言
UDP協(xié)議全稱為用戶數(shù)據(jù)協(xié)議,是一種簡單有效的運輸協(xié)議。和以太網(wǎng)首部和IP首部相似,UDP首部也有自身的數(shù)據(jù)結(jié)構(gòu)定義。從運輸協(xié)議開始引入端口的概念,端口相當(dāng)于一個應(yīng)用程序的標(biāo)識符。相對于TCP協(xié)議而言,UDP協(xié)議簡單的多。本文將實現(xiàn)UDP協(xié)議,并通過幾個簡單的案例說明UDP的使用。
1.2 相關(guān)資料
ENC28J60學(xué)習(xí)筆記鏈接
http://www.amobbs.com/thread-5519381-1-1.html
AVRNET學(xué)習(xí)筆記 ETHERNET和ARP部分
http://www.amobbs.com/thread-5519452-1-1.html
AVRNET學(xué)習(xí)筆記 IP和ICMP部分
http://www.amobbs.com/thread-5519494-1-1.html
AVRNET項目(國外)
http://www.avrportal.com/?page=avrnet
AVR webserver項目(國外)
http://www.tuxgraphics.org/electronics/200611/article06111.shtml#0lfindex0
2 UDP部分實現(xiàn)
UDP功能的實現(xiàn)可分為UDP首部填充,UDP緩沖區(qū)填充和UDP報文查詢。UDP首部填充是一個按部就班的過程,即填充源端口,目標(biāo)端口,長度和校驗和。UDP緩沖區(qū)填充即往UDP負(fù)載部分逐個填充數(shù)據(jù)。UDP報文查詢功能即匹配本機UDP端口號,并進行函數(shù)處理。為了實現(xiàn)這些功能,首先需要以下宏定義。需要注意的是以太網(wǎng)傳輸協(xié)議中數(shù)據(jù)被以大端的形式保存,即低地址存放了高字節(jié)。例如端口號的高字節(jié)存放在了0x22的位置,而端口號的低字節(jié)存放在了0x23的位置。

// UDP默認(rèn)端口號

#define UDP_AVR_PORT_V 3000

#define UDP_AVR_PORT_H_V(UDP_AVR_PORT_V>>8)

#define UDP_AVR_PORT_L_V(UDP_AVR_PORT_V&0xff)

// 源端口

#define UDP_SRC_PORT_H_P0x22

#define UDP_SRC_PORT_L_P0x23

// 目標(biāo)端口

#define UDP_DST_PORT_H_P0x24

#define UDP_DST_PORT_L_P0x25

// UDP負(fù)載長度

#define UDP_LENGTH_H_P 0x26

#define UDP_LENGTH_L_P 0x27

// UDP校驗和

#define UDP_CHECKSUM_H_P0x28

#define UDP_CHECKSUM_L_P0x29

// UDP負(fù)載起始地址

#define UDP_DATA_P 0x2A


2.1 UDP首部填充
UDP首部填充中需要明確UDP的端口號,AVRNET項目中通過常數(shù)宏定義實現(xiàn)
#define UDP_AVR_PORT_V 3000
#define UDP_AVR_PORT_H_V(UDP_AVR_PORT_V>>8)
#define UDP_AVR_PORT_L_V(UDP_AVR_PORT_V&0xff)
從這段代碼中可以看出,AVRNET的UDP端口號為3000。

void udp_generate_header ( BYTE *rxtx_buffer, WORD_BYTES dest_port, WORD_BYTES length )

{

WORD_BYTES ck;


// 默認(rèn)端口號 3000

rxtx_buffer[UDP_SRC_PORT_H_P] = UDP_AVR_PORT_H_V;

rxtx_buffer[UDP_SRC_PORT_L_P] = UDP_AVR_PORT_L_V;


// 目標(biāo)端口地址

rxtx_buffer[UDP_DST_PORT_H_P] = dest_port.byte.high;

rxtx_buffer[UDP_DST_PORT_L_P] = dest_port.byte.low;


// 負(fù)載長度

rxtx_buffer[UDP_LENGTH_H_P] = length.byte.high;

rxtx_buffer[UDP_LENGTH_L_P] = length.byte.low;


// 計算校驗和

rxtx_buffer[UDP_CHECKSUM_H_P] = 0;

rxtx_buffer[UDP_CHECKSUM_L_P] = 0;

// length+8 for source/destination IP address length (8-bytes)

ck.word = software_checksum ( (BYTE*)&rxtx_buffer[IP_SRC_IP_P], length.word+8, length.word+IP_PROTO_UDP_V);

rxtx_buffer[UDP_CHECKSUM_H_P] = ck.byte.high;

rxtx_buffer[UDP_CHECKSUM_L_P] = ck.byte.low;

}

復(fù)制代碼

2.2 UDP負(fù)載長度查詢
UDP首部中包含UDP長度的描述字節(jié),長度占有兩個字節(jié)并以大端格式保存,由于宏定義的提示作用,弱化了大端格式的影響。長度中也包括了UDP首部的長度,UDP首部的長度為固定的8字節(jié)。

WORD udp_get_dlength( BYTE *rxtx_buffer )

{

WORD length = 0;

// 獲得UDP長度

length = rxtx_buffer[UDP_LENGTH_H_P] << 8 | rxtx_buffer[UDP_LENGTH_L_P];

// 去除首部長度

length = length - 8;


return length;

}


2.3 UDP負(fù)載區(qū)填充
UDP負(fù)載去填充即在UDP首部之后填充有用的數(shù)據(jù)。在這段真實負(fù)載之前包括了UDP首部,IP首部和以太網(wǎng)首部,分別占用了8字節(jié),20字節(jié)和14字節(jié)。UDP負(fù)載的起始地址通過宏由UDP_DATA_P定義。對于AVR單片機的特點,為了盡一切可能節(jié)約內(nèi)存使用率,在向負(fù)載區(qū)填充數(shù)據(jù)時用到了兩個函數(shù),udp_puts_data函數(shù)操作的是BYTE*類型的數(shù)據(jù),而udp_puts_data_p操作的為PGM_P類型數(shù)據(jù),即位于FLASH中的數(shù)據(jù),需要通過pgm_read_byte取出。而其他類型的CPU,例如STM卻沒有該功能,則使用udp_puts_data即可。

WORD udp_puts_data ( BYTE *rxtx_buffer, BYTE *data, WORD offset )

{

while( *data )

{

rxtx_buffer[ UDP_DATA_P + offset ] = *data++;

offset++;

}


return offset;

}

WORD udp_puts_data_p ( BYTE *rxtx_buffer, PGM_P data, WORD offset )

{

BYTE ch;


while( (ch = pgm_read_byte(data++)) )

{

rxtx_buffer[ UDP_DATA_P + offset ] = ch;

offset++;

}


return offset;

}


2.4 UDP報文查詢
UDP報文的查詢需要匹配接收數(shù)據(jù)包中的UDP端口號,若匹配成功則可對輸入數(shù)據(jù)包進行處理,這些處理包括解析數(shù)據(jù)包的數(shù)據(jù)格式,分析出控制命令或查詢命令。也可以通過udp_puts_data向發(fā)送緩沖區(qū)中填寫響應(yīng)數(shù)據(jù)。接著逐步生成以太網(wǎng)首部,IP首部和UDP首部,以太網(wǎng)首部中包含目標(biāo)MAC地址,IP首部中包含目標(biāo)IP地址,UDP首部中包含目標(biāo)端口號。

BYTE udp_receive ( BYTE *rxtx_buffer, BYTE *dest_mac, BYTE *dest_ip )

{

WORD dlength = 0;

// udp負(fù)載長度

WORD udp_loadlen = 0;


// 匹配UDP協(xié)議 UDP端口號

if ( rxtx_buffer[IP_PROTO_P] != IP_PROTO_UDP_V || rxtx_buffer[UDP_DST_PORT_H_P] != UDP_AVR_PORT_H_V || rxtx_buffer[ UDP_DST_PORT_L_P ] != UDP_AVR_PORT_L_V )

return 0;


// 加入處理函數(shù)


// 生成以太網(wǎng)首部

eth_generate_header (rxtx_buffer, (WORD_BYTES){ETH_TYPE_IP_V}, dest_mac );

// 生成IP首部

ip_generate_header (rxtx_buffer, (WORD_BYTES){sizeof(IP_HEADER)+sizeof(UDP_HEADER)+dlength}, IP_PROTO_UDP_V, dest_ip );

// 生成UDP首部

udp_generate_header (rxtx_buffer, (WORD_BYTES){(rxtx_buffer[UDP_SRC_PORT_H_P]<<8)|rxtx_buffer[UDP_SRC_PORT_L_P]}, (WORD_BYTES){sizeof(UDP_HEADER)+dlength});

// 發(fā)送所有首部和UDP負(fù)載數(shù)據(jù)

enc28j60_packet_send ( rxtx_buffer, sizeof(ETH_HEADER)+sizeof(IP_HEADER)+sizeof(UDP_HEADER)+dlength );


return 1;

}


3 實驗
實驗部分主要是為了驗證UDP協(xié)議,通過PC機上的網(wǎng)絡(luò)調(diào)試軟件開辟一個PC機的UDP端口,假定端口號為3001,IP地址為192.168.1.102;AVR的UDP默認(rèn)端口號為3000,IP地址為192.168.1.105。
3.1 程序結(jié)構(gòu)
在運行UDP程序之前,需要運行ARP,IP和ICMP各部分,并保存發(fā)起發(fā)的MAC地址和IP地址。

/* 獲得新的IP報文 */

plen = enc28j60_packet_receive( (BYTE*)&rxtx_buffer, MAX_RXTX_BUFFER );

if(plen==0) return;


/* 保存客服端的MAC地址 */

memcpy ( (BYTE*)&client_mac, &rxtx_buffer[ ETH_SRC_MAC_P ], sizeof(MAC_ADDR) );

/* 檢查該報文是不是ARP報文 */

if ( arp_packet_is_arp( rxtx_buffer, (WORD_BYTES){ARP_OPCODE_REQUEST_V} ) )

{

/* 向客戶端返回ARP報文 */

arp_send_reply ( (BYTE*)&rxtx_buffer, (BYTE*)&client_mac );

return;

}


/* 保存客服端的IP地址 */

memcpy ( (BYTE*)&client_ip, &rxtx_buffer[ IP_SRC_IP_P ], sizeof(IP_ADDR) );

/* 檢查該報文是否為IP報文 */

if ( ip_packet_is_ip ( (BYTE*)&rxtx_buffer ) == 0 )

{

return;

}


/* 如果是ICMP報文 向發(fā)起方返回數(shù)據(jù) */

if ( icmp_send_reply ( (BYTE*)&rxtx_buffer, (BYTE*)&client_mac, (BYTE*)&client_ip ) )

{

return;

}


// 進行UDP處理

if (udp_receive ( (BYTE *)&rxtx_buffer, (BYTE *)&client_mac, (BYTE *)&client_ip ))

{

return;

}


3.2 源IP和源端口
使用網(wǎng)路調(diào)試助手發(fā)送一個名稱,例如UDP。在仿真環(huán)境中通過串口打印出發(fā)起方的IP地址和端口號,例如PC機的端口號設(shè)定為3001,PC機的IP地址為192.168.1.102。在udp_receive函數(shù)中需要判斷UDP端口號和目標(biāo)IP地址是否匹配,若匹配即可加入以下代碼。首先獲得UDP的負(fù)載長度,使用memcpy命令復(fù)制到udp_recbuf中,接著通過串口打印源IP地址,該參數(shù)位于IP首部,源端口號,該參數(shù)位于UDP首部中。

// 獲得UDP負(fù)載長度

udp_loadlen = udp_get_dlength(rxtx_buffer);


// 復(fù)制UDP負(fù)載

memcpy(udp_recbuf,(char*)&rxtx_buffer[UDP_DATA_P],udp_loadlen);


#ifdef UDP_DEBUG

printf("UDP Message!n");

printf("Send Form:%d.%d.%d.%d ",

rxtx_buffer[IP_SRC_IP_P+0],rxtx_buffer[IP_SRC_IP_P+1],

rxtx_buffer[IP_SRC_IP_P+2],rxtx_buffer[IP_SRC_IP_P+3]);

printf("Port:%dn",(rxt

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

Sept. 10, 2025 ---- 根據(jù)TrendForce集邦咨詢最新發(fā)布的《全球電動車逆變器市場數(shù)據(jù)》,2025年第二季受惠純電動車(BEV)銷售成長,全球電動車(注1)牽引逆變器裝機量達(dá)766萬臺,年增19%。...

關(guān)鍵字: 增程式電動車 SiC 牽引逆變器

Sept. 8, 2025 ---- 根據(jù)TrendForce集邦咨詢最新調(diào)查,2025年第二季NVIDIA(英偉達(dá)) Blackwell平臺規(guī)?;鲐洠约氨泵繡SP業(yè)者持續(xù)擴大布局General Server(通用型...

關(guān)鍵字: SSD DDR4 服務(wù)器

Sept. 4, 2025 ---- Apple(蘋果)即將發(fā)布iPhone 17、iPhone 17 Air(暫名)、iPhone 17 Pro及Pro Max四款旗艦新機,除了外觀辨識度升級,處理器性能、散熱和拍攝功...

關(guān)鍵字: iPhone 16 A19處理器 折疊機

Sept. 3, 2025 ---- 根據(jù)TrendForce集邦咨詢最新發(fā)布的《2025近眼顯示市場趨勢與技術(shù)分析》報告,2025年隨著國際品牌陸續(xù)推出AR眼鏡原型,以及Meta預(yù)計在近期發(fā)布AR眼鏡Celeste,市...

關(guān)鍵字: AR眼鏡 OLED

Sept. 2, 2025 ---- TrendForce集邦咨詢表示,2025年第二季DRAM產(chǎn)業(yè)因一般型DRAM (Conventional DRAM)合約價上漲、出貨量顯著增長,加上HBM出貨規(guī)模擴張,整體營收為3...

關(guān)鍵字: DRAM 智能手機 ASP

Sept. 1, 2025 ---- 根據(jù)TrendForce集邦咨詢最新調(diào)查,2025年第二季因中國市場消費補貼引發(fā)的提前備貨效應(yīng),以及下半年智能手機、筆電/PC、Server新品所需帶動,整體晶圓代工產(chǎn)能利用率與出貨...

關(guān)鍵字: 晶圓代工 智能手機 筆電

Aug. 28, 2025 ---- 根據(jù)TrendForce集邦咨詢最新調(diào)查,2025年第二季NAND Flash產(chǎn)業(yè)雖面臨平均銷售價格(ASP)小幅下滑,所幸原廠減產(chǎn)策略緩解供需失衡,疊加中、美兩大市場政策推動,整體...

關(guān)鍵字: NAND Flash SSD AI

Aug. 26, 2025 ---- NVIDIA(英偉達(dá))近日推出的Jetson Thor被視為機器人的物理智慧核心,以Blackwell GPU、128 GB記憶體堆疊出2070 FP4 TFLOPS AI算力,是前...

關(guān)鍵字: 機器人 大型語言模型 AI算力

Aug. 21, 2025 ---- 根據(jù)TrendForce集邦咨詢最新液冷產(chǎn)業(yè)研究,隨著NVIDIA GB200 NVL72機柜式服務(wù)器于2025年放量出貨,云端業(yè)者加速升級AI數(shù)據(jù)中心架構(gòu),促使液冷技術(shù)從早期試點邁...

關(guān)鍵字: AI 數(shù)據(jù)中心 服務(wù)器

除了充電電路外,鋰電池的放電過程也需要保護。鋰電池的放電電壓不能低于3.0V,否則電池壽命會大幅縮短。為了實現(xiàn)這一保護,工程師們設(shè)計了DW01芯片與8205 MOS管的電路組合。DW01芯片能夠監(jiān)控鋰電池的放電電壓和電流...

關(guān)鍵字: 鋰電池 電池
關(guān)閉