教你如何通過MCU將S2E配置為UDP的工作模式

WIZnet發表於2017-12-15

W5500S2E-S1是一款工業級串列埠轉乙太網模組,支援TCP Server、TCP Client和UDP三種工作模式,串列埠波特率最高可達1.152Mbps,並提供配套的上位機配置軟體,也可通過網頁或AT命令等方式輕鬆配置。

W5500S2E-S1模組整合了全硬體TCP/IP 協議棧乙太網介面晶片W5500,網路通訊更加快速、穩定、安全。使用者只需根據手冊中推薦的參考設計原理圖,即可快速完成硬體電路的設計,降低開發難度,節省開發時間。

今天我們就實際的來接觸一下W5500S2E-S1基於UDP工作模式的具體操作流程是什麼樣的,下面我們就來看看吧:

 

1、  具體操作流程

(1)、接線方式:

(2)、例程說明:

開啟“通過MCU配置S2E為UDP例程”,主程式中第一部分TIM3_Init();是設定一個幀中斷的時間定時器,這是因為該例程MCU的串列埠是通過幀中斷來接收AT命令配置S2E後返回的資料的。


第二部分USARTX_Init();初始化MCU用到的串列埠,這裡用USART1_Config();是printf功能,用於檢視除錯資訊。USART2_Config();用於配置S2E,需要注意的是該串列埠的配置引數需要同S2E的串列埠配置引數一致,否則配置失敗。


第三部分主迴圈中的UDP_Mode();用於配置S2E為UDP模式。S2E的AT命令列表詳見各個S2E型號的使用者手冊AT命令章節介紹。配置成功,串列埠列印“UDP Config Success!”,配置失敗串列埠列印“UDP Config Fail!”。

