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

WIZnet發表於2017-12-25
在上一篇文章中講了“如何通過MCU配置S2E為UDP模式”,相信小夥伴們已經瞭解了S2E的基本功能,在這一篇中,我們再接再厲,繼續學習一下“如何通過MCU配置S2E為TCP Server的工作模式”,無論是配置UDP模式還是配置TCP模式,都是通過串列埠轉乙太網的方式實現的:

1、 接線方式


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

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


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

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


W5500S2E-S1是一款工業級串列埠轉乙太網模組,支援多種波特率,從1.2Kbps至1.152Mbps。採用了WIZnet公司的硬體TCP/IP協議乙太網晶片W5500。這是更快、更穩定、更安全的乙太網解決方案。


在下一篇“教你如何通過MCU將S2E配置為TCP Client的工作模式”中,我將繼續與大家分享WIZnet W5500S2E-S1的功能,請大家敬請期待吧!

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


WIZnet官方技術服務QQ群:595547972


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





相關文章