热度 11
2013-5-14 10:30
2327 次阅读|
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 ; uint8 addr ; iinchip_init(); sysinit(0x55,0x55); // addr = 192; addr = 168; addr = 1; addr = 20; setSIPR(addr); addr = 192; addr = 168; addr = 1; addr = 1; setGAR(addr); addr = 255; addr = 255; addr = 255; addr = 0; setSUBR(addr); memcpy(addr, "\x00\x08\xDC\x00\x00\x00",6); setSHAR(addr); uint8 lcd ; 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 } 如果您有什么疑问请留言或者来信致电均可:wiznetbj@wiznettechnology.com , Tel: 010-84538662,联系人:Jerry ,希望本篇文章可以给您带来帮助,谢谢。