01 /****************************************************
02 函式名:		UDP_Mode
03 形參:			無
04 返回值:		無
05 函式功能:	配置S2E為UDP模式
06 ****************************************************/
07 volatile uint8_t SendFlag=0;
08 
09 void UDP_Mode(void)
10 { 
11   uint8_t RecvFlag=1;
12 	char *state;
13 	
14   switch(SendFlag)
15 	{
16 	  case 0:
17 		{
18 			Usart_Send(USART2,"AT\r\n");																											
19 			//終端檢測命令
20 		  while(RecvFlag)
21 	    { 
22 			  if(RX2_Point & FRAME_LEN)     													
23 			  //如果接收到資料
24         {
25 					 state=strstr((char *)RecvBuff,"OK");
26            if(state!=NULL)
27 					 {
28               RX2_Point=0;       																
29               //接收標誌位置零
30 				      RecvFlag=0;        																												
31 				      //狀態標誌位置零
32 						  SendFlag=1;
33 					    printf("Recv:%s\r\n",RecvBuff);
34 			        memset(RecvBuff,0,RECV_LEN); 
35 					 }
36 					 else{  
37 						 SendFlag=100;
38 						 RecvFlag=0;
39 					 } 
40 	      }	
41 	    }
42 	  }break;
43 	 case 1:
44 		{
45 			Usart_Send(USART2,"AT+ECHO=0\r\n");
46 			//開啟(1/關閉(0)回顯命令
47       RecvFlag=1;			
48 		  while(RecvFlag)
49 	    { 
50 			  if(RX2_Point & FRAME_LEN)//如果接收到資料
51         {   
52 					 state=strstr((char *)RecvBuff,"OK");
53            if(state!=NULL)
54 					 {
55               RX2_Point=0;
56 				      RecvFlag=0;
57 						  SendFlag=2;
58 					    printf("Recv:%s\r\n",RecvBuff);
59 			        memset(RecvBuff,0,RECV_LEN);   
60 					 }	
61            else{  
62 						 SendFlag=100;
63 						 RecvFlag=0;
64 					 }					 
65 	      }	
66 	    }
67 	  }break;
68 	 case 2:
69 		{
70 			Usart_Send(USART2,"AT+C1_OP=2\r\n");
71 			//配置為UDP模式命令
72 		  RecvFlag=1;		
73 		  while(RecvFlag)
74 	    { 
75 			  if(RX2_Point & FRAME_LEN)//如果接收到資料
76         {
77 					state=strstr((char *)RecvBuff,"OK");
78 					if(state!=NULL)
79 					{
80              RX2_Point=0;
81 				     RecvFlag=0;
82 					   SendFlag=3;     //狀態標誌位置零
83 					   printf("Recv:%s\r\n",RecvBuff);
84 			       memset(RecvBuff,0,RECV_LEN);			
85 	        }
86 				  else{  
87 						 SendFlag=100;
88 						 RecvFlag=0;
89 					 }
90 				 }
91 	    }
92 	  }break;
93 	 case 3:
94 		{
95 			Usart_Send(USART2,"AT+IP_MODE=1\r\n");
96 			//配置為DHCP模式
97 			RecvFlag=1;		
98 		  while(RecvFlag)
99 	    { 
100 			  if(RX2_Point & FRAME_LEN)//如果接收到資料
101         {
102 					state=strstr((char *)RecvBuff,"OK");
103 					if(state!=NULL)
104 					{
105              RX2_Point=0;
106 				     RecvFlag=0;
107 					   SendFlag=4;     //狀態標誌位置零
108 					   printf("Recv:%s\r\n",RecvBuff);
109 			       memset(RecvBuff,0,RECV_LEN);				     		
110 	        }
111 				  else{  
112 						 SendFlag=100;
113 						 RecvFlag=0;
114 					 }
115 				 }
116 	    }
117 	  }break;
118 	 case 4:
119 		{
120 			Usart_Send(USART2,"AT+C1_PORT=5000\r\n");  
121 			//配置本地埠號
122 			RecvFlag=1;		
123 		  while(RecvFlag)
124 	    { 
125 			  if(RX2_Point & FRAME_LEN)//如果接收到資料
126         {
127 					state=strstr((char *)RecvBuff,"OK");
128 					if(state!=NULL)
129 					{
130              RX2_Point=0;
131 				     RecvFlag=0;
132 					   SendFlag=5;     //狀態標誌位置零
133 					   printf("Recv:%s\r\n",RecvBuff);
134 					memset(RecvBuff,0,RECV_LEN);	
135   }
136 				  else{  
137 						 SendFlag=100;
138 						 RecvFlag=0;
139 					 }
140 				 }
141 	    }
142 	  }break;
143 	 case 5:
144 		{
145 			Usart_Send(USART2,"AT+C1_CLI_IP1=192.168.1.100\r\n");
146 			//配置遠端主機IP地址
147 			RecvFlag=1;		
148 		  while(RecvFlag)
149 	    { 
150 			  if(RX2_Point & FRAME_LEN)//如果接收到資料
151         {
152 					state=strstr((char *)RecvBuff,"OK");
153 					if(state!=NULL)
154 					{
155              RX2_Point=0;
156 				     RecvFlag=0;
157 					   SendFlag=6;     //狀態標誌位置零
158 					   printf("Recv:%s\r\n",RecvBuff);
159 			       memset(RecvBuff,0,RECV_LEN);		
160 	        }
161 				  else{  
162 						 SendFlag=100;
163 						 RecvFlag=0;
164 					 }
165 				 }
166 	    }
167 	  }break; 
168 	 case 6:
169 		{
170 			Usart_Send(USART2,"AT+C1_CLI_PP1=5000\r\n");
171 			//配置本地遠端埠號
172 			RecvFlag=1;		
173 		  while(RecvFlag)
174 	    { 
175 			  if(RX2_Point & FRAME_LEN)//如果接收到資料
176         {
177 					state=strstr((char *)RecvBuff,"OK");
178 					if(state!=NULL)
179 					{
180              RX2_Point=0;
181 				     RecvFlag=0;
182 					   SendFlag=7;     //狀態標誌位置零
183 					   printf("Recv:%s\r\n",RecvBuff);
184 			       memset(RecvBuff,0,RECV_LEN);		
185 	        }
186 				  else{  
187 						 SendFlag=100;
188 						 RecvFlag=0;
189 					 }
190 				 }
191 	    }
192 	  }break; 	
193 	 case 7:
194 		{
195 			Usart_Send(USART2,"AT+START_MODE=0\r\n");  
196 			//配置啟動模式(0--AT模式,1--資料模式)
197 			RecvFlag=1;		
198 		  while(RecvFlag)
199 	    { 
200 			  if(RX2_Point & FRAME_LEN)//如果接收到資料
201 {
202 					state=strstr((char *)RecvBuff,"OK");
203 					if(state!=NULL)
204 					{
205              RX2_Point=0;
206 				     RecvFlag=0;
207 					   SendFlag=8;     //狀態標誌位置零
208 					   printf("Recv:%s\r\n",RecvBuff);
209 			       memset(RecvBuff,0,RECV_LEN);
210 	        }
211 				  else{  
212 						 SendFlag=100;
213 					   RecvFlag=0;
214 					 }
215 				 }				
216 	    }
217 	  }break;	
218 	 case 8:
219 		{
220 			Usart_Send(USART2,"AT+EXIT\r\n");  
221 			//儲存配置並進入資料模式
222 		  RecvFlag=1;		
223 		  while(RecvFlag)
224 	    { 
225 			  if(RX2_Point & FRAME_LEN)//如果接收到資料
226         {
227 					state=strstr((char *)RecvBuff,"OK");
228 					if(state!=NULL)
229 					{
230              RX2_Point=0;
231 				     RecvFlag=0;
232 					   SendFlag=99;     //狀態標誌位置零
233 					   printf("Recv:%s\r\n",RecvBuff);
234 			       memset(RecvBuff,0,RECV_LEN);
235 					}	
236           else{  
237 						 SendFlag=100;
238              RecvFlag=0;						
239 					 }
240 				 }					
241 	      }      
242 	    }break;
243 	 case 99:
244 	  {
245 			printf("UDP Config Success!\r\n");
246 			Config_OK=1;
247 	  }
248 		default:
249 			RecvFlag=100;break;
250 	 case 100:
251 		{
252 		   printf("UDP Config Fail!\r\n");
253 			 Config_OK=1;
254 		}break;
255 	  }	
256  } 


在下一篇“教你如何通過MCU將S2E配置為TCP Server的工作模式”中,我將繼續與大家分享WIZnet W5500S2E-S1功能的實現,請大家拭目以待。


WIZnet官方網站:http://www.iwiznet.cn/


更多物聯網應用,關注WIZnet官方微訊號:




相關文章