您的位置:首页 > 理论基础 > 计算机网络

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

2018-01-04 16:39 555 查看
在上两篇文章中分别讲述了通过MCU配置S2E为UDP、TCP Server的工作模式”,相信小伙伴们已经对S2E的基本功能了解了一些,现在就让我们再接再厉、更上一层楼吧:
首先我们先了解一下MCU与S2E的接线方式:
1、 接线方式:



2、 例程说明:
打开“通过MCU配置S2E为TCP Client例程”,主程序中第一部分TIM3_Init();是设定一个帧中断的时间定时器,这是因为该例程MCU的串口是通过帧中断来接收AT命令配置S2E后返回的数据的。



第二部分USARTX_Init();初始化MCU用到的串口,这里用USART1_Config();是printf功能,用于查看调试信息。USART2_Config();用于配置S2E,需要注意的是该串口的配置参数需要同S2E的串口配置参数一致,否则配置失败。



第三部分主循环中的TCP_Client_Mode();用于配置S2E为TCP Client模式。S2E的AT命令列表详见各个S2E型号的用户手册AT命令章节介绍。配置成功,串口打印“TCP Client Config Success!”,配置失败串口打印“TCP Client Config Fail!”。

01
/****************************************************
02
函数名:TCP_Client_Mode
03
形参:无
04
返回值:无
05
函数功能:通过串口发送AT命令配置S2E模块
06
****************************************************/
07 volatile
uint8_t SendFlag=0;
08

