发博文
正文 字体大小:

W5100 简单UDP 协议的开发与代码分析

(2009-09-28 09:12:26)
标签:

it

分类: 学习笔记
下面是我对W5100的简单UDP协议代码分析,使用了W5100的开发板(atmega128)
大家可以看到,UDP和TCP协议的分别,其实也很简单易用,只要调用不同的函数即可。
代码注释如下:

#include <stdio.h>

#include <stdlib.h>

#include <avr/io.h>

#include <avr/interrupt.h>

#include <string.h>

#include "../header/types.h"

#include "../header/serial.h"

#include "../header/socket.h"

#include "../header/w5100.h"

#define MAX_SIZE 2048

#define RX_BUF 0x1100

#define TX_BUF 0x1900

void main()

{

       cli(); // disable interrupt

       EICRA=0x00;

       EICRB=0x00;

       EIMSK=0x00;

       EIFR=0x00;

       MCUCR = 0x80;  // enable external ram

       XMCRA=0x40; //define lower sector of memory for EXternal ram and upper sector for W5100C and others

       sei();                            // enable interrupts

       uart_init(0,7);

       lcd_init();

       uint8 destip[4];

       uint8 addr[6];

              iinchip_init();

       sysinit(0x55,0x55); //

       addr[0] = 192; addr[1] = 168; addr[2] = 1; addr[3] = 20;    

       setSIPR(addr);

       addr[0] = 192; addr[1] = 168; addr[2] = 1; addr[3] = 1;    

       setGAR(addr);

       addr[0] = 255; addr[1] = 255; addr[2] = 255; addr[3] = 0;    

       setSUBR(addr);

       memcpy(addr, "\x00\x08\xDC\x00\x00\x00",6);

       setSHAR(addr);     

       uint8 lcd[50];

       sprintf(lcd,"IP: %d.%d.%d.%d",IINCHIP_READ(SIPR0),IINCHIP_READ(SIPR0+1),IINCHIP_READ(SIPR0+2),IINCHIP_READ(SIPR0+3));

       lcd_puts(lcd);                                    //print LCD string into LCD

      

       uint8 len;

// set UDP mode

       socket(0, Sn_MR_UDP, 5000, 0);

//     listen(0); //UDP no need to listen

       if( getSn_SR(0) == SOCK_UDP)

       {

              printf("UDP Mode");      // Check socket status register, it is in UDP status

       }

       while(getSn_RX_RSR(0) ==0 ); // if got data, RX buffer over 0, while loop will end

       printf("got data \r\n");   

       len = getSn_RX_RSR(0);      // get length of data received

       uint8 * TX_BUFFER = (uint8 *) TX_BUF;

       uint8 * RX_BUFFER =  (uint8 *) RX_BUF;  // make transmit and receive buffer

       if( len > MAX_SIZE)

              len = MAX_SIZE; // limit the length of data to be copy into TX/RX buffer as MAX

//extern uint16 send(SOCKET s, const uint8 * buf, uint16 len); // Send data (TCP)

//extern uint16 recv(SOCKET s, uint8 * buf, uint16 len);    // Receive data (TCP)

//extern uint16 sendto(SOCKET s, const uint8 * buf, uint16 len, uint8 * addr, uint16 port); // Send data (UDP/IP RAW)

//extern uint16 recvfrom(SOCKET s, uint8 * buf, uint16 len, uint8 * addr, uint16  *port); // Receive data (UDP/IP RAW)

//sendto and recvfrom are used for UDP, in contrast, TCP uses send and recv function

// because TCP is connection oriented, once connection is established, no need to assign send to which or receive from which client

       len = recvfrom(0,RX_BUFFER,len, destip, 5000);  //receive into RX buffer

       printf("the size is %u \r\n",len);    

 

      

       printf("%s",RX_BUFFER);

//     printf("%02x",*(RX_BUFFER + 1));

//     printf("%02x",*(RX_BUFFER +2) );

 // in case of more than one character, print 0, 1, 2 address

       sendto(0,RX_BUFFER,len,destip, 5000);  //send RX buffer to client

}

 

阅读 评论 收藏 转载 打印举报
已投稿到:
  • 评论加载中,请稍候...

       

    验证码: 请点击后输入验证码 收听验证码

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有