织布先生 2023-03-23 11:36 采纳率: 0%
浏览 15

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

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-03-23 21:42
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

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

报告相同问题?

问题事件

  • 创建了问题 3月23日

悬赏问题

  • ¥15 python运行报错 ModuleNotFoundError: No module named 'torch'
  • ¥100 华为手机私有App后台保活
  • ¥15 sqlserver中加密的密码字段查询问题
  • ¥20 有谁能看看我coe文件到底哪儿有问题吗?
  • ¥20 我的这个coe文件到底哪儿出问题了
  • ¥15 matlab使用自定义函数时一直报错输入参数过多
  • ¥15 设计一个温度闭环控制系统
  • ¥100 rtmpose姿态评估
  • ¥15 通联支付网上收银统一下单接口
  • ¥15 angular有偿编写,