一種uIP TCP/IP協(xié)議棧在51系列單片機(jī)上的實(shí)現(xiàn)
添加了必須的模塊,對uIP進(jìn)行了正確地配置后,需要編寫主程序函數(shù)。針對基于以太網(wǎng)的WEB SERVER應(yīng)用,主程序在完成初始化后將不停的進(jìn)行查詢,如果有新數(shù)據(jù)包到達(dá)則送uip_input()函數(shù)處理;如果沒有新數(shù)據(jù)包到達(dá)則處理定時(shí)事件。框架代碼如下所示:
通過實(shí)際的代碼說明uIP協(xié)議棧的主控制循環(huán)。
void main(void)
{
/*省略部分代碼*/
/*設(shè)置TCP超時(shí)處理時(shí)間和ARP老化時(shí)間*/
timer_set(periodic_timer, CLOCK_CONF_SECOND / 2);
timer_set(arp_timer, CLOCK_CONF_SECOND * 10);
/*定時(shí)器初始化*/
init_Timer();
/*協(xié)議棧初始化*/
uip_init();
uip_arp_init();
/*應(yīng)用層初始化*/
example1_init();
/*驅(qū)動(dòng)層初始化*/
etherdev_init();
/*IP地址、網(wǎng)關(guān)、掩碼設(shè)置*/
uip_ipaddr(ipaddr, 192,168,1,9);
uip_sethostaddr(ipaddr);
uip_ipaddr(ipaddr, 192,168,1,16);
uip_setdraddr(ipaddr);
uip_ipaddr(ipaddr, 255,255,255,0);
uip_setnetmask(ipaddr);
/*主循環(huán)*/
while(1)
{
/*從網(wǎng)卡讀數(shù)據(jù)*/
uip_len = etherdev_read();
/*假如存在數(shù)據(jù)則按協(xié)議處理*/
if(uip_len > 0)
{
/*收到的是IP數(shù)據(jù),調(diào)用uip_input()處理*/
if(BUF->type == htons(UIP_ETHTYPE_IP))
{
uip_arp_ipin();
uip_input();
/*處理完成后,假如uip_buf中有數(shù)據(jù),則調(diào)用etherdev_send 發(fā)送出往*/
if(uip_len > 0)
{
uip_arp_out();
etherdev_send();
}
}
tcp/ip相關(guān)文章:tcp/ip是什么
評論