No.54231 作者:wsfeitian 邮件:wsfeitian@yahoo.com.cn ID:20382 登陆:2次 文章数:31篇 最后登陆IP:202.103.243.118 最后登陆:2004/6/10 10:17:57 注册:2004/4/19 21:17:01 财富:232 发帖时间:2004/5/11 11:47:38 发贴者IP:202.103.243.98 标题:wsfeitian:老古,帮忙看看这个udp发送程序啊 摘要:No.54231老古,帮忙看看这个udp发送程序啊 电路参考您的一体化电路,去掉了串口,在P2口接一个液晶显示器.cpu用89s52. 以下仅仅是实现8019发udp数据程序,不用arp协议. typedef struct { unsigned char dest_hwaddr[6]; unsigned char source_hwaddr[6]; unsigned int frame_type; } ETH_HEADER; typedef struct { unsigned char ver_len; unsigned char type_of_service; unsigned int total_length; unsigned int identifier; unsigned int fragment_info; unsigned char time_to_live; unsigned char protocol_id; unsigned int header_cksum; unsigned long source_ipaddr; unsigned long dest_ipaddr; } IP_HEADER; typedef struct { unsigned int source_port; unsigned int dest_port; unsigned int length; unsigned int checksum; unsigned char msg_data; } UDP_HEADER; sbit reset=P3^4; #define reg00 XBYTE[0xc000] //reg00- 10为isa网卡接口的寄存器地址240-25fh; #define reg01 XBYTE[0xc100] #define reg02 XBYTE[0xc200] #define reg03 XBYTE[0xc300] #define reg04 XBYTE[0xc400] #define reg05 XBYTE[0xc500] #define reg06 XBYTE[0xc600] #define reg07 XBYTE[0xc700] #define reg08 XBYTE[0xc800] #define reg09 XBYTE[0xc900] #define reg0a XBYTE[0xca00] #define reg0b XBYTE[0xcb00] #define reg0c XBYTE[0xcc00] #define reg0d XBYTE[0xcd00] #define reg0e XBYTE[0xce00] #define reg0f XBYTE[0xcf00] #define reg10 XBYTE[0xd000] #define reg1f XBYTE[0xdf00] /******************************设置网卡地址***********************/ void ReadRtl8019NodeID(void) { } void WriteRtl8019NodeID(void) //直接设置本机物理地址 { page(1); reg01=0x00; reg02=0x01; reg03=0x02; reg04=0x03; reg05=0x04; reg06=0x05; page(0); } void rtl8019as_rst() //复位网卡 { uchar temp; reset=1; delay_ms(800); reset=0; delay_ms(800); } /************8019初始化*******************/ void page(unsigned char pagenumber)//选择页面 { unsigned char data temp; temp=reg00; temp=temp&0x3B ; pagenumber=pagenumber < <6; temp=temp | pagenumber; reg00=temp; } void init_8019(void) { delay_ms(10); rtl8019as_rst(); //复位8019 // R8019_CHIP_SELECT; reg00=0x21; //使芯片处于停止模式,这时进行寄存器设置 停止模式下,将不会发送和接收数据包 delay_ms(10); //延时10毫秒,确保芯片进入停止模式 page(0); reg0a=0x00; reg0b=0x00; reg0c=0xe0; //RCR reg0d=0xe2; //loop back mode 使芯片处于mon和loopback模式,跟外部网络断开 //使用0x40-0x4B为网卡的发送缓冲区,共12页,刚好可以存储2个最大的以太网包。 //使用0x4c-0x7f为网卡的接收缓冲区,共52页? reg01=0x4C; //Pstart 接收缓冲区范围 reg02=0x80; //Pstop 接收缓冲区尾地址 reg04=0x40; //TPSR 发送缓冲区范围 reg03=0x4C; //BNRY 指向最后一个已经读取的页(读指针) //刚开始,网卡没有接收到任何数据包,所以,BNRY设置为指向第一个接收缓冲区的页0x4c) reg07=0xff; //清除所有中断标志位 reg0f=0x00; //disable all interrupt reg0e=0xc8; //byte dma 8位dma方式 page(1); //选择页1的寄存器 reg07=0x4D; //CURR CURR 当前的接收结束页地址。(写指针) reg08=0x00; //MAR0 设置多点播送的参数 reg09=0x41; //MAR1 reg0a=0x00; //MAR2 reg0b=0x80; //MAR3 reg0c=0x00; //MAR4 reg0d=0x00; //MAR5 reg0e=0x00; //MAR6 reg0f=0x00; //MAR7 reg00=0x22; //这时让芯片开始工作 ReadRtl8019NodeID(); //读出网卡的物理地址48位 WriteRtl8019NodeID(); //将网卡地址写入到mar寄存器 //将网卡设置成正常的模式,跟外部网络连接 page(0); reg0c=0xcc; //RCR 接收配置寄存器,设置为使用接收缓冲区,仅接收自己的地址的数据包(以及广播地址数据包)和多点播送地址包,小于64字节的包丢弃(这是协议的规定,设置成接收是用于网络分析),校验错的数据包不接收 reg0d=0xe0; //TCR 发送配置寄存器,启用crc自动生成和自动校验,工作在正常模式 reg00=0x22; //这时让芯片开始工作 reg07=0xff; //清除所有中断标志位 } /************udp***************/ static ulong code my_ipaddr=0xC0A8000A;//设置ip为192.168.0.10 static uint xdata sender_udpport=1025;//发送端口为1025 static ulong xdata sender_ipaddr=0xCAC1318C;//pc机ip为202.193.49.140 void udp_send(uchar xdata *inbuf, uint port, uint len) { unsigned long idata sum; unsigned int idata result; unsigned char xdata * outbuf; UDP_HEADER xdata * udp; IP_HEADER xdata * ip; // Allocate memory for entire outgoing message including // eth & IP headers. Total ethernet message length is: // 14 byte eth header + 20 byte IP header + 8 byte UDP header // + length of this data outbuf = (uchar xdata *)malloc(42 + len);//malloc返回为一个(42+len)大小对象所分配的内存指针.如果返回 udp = (UDP_HEADER xdata *)(outbuf + 34); ip = (IP_HEADER xdata *)(outbuf + 14); // Direct message back to the senders port. udp-> dest_port = sender_udpport; udp-> source_port = port; udp-> length = 8 + len; udp-> checksum = 0; // Fill in data ......
>>返回讨论的主题
|