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

Home / 博客 / W5100简单UDP协议的开发与代码分析

下面是我对W5100的简单UDP协议代码分析,使用了W5100的开发板(atmega128)

大家可以看到,UDP和TCP协议的分别,其实也很简单易用,只要调用不同的函数即可。

代码注释如下:

#include

#include

#include

#include

#include

#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(“x”,*(RX_BUFFER + 1));

// printf(“x”,*(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

}