Arduino与Proteus仿真-WiFi TCP客户端数据通信

TCP客户端数据通信

文章目录

本文将介绍Arduino在Protues仿真环境中作为TCP客户端,如何与TCP服务器进行数据通信。

1、软件准备

1)Arduino IDE或 VSCode + PlatformIO

2)Proteus电路仿真软件

3)Arduino的Proteus仿真模型库,ArduinoLibraryforProteusV2.0.zip

4)串口调试工具软件

在前面的文章中,我们对如何搭建Arduino在Proteus中如何进行网络仿真,WiFi网络连接,请参考:

2、硬件准备

1)WiFi模块:ESP01-S模块或其他带标准AT固件的WiFi模块,本文使用ESP01-S模块。

2)串口(TTL)转USB模块。该模块用于连接ESP01-S的串口引脚并通过USB接口连接到电脑。

3、仿真电路原理图

在这里插入图片描述

4、仿真代码实现

示例代码使用到如下开源库:

该库与Arduino的WiFi库和Ethernet 类似,因此使用起来非常方便。下面将实现如何创建一个TCP客户端并与TCP服务器进行通信。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <Arduino.h>

#define DEBUG\_ESP8266\_AT\_WEBSERVER\_PORT Serial

// 日志输出
#define \_ESP\_AT\_LOGLEVEL\_ 1
#define ESP\_AT\_USE\_AVR 1
#define BOARD\_TYPE "AVR Mega2560"
#define EspSerial Serial1
#define BOARD\_NAME BOARD\_TYPE
#define MULTIPLY\_FACTOR 1

#include "ESP8266\_AT\_WebServer.h"

// WiFi连接信息
char ssid[] = "\*\*\*\*\*\*\*";
char pass[] = "\*\*\*\*\*\*\*";

int status = WL_IDLE_STATUS; // WiFi状态

char server[] = "192.168.2.78"; // TCP服务地址

// 初始化TCP客户端
ESP8266_AT_Client client;

void printWifiStatus();

void setup(){
// 初始化调试串口
Serial.begin(115200);

// 初始化 ESP模块串口
EspSerial.begin(115200);
// 初始化 ESP模块
WiFi.init(&EspSerial);

Serial.println(F("WiFi shield init done"));

// 检查ESP模块是否连接
if (WiFi.status() == WL_NO_SHIELD)
{
Serial.println(F("WiFi shield not present"));

while (true);
}

while ( status != WL_CONNECTED)
{
Serial.print(F("Connecting to SSID: "));
Serial.println(ssid);
// 连接WiFi
status = WiFi.begin(ssid, pass);
}

// 打印连接信息
printWifiStatus();

Serial.println();
Serial.println(F("Starting connection to tcp server..."));

// client.stop();

// 连接TCP服务器
if (client.connect(server, 8081))
{
Serial.println(F("Connected"));
client.println(F("Hello,TCP Server"));
}else{
Serial.println(F("Connection failed"));
while(true);
}
}


void loop() {
// put your main code here, to run repeatedly:
while (client.available()) {
// 读取服务器端数据
char c = client.read();
Serial.print(c);
}
Serial.flush();
// 从串口读取数据并发送到服务端
while (Serial.available() > 0) {
char inChar = Serial.read();
if (client.connected()) {
client.print(inChar);
}
}

// 检查服务器是否断开连接
if (!client.connected()) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
// do nothing:
while (true) {
delay(1000);
}
}
delay(10);
}

void printWifiStatus(){

Serial.print(F("You're connected to the network, IP = "));
// WiFi IP地址
Serial.println(WiFi.localIP());

Serial.print(F("SSID: "));
Serial.print(WiFi.SSID());

// WiFi信号强度
int32\_t rssi = WiFi.RSSI();
Serial.print(F(", Signal strength (RSSI): "));
Serial.print(rssi);
Serial.println(F(" dBm"));
}

代码如何工作?

1)导入依赖库头文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <Arduino.h>

#define DEBUG_ESP8266_AT_WEBSERVER_PORT Serial

// 日志输出
#define _ESP_AT_LOGLEVEL_ 1
#define ESP_AT_USE_AVR 1
#define BOARD_TYPE "AVR Mega2560"
#define EspSerial Serial1
#define BOARD_NAME BOARD_TYPE
#define MULTIPLY_FACTOR 1

#include "ESP8266_AT_WebServer.h"

2)声明WiFi连接信息及状态

1
2
3
4
5
6
7
8
// WiFi连接信息
char ssid[] = "666";
char pass[] = "66668888";

int status = WL_IDLE_STATUS; // WiFi状态

char server[] = "192.168.2.78"; // TCP服务地址

3)创建TCP客户端对象

1
2
ESP8266_AT_Client client;

4)在setup函数中

初始化调试串口

1
2
Serial.begin(115200);

初始化ESP模块串口

1
2
EspSerial.begin(115200);

初始化ESP模块

1
2
WiFi.init(&EspSerial);

检查模块是否已经连接

1
2
3
4
5
6
7
if (WiFi.status() == WL_NO_SHIELD)
{
Serial.println(F("WiFi shield not present"));

while (true);
}

等待WiFi热点连接完成

1
2
3
4
5
6
7
8
9
10
while ( status != WL_CONNECTED)
{
Serial.print(F("Connecting to SSID: "));
Serial.println(ssid);
// 连接WiFi
status = WiFi.begin(ssid, pass);
}



打印ESP模块连接信息

1
2
3
// 打印连接信息
printWifiStatus();

连接TCP服务器

1
2
3
4
5
6
7
8
9
10
// 连接TCP服务器
if (client.connect(server, 8081))
{
Serial.println(F("Connected"));
client.println(F("Hello,TCP Server"));
}else{
Serial.println(F("Connection failed"));
while(true);
}

5)在loop函数中监听服务器数据和通过串口读取输入并向服务器端发送数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void loop() {
// put your main code here, to run repeatedly:
while (client.available()) {
// 读取服务器端数据
char c = client.read();
Serial.print(c);
}
Serial.flush();
// 从串口读取数据并发送到服务端
while (Serial.available() > 0) {
char inChar = Serial.read();
if (client.connected()) {
client.print(inChar);
}
}

// 检查服务器是否断开连接
if (!client.connected()) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
// do nothing:
while (true) {
delay(1000);
}
}
delay(10);
}

6)ESP模块信息输出实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void printWifiStatus(){

Serial.print(F("You're connected to the network, IP = "));
// WiFi IP地址
Serial.println(WiFi.localIP());

Serial.print(F("SSID: "));
Serial.print(WiFi.SSID());

// WiFi信号强度
int32\_t rssi = WiFi.RSSI();
Serial.print(F(", Signal strength (RSSI): "));
Serial.print(rssi);
Serial.println(F(" dBm"));
}

5、仿真结果

在这里插入图片描述

文章来源: https://iotsmart.blog.csdn.net/article/details/133185198