背景
学嵌入式,调试的时候基本上都是拖着串口进行测试,但有时候连延长线都解决不了的问题:电脑在房间,节点需要跑到窗边进行数据采集比如GPS,此时就会变得很不方便。
此文使用ESP8266-01S进行测试,基于Arduino进行编程,实现两个ESP8266之间的开机自动配对连接,使用TCP通信,实现两个串口之间的无线传输,基于波特率9600进行测试无任何数据丢失。
(一)服务器端
服务器端主要的内容为:设置wifi为AP模式,设置热点,开启80端口的TCP服务器,当有客户端连接并且串口有数据时将数据转发到客户端,当客户端有数据时打印到串口。
#include <ESP8266WiFi.h>
// #include <ESP8266Ping.h>
#define BAUDRATE 115200 // 串口波特率
IPAddress apIP(192, 168, 4, 1); // 8266 DNS的AP-IP地址
WiFiServer server(80); //启动服务器
String ssid = "WIFINAME"; //默认SSID
String pssd = "88888888"; //默认密码
void setup()
{
Serial.begin(BAUDRATE);
WiFi.hostname("8266-AP"); // 设置ESP8266设备名
WiFi.mode(WIFI_AP);
if (WiFi.softAP(ssid, pssd, 6, false)) // 接入点是否隐藏SSID:false
{
Serial.println("[success]ESP8266-AP-is-readdy");
}
IPAddress ip = WiFi.softAPIP(); //获取ip地址
// Serial.println(ip); //打印出来ip地址
server.begin();
}
WiFiClient client;
void loop()
{
delay(500);
Serial.println("Waiting for client connection");
client = server.available();
if (client)
{
if (client.connected())
{
Serial.print("[success]Client Connected!");
Serial.println(client.remoteIP());
}
while (client.connected())
{
while (client.available() > 0)
{
Serial.write(client.read()); // 读取从连接的设备的数据
}
while (Serial.available() > 0)
{
client.write(Serial.read()); // 从串口读取数据发送给连接的客户端
}
}
client.stop();
Serial.println("[fail]Client disconnected");
}
}
(二)客户端
客户端主要的内容为:设置wifi为STA模式,连接wifi,连接对应wifi的80端口的TCP服务器,当连上了服务器并且串口有数据时将数据转发到服务器端,当服务器端有数据时打印到串口。
#include <ESP8266WiFi.h>
#define SSID "WIFINAME" // wifi名字
#define PASSWD "88888888" // wifi密码
#define BAUDRATE 115200 // 串口波特率
const char *host = "192.168.4.1"; // TCP服务器ip
const uint16_t port = 80; // 端口
WiFiClient client; //创建一个tcp client连接
void setup()
{
Serial.begin(BAUDRATE);
WiFi.mode(WIFI_STA); // 配置为STA模式
connect_Network(); // 连接wifi
}
void loop()
{
if (WiFi.status() != WL_CONNECTED) // wifi重连
connect_Network();
while (client.available() > 0)
{
Serial.write(client.read()); // 从服务器获取数据,将它打印到串口
}
while (Serial.available() > 0)
{
client.write(Serial.read()); // 从串口服务数据,上传到TCP服务器
}
}
void connect_Network()
{
WiFi.begin(SSID, PASSWD); // 连接wifi
Serial.println("Wait for WiFi... ");
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(500);
}
Serial.println("\n[success]WiFi connected");
if (client.connect(host, port)) // 连接TCP服务器
Serial.println("[success]Service Connected!");
}
(三)注意事项
1、波特率一致,低波特率更稳定
2、两个ESP8266的WIFI名和密码需要配对一致
3、主机IP一致
4、端口一致
5、以上代码中,客户端会自动重连,服务器端的重连只实现了50%
(四)测试结果
1、在波特率为11500的条件下,使用电脑对ESP8266搭建的TCP服务器进行测试的结果,无数据丢失
2、使用两个ESP8266-01s进行测试,连接linux板子进行命令行测试
进入系统并且成功登录,命令行测试正常,与直接连接串口无明显差异
下集预告
使用EDA绘制PCB,于11月3日下单打板,后续测试如何欢迎持续关注