STM32 W5500 UDP Client 發送數據

STM32F103RC 驅動W5500,使用UDP Client主動向指定IP和端口發數據測試。

1、首先保證STM32驅動驅動W5500入網可ping通,查看文章《STM32F103RC驅動W5500入網,並可ping通》

2、設置W5500發送和接收的緩衝區大小

3、創建UDP套接字,併發送數據

測試的主函數如下:

#ifndef __STM32F10X_H
#define __STM32F10X_H
#include "stm32f10x.h"
#endif

#ifndef __Z_UTIL_TIME_H
#define __Z_UTIL_TIME_H
#include "z_util_time.h"
#endif

#ifndef __Z_HARDWARE_LED_H
#define __Z_HARDWARE_LED_H
#include "z_hardware_led.h"
#endif

#ifndef __Z_HARDWARE_SPI_H
#define __Z_HARDWARE_SPI_H
#include "z_hardware_spi.h"
#endif

#include "w5500.h"
#include "socket.h"
#include "w5500_conf.h"

uint8 buffer[128];

int main(void)
{
	uint8 mac[6]={0, };
	uint8 lip[4]={192,168,1,110};
	uint8 sub[4]={255,255,255,0};
	uint8 gw[4]={192,168,1,1};
		
	uint8 remote_ip[4]={192,168,1,105};
	uint16 remote_port=6000;
	uint16 local_port=5000;
	uint16 len;
	
	init_led();
	init_system_spi();
	func_w5500_reset();
		
	getMacByLockCode(mac);
	setSHAR(mac);
  setSUBR(sub);
  setGAR(gw);
  setSIPR(lip);
	
	sysinit(txsize, rxsize);
	setRTR(2000);
  setRCR(3);
		
	for(;;)
	{	
		socket(0, Sn_MR_UDP, local_port, 0);
		buffer[0] = 0x55;
		buffer[1] = 0xAA;
		len = 2;
		sendto(0, buffer, len, remote_ip, remote_port);
						
		func_led1_on();
		delay_ms(500);
		func_led1_off();
		delay_ms(500);
		
	}
}

程序不斷向192.168.1.105的IP,6000的端口發送55 AA的十六進制數據。

然而可能會發生這種現象:

通過cmd命令窗口ping 192.168.1.110可以ping通,但是PC的網絡工具收不到 W5500發來的數據,以爲是程序寫錯了,沒調好,其實不是這樣的。

臨時解決辦法,通過PC網絡工具向W5500設定的IP和端口主動發一組數據(隨意發),PC網絡助手就可以收到W5500發來的數據了。

出現該現象的原因是:W5500寫的固定IP地址,並沒有向路由器報備,這個時候路由器不會給路由器不識別的設備轉發數據。

當PC網絡助手主動向W5500設置IP和端口發數據後,路由器會認爲有這個設備(W5500),再從W5500發出來的數據,路由器就會轉發。

這個時候,登陸了路由器的管理頁面也會看到多了一個有線連接的設備,未設置過設備名稱的,路由器會顯示未知設備,由於我設置過名稱(通過DHCP設置的),所以路由器還是會記錄錄下來。附上一張圖:

真正的解決辦法是DHCP,動態向路由器申請IP,並報備設備信息,以後我會有文章描述。

程序的測試結果圖:

UDP套接字的應用場景:DHCP、DNS、NTP等。

附上本次的測試代碼:工程測試代碼《01_W5500_UDP_send.rar》

 

再附上UDP迴環測試的主函數代碼,如下:

#ifndef __STM32F10X_H
#define __STM32F10X_H
#include "stm32f10x.h"
#endif

#ifndef __Z_UTIL_TIME_H
#define __Z_UTIL_TIME_H
#include "z_util_time.h"
#endif

#ifndef __Z_HARDWARE_LED_H
#define __Z_HARDWARE_LED_H
#include "z_hardware_led.h"
#endif

#ifndef __Z_HARDWARE_SPI_H
#define __Z_HARDWARE_SPI_H
#include "z_hardware_spi.h"
#endif

#include "w5500.h"
#include "socket.h"
#include "w5500_conf.h"

uint8 buffer[128];

int main(void)
{
	uint8 mac[6]={0, };
	uint8 lip[4]={192,168,1,110};
	uint8 sub[4]={255,255,255,0};
	uint8 gw[4]={192,168,1,1};
		
	uint8 remote_ip[4]={192,168,1,105};
	uint16 remote_port=6000;
	uint16 local_port=5000;
	uint16 len;
	
	init_led();
	init_system_spi();
	func_w5500_reset();
		
	getMacByLockCode(mac);
	setSHAR(mac);
  setSUBR(sub);
  setGAR(gw);
  setSIPR(lip);
	
	sysinit(txsize, rxsize);
	setRTR(2000);
  setRCR(3);
	
	for(;;)
	{	
		switch(getSn_SR(0))
		{
			case SOCK_UDP:
					delay_ms(100);
					if(getSn_IR(0) & Sn_IR_RECV)
					{
						setSn_IR(0, Sn_IR_RECV);
					}
					if((len=getSn_RX_RSR(0))>0)
					{ 
						memset(buffer,0,len+1);
						len = recvfrom(0,buffer, len, remote_ip,&remote_port);
						sendto(0,buffer,len, remote_ip, remote_port);
					}
			break;
			case SOCK_CLOSED:
					socket(0,Sn_MR_UDP,local_port,0);
			break;
		}
						
		func_led1_on();
		delay_ms(500);
		func_led1_off();
		delay_ms(500);
		
	}
}

迴環測試效果如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章