W5100 简单UDP 协议的开发与代码分析
0赞下面是我对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
}
相关W5100的文章请点击:http://blog.chinaaet.com/detail/25432.html