09
void TCP_Client_Mode(void)
10
{
11
    uint8_t RecvFlag=1;
12
    char *state;
13
    switch (SendFlag) {
14
    case 0: {
15
        Usart_Send(USART2,"AT\r\n");                                                                
//终端检测命令
16
        while (RecvFlag) {
17
            if (RX2_Point & FRAME_LEN) {                                                    

18
                //如果接收到数据
19
                state=strstr((char *)RecvBuff,"OK");                                          

20
                      //判断回复的数据中是否有“OK”
21
                if (state!=NULL) {                                                                                           
//有
22
                    RX2_Point=0;                                                                        

23
                              //接收缓冲区指针置零
24
                    RecvFlag=0;                                                                                 

25
                             //接收标致位置零
26
                    SendFlag=1;                                                                                               
//发送标志位置零
27
                    printf("Recv:%s\r\n",RecvBuff);
28
                    memset(RecvBuff,0,RECV_LEN);                                            

29
                           //接收缓存清零
30
                } else {                                                                                                                           
//无
31
                    SendFlag=100;                                                                                             
//配置失败
32
                    RecvFlag=0;
33
                }
34
            }
35
        }
36
    }
37
    break;
38
    case 1: {
39
        Usart_Send(USART2,"AT+ECHO=0\r\n");                                                 

40
                   //开启(1)/关闭(0)回显命令
41
        RecvFlag=1;
42
        while (RecvFlag) {
43
            if (RX2_Point & FRAME_LEN) {
44
                state=strstr((char *)RecvBuff,"OK");
45
                if (state!=NULL) {
46
                    RX2_Point=0;
47
                    RecvFlag=0;
48
                    SendFlag=2;
49
                    printf("Recv:%s\r\n",RecvBuff);
50
                    memset(RecvBuff,0,RECV_LEN);
51
                } else {
52
                    SendFlag=100;
53
                    RecvFlag=0;
54
                }
55
            }
56
        }
57
    }
58
    break;
59
    case 2: {
60
        Usart_Send(USART2,"AT+C1_OP=1\r\n");                                      
//配置为TCP

61
                   Client模式命令
62
        RecvFlag=1;
63
        while (RecvFlag) {
64
            if (RX2_Point & FRAME_LEN) {
65
                state=strstr((char *)RecvBuff,"OK");
66
                if (state!=NULL) {
67
                    RX2_Point=0;
68
                    RecvFlag=0;
69
                    SendFlag=3;
70
                    printf("Recv:%s\r\n",RecvBuff);
71
                    memset(RecvBuff,0,RECV_LEN);
72
                } else {
73
                    SendFlag=100;
74
                    RecvFlag=0;
75
                }
76
            }
77
        }
78
    }
79
    break;
80
    case 3: {
81
        Usart_Send(USART2,"AT+IP_MODE=1\r\n");                                            

82
                   //配置DHCP模式命令
83
        RecvFlag=1;
84
        while (RecvFlag) {
85
            if (RX2_Point & FRAME_LEN) {
86
                state=strstr((char *)RecvBuff,"OK");
87
                if (state!=NULL) {
88
                    RX2_Point=0;
89
                    RecvFlag=0;
90
                    SendFlag=4;
91
                    printf("Recv:%s\r\n",RecvBuff);
92
                    memset(RecvBuff,0,RECV_LEN);
93
                } else {
94
                    SendFlag=100;
95
                    RecvFlag=0;
96
                }
97
            }
98
        }
99
    }
100
    break;
101
    case 4: {
102
        Usart_Send(USART2,"AT+C1_PORT=5000\r\n");                           

103
                   //配置S2E的本地端口号
104
        RecvFlag=1;
105
        while (RecvFlag) {
106
            if (RX2_Point & FRAME_LEN) {
107
                state=strstr((char *)RecvBuff,"OK");
108
                if (state!=NULL) {
109
                    RX2_Point=0;
110
                    RecvFlag=0;
111
                    SendFlag=5;
112
                    printf("Recv:%s\r\n",RecvBuff);
113
                    memset(RecvBuff,0,RECV_LEN);
114
                } else {
115
                    SendFlag=100;
116
                    RecvFlag=0;
117
                }
118
            }
119
        }
120
    }
121
    break;
122
    case 5: {
123
        Usart_Send(USART2,"AT+C1_CLI_IP1=192.168.1.109\r\n");     

124
                   //配置远程服务器的IP地址
125
        RecvFlag=1;
126
        while (RecvFlag) {
127
            if (RX2_Point & FRAME_LEN) {
128
                state=strstr((char *)RecvBuff,"OK");
129
                if (state!=NULL) {
130
                    RX2_Point=0;
131
                    RecvFlag=0;
132
                    SendFlag=6;
133
                    printf("Recv:%s\r\n",RecvBuff);
134
                    memset(RecvBuff,0,RECV_LEN);
135
                } else {
136
                    SendFlag=100;
137
                    RecvFlag=0;
138
                }
139
            }
140
        }
141
    }
142
    break;
143
    case 6: {
144
        Usart_Send(USART2,"AT+C1_CLI_PP1=5000\r\n");                                      

145
                   //配置远程服务器的端口号
146
        RecvFlag=1;
147
        while (RecvFlag) {
148
            if (RX2_Point & FRAME_LEN) {
149
                state=strstr((char *)RecvBuff,"OK");
150
                if (state!=NULL) {
151
                    RX2_Point=0;
152
                    RecvFlag=0;
153
                    SendFlag=7;
154
                    printf("Recv:%s\r\n",RecvBuff);
155
                    memset(RecvBuff,0,RECV_LEN);
156
                } else {
157
                    SendFlag=100;
158
                    RecvFlag=0;
159
                }
160
            }
161
        }
162
    }
163
    break;
164
    case 7: {
165
        Usart_Send(USART2,"AT+START_MODE=0\r\n");
166
        //配置下次上电启动模式(0-AT模式,1-
167
        数据模式)
168
        RecvFlag=1;
169
        while (RecvFlag) {
170
            if (RX2_Point & FRAME_LEN) {
171
                state=strstr((char *)RecvBuff,"OK");
172
                if (state!=NULL) {
173
                    RX2_Point=0;
174
                    RecvFlag=0;
175
                    SendFlag=8;
176
                    printf("Recv:%s\r\n",RecvBuff);
177
                    memset(RecvBuff,0,RECV_LEN);
178
                } else {
179
                    SendFlag=100;
180
                    RecvFlag=0;
181
                }
182
            }
183
        }
184
    }
185
    break;
186
    case 8: {
187
        Usart_Send(USART2,"AT+EXIT\r\n");                                                  
188
                   //保存配置并进入数据模式
189
        RecvFlag=1;
190
        while (RecvFlag) {
191
            if (RX2_Point & FRAME_LEN) {
192
                state=strstr((char *)RecvBuff,"OK");
193
                if (state!=NULL) {
194
                    RX2_Point=0;
195
                    RecvFlag=0;
196
                    SendFlag=99;
197
                    printf("Recv:%s\r\n",RecvBuff);
198
                    memset(RecvBuff,0,RECV_LEN);
199
                } else {
200
                    SendFlag=100;
201
                    RecvFlag=0;
202
                }
203
            }
204
        }
205
    }
206
    break;
207
    case 99: {                                                                            
208
        printf("TCP Client Config Success!\r\n");
209
        Config_OK=1;
210
    }
211
    default:
212
        RecvFlag=100;
213
        break;
214
    case 100: { 
215
        printf("TCP Client Config Fail!\r\n");
216
        Config_OK=1;
217
    }
218
    break;
219
    }
220
}
W5500S2E-S1是一款工业级串口转以太网模块,支持多种波特率,从1.2Kbps至1.152Mbps。采用了WIZnet公司的硬件TCP/IP协议以太网芯片W5500。这是更快、更稳定、更安全的以太网解决方案。

WIZnet官方网站:http://www.iwiznet.cn/ 
WIZnet官方技术服务平台(Q群):595547972
更多物联网应用,关注WIZnet官方微信号:

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