esp8266 nodemcu使用arduino作为tcp客户端,同时连接传感器和wifi,实时向python编程的tcp服务端传输传感器数据。
主要发现有三点问题:
一个是传输和接收的速率并不一致,arduino这边串口监视器显示一秒钟大概有几十次传输记录,但是python那边接收并没有这么快
第二个问题更关键,每隔几秒数据传输就会卡顿一两秒的样子,这样采集的数据就不完整了
第三个就是Python接收数据经常会有空包和不完整的数据,例如发送我是中国人,会接收到“我”,然后再接收到“是中国人”
望各位能指点一下怎样让数据传输更稳定,尤其是第二个问题最致命,其他两点至少数据还是连贯的。
import socket
import time
# 创建socket
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 本地信息
address = ('192.168.111.145', 7788)
# 绑定
tcp_server_socket.bind(address)
tcp_server_socket.listen(128)
recv_head=''
while True:
# 等待新的客户端连接
client_socket, clientAddr = tcp_server_socket.accept()
#print('client:', client_socket)
#print('addr:', clientAddr)
while True:
# 接收对方发送过来的数据
recv_data = client_socket.recv(10240) # 接收1024个字节
recv_data = recv_data.decode('gbk')
if len(recv_data)==0:
break
elif len(recv_data)<60:
recv_head = recv_data
continue
else:
print('接收到的数据为:', recv_data)
print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
recv_head = ''
break
tcp_server_socket.close()
这是python代码和arduino代码
#include <JY901.h>
#include <ESP8266WiFi.h> // ESP8266WiFi library
/*
Test on Uno R3.
JY901 UnoR3
TX <---> 0(Rx)
*/
const char* ssid = "zzz"; // WiFi ssid
const char* password = "12345678"; // password
void setup()
{
Serial.begin(9600);
JY901.attach(Serial);
WiFi.mode(WIFI_STA); // Set the Wifi working mode to STA, and the default is AP+STA mode
WiFi.begin(ssid, password); // connect to WIFI
Serial.print("\r\nConnecting to "); // The serial monitor outputs network connection information
Serial.print(ssid); Serial.println(" ..."); //
int i = 0; //
while (WiFi.status() != WL_CONNECTED) //
{ //
delay(1000); // check WiFi.status() return value every 1 second
Serial.print("waiting for ");
Serial.print(i++); Serial.println("s...");
}
Serial.println(""); // WiFi connected successfully
Serial.println("WiFi connected!"); //
Serial.print("IP address: "); //
Serial.println(WiFi.localIP()); //
}
const char* host = "192.168.111.145";
const uint16_t port = 7788;
void loop()
{
/* create a new WiFiClient as TCP client */
JY901.receiveSerialData();
WiFiClient tcpclient;
/* Establish a TCP connection */
if (!tcpclient.connect(host, port)) {
Serial.println("connection failed"); // if connection failed,print info
return;
}
/*connect success,send data*/
if (tcpclient.connected()) {
/*send to server-----acceleration*/
Serial.println("connection succeed");
tcpclient.print("Acc:");
tcpclient.print(JY901.getAccX());
tcpclient.print(" ");
tcpclient.print(JY901.getAccY());
tcpclient.print(" ");
tcpclient.print(JY901.getAccZ());
tcpclient.print("\n");
/*send to server-----angular velocity*/
tcpclient.print("Gyro:");
tcpclient.print(JY901.getGyroX());
tcpclient.print(" ");
tcpclient.print(JY901.getGyroY());
tcpclient.print(" ");
tcpclient.print(JY901.getGyroZ());
tcpclient.print("\n");
/*send to server-----angle*/
tcpclient.print("Angle:");
tcpclient.print(JY901.getRoll());
tcpclient.print(" ");
tcpclient.print(JY901.getPitch());
tcpclient.print(" ");
tcpclient.print(JY901.getYaw());
tcpclient.print("\n");
}
Serial.println("11111 succeed");
}