您的位置:首页 > 大数据 > 物联网

教你如何通过MCU将S2E配置为UDP的工作模式

2017-12-15 16:45 459 查看
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官方微信号:




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