arduino-esp8266开发tcp客户端

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");
}

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^