⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 udp.c

📁 AVR以太网开发板中的几个例子。文件中定义了网卡芯片的IP地址,默认值是192.168.0.99。
💻 C
字号:
#include "main.h"
#include "rtl8019as.h"
#include "arp.h"
#include "ip.h"
#include "icmp.h"
#include "udp.h"

void udp_init(void)
{
  udpbuffer_in_p=0;
  udpbuffer_in_rp=0;
}

unsigned char udp_packhandle(unsigned char *udpbegin,unsigned int udplen)
{
 unsigned char udp_ok=0;
 unsigned int des_port=0;
 unsigned int i=0;
 
 to_udpport=*udpbegin;
 to_udpport<<=8;
 to_udpport|=*(udpbegin+1);
 
 des_port=*(udpbegin+2);
 des_port<<=8;
 des_port|=*(udpbegin+3);
 
 udpdatalen=*(udpbegin+4);
 udpdatalen<<=8;
 udpdatalen|=*(udpbegin+5);
 udpdatalen-=8;
 
 //*(udpbegin+6)=0;
 //*(udpbegin+7)=0;
 
 switch(des_port)
 {
  case localport_udp_port00:    //端口0 使用内部RAM
       if(udpdatalen>1024){return udp_ok;break;}
       for(;i<udpdatalen;i++)
	   {
	    udpbuffer_in[udpbuffer_in_p]=*(udpbegin+8+i);
		udpbuffer_in_p++;
		if(udpbuffer_in_p>=1024){udpbuffer_in_p=0;}
	   } 
	   udp_ok=1;
	   break;
	   
  case localport_udp_port01:    //端口1 使用外部RAM
       for(;i<udpdatalen;i++)
	   {
	    udpbuffer_ex[i]=*(udpbegin+8+i);
	   } 
	   udp_ok=1;
	   break;

  case localport_udp_port02:    //端口2
       led_cont(*(udpbegin+8));
	   break;
	   
  case localport_udp_port03:    //端口3
       
	   break;
 }
 
 return udp_ok;
}

unsigned int udp_readdata(void)
{
 unsigned int data=0;
 
 if(udpbuffer_in_p==udpbuffer_in_rp){return 0;} //没有新数据则返回0
 data=(udpbuffer_in[udpbuffer_in_rp]&0xFF);
 data|=0x8000;                                  //有新数据则置位最高位作为标记
 udpbuffer_in_rp++;
 if(udpbuffer_in_rp>=1024){udpbuffer_in_rp=0;}
 return data;
}

void udp_buildpack(unsigned char *udpsendbuffer,
                   unsigned int len,
				   unsigned int localport,
				   unsigned int remoteport)
{
  *udpsendbuffer=(localport>>8);        //源端口
  *(udpsendbuffer+1)=(localport&0xFF);
  
  *(udpsendbuffer+2)=(remoteport>>8);   //目的端口
  *(udpsendbuffer+3)=(remoteport&0xFF);
  
  //if(len&0x01)                          //如果长度为奇数字节则填充一字节
  //{
  // len++;
  // *(udpsendbuffer+8+len)=0xFF;
  //}                  
  *(udpsendbuffer+4)=(len>>8);
  *(udpsendbuffer+5)=(len&0xFF);
  
  *(udpsendbuffer+6)=0x00;                 //不进行校验
  *(udpsendbuffer+7)=0x00;
  
}

void udp_builddata(unsigned char *udpsendbuffer,unsigned char *udpsenddata,unsigned int len)
{
  unsigned int i=8;
  unsigned int i_d=0;
  
  len+=8;
  for(;i<len;i++)
  {
   *(udpsendbuffer+i)=*(udpsenddata+i_d);
   i_d++;
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -