乐鑫技术交流
直播中

贾桂林

7年用户 1505经验值
私信 关注
[问答]

从Esp8266发送文件到Python-TCP-Server速度很慢的原因?

我取得了以下成就:
我有一个 Teensey-Ultimate GPS sheild-esp8266 设置。我正在尝试使用 TCP 将存储在 SD 卡中的 1Mb 文件发送到本地 python 服务器。我能够发送文件,但问题是它正在占用4 分钟发送 1Mb 文件,而当我从一个发送时,同一个文件Python 客户端脚本需要 5 秒。
数据传输缓慢的原因是什么?有没有办法提高速度。Arduino和Python环境有任何问题吗?
以下是我的Arduino和Python草图:

#include
//------------------------------------------------------
#include
//#include
#define TIMEOUT 5000 // mS
#define LED 13
#include
SDF标准差;
SdFile myFile;
const int chipSelect = SS;
//---------------------------------------------------------------------------
#define DEBUG true
void setup() 无效设置()
{
  Serial.begin(115200);
  Serial1.begin(2000000);
  Serial1.attachCts(20);
delay(1000);
Serial.println("Initializing SD card...");
if (!sd.begin(chipSelect, SPI_FULL_SPEED)) sd.initErrorHalt();
delay(1000);
Serial.println("Card Initialized");

  //AT+UART_DEF=2000000,8,1,0,1....use this command to set BAUD RATE
  sendData("ATrn",2000,DEBUG):
  sendData("AT+CIFSRrn",2000,DEBUG); // get ip address
  sendData("AT+CIPMUX=0rn",1000,DEBUG); // configure for multiple connections
  sendData("AT+CIPMODE=1rn",1000,DEBUG);
  sendData2("AT+CIPSTART="TCP","192.168.0.119",80",2000);
----------------查找导入字符串--------------------
//Serial.print("ENTER STRING:");
String IncomingString="";
布尔值 StringReady = false;
延迟(2000);
StringReady= 真;
如果 (StringReady){
  //----------------READ FILE IF FOUND IMPORT STRING--------------------
  
  if (!myFile.open("DATA3.TXT", O_READ))
      {
      sd.errorHalt("opening test.txt for read failed");
      }
      millisStartTime = millis();
      sendData2("rn",1000);
      sendData2("AT+CIPSENDrn",2000);
      while(myFile.available())
       {
          Serial1.print(myFile.read());
      }
      sendData2("rn",500);
      sendData2("+++",1000);
      sendData("AT+CIPCLOSE=1rn",1000,DEBUG);
      myFile.close();
     }
}
void loop()
{
  
  }
String sendData(String command, const int timeout, boolean debug)
{
    String response = "";
    Serial1.print(command);
    long int time = millis();
    while( (time+timeout) > millis())
    {
      while(Serial1.available())
      {
        char c = Serial1.read(); // read the next character.
        response+=c;
      }  
    }
    if(debug)
    {
      Serial.print(response);
    }
    return response;
   }

   String sendData2(String command, const int timeout)
{
    String response = "";
    Serial1.print(command);
    long int time = millis();
    while( (time+timeout) > millis())
    {
      while(Serial1.available())
      {
        char c = Serial1.read(); // read the next character.
        response+=c;
      }  
    }
   Serial.print(response);
   return response;
   }


import socket               # Import socket module
导入时间

s = socket.socket()         # Create a socket object
主机 = '192.168.0.119'
port = 80                 # Reserve a port for your service.
s.bind((host, port))        # Bind to the port
f = 开('Got_File.txt','WB')
s.listen(5)                 # Now wait for client connection.
而 True:
    c, addr = s.accept()     # Establish connection with client.
    print ('Got connection from', addr)
    start_time = time.time()
    print ("Receiving Data from Client...")
    l = c.recv(1024)
    while (l):
        print ("Receiving...")
        f.write(l)
        #print (l)
        l = c.recv(1024)
    f.close()
    #s.shutdown(socket.SHUT_WR)
    print ("Done Receiving")
    print("--- %s seconds ---" % (time.time() - start_time))
    #c.send('Thank you for connecting')
    c.close()


回帖(1)

fansz

2024-7-20 16:31:46
从您的描述来看,您正在使用 ESP8266 通过 TCP 将一个 1MB 的文件发送到本地 Python 服务器,但传输速度非常慢。有几个可能的原因导致这种情况:

1. **网络环境**:如果您的网络环境不稳定或者带宽有限,这可能会影响数据传输速度。

2. **ESP8266 的性能**:ESP8266 是一款低成本的 Wi-Fi 模块,其处理速度和内存有限。在处理大量数据时,可能会导致传输速度变慢。

3. **SD 卡的读写速度**:SD 卡的读写速度可能会影响文件的传输速度。如果您使用的是低速 SD 卡,可能会导致传输速度变慢。

4. **TCP 协议的特性**:TCP 协议本身是一个面向连接的、可靠的、基于字节流的传输层通信协议。在某些情况下,TCP 的可靠性和连接性可能会导致传输速度变慢。

为了提高传输速度,您可以尝试以下方法:

1. **优化网络环境**:确保您的网络环境稳定且带宽足够。

2. **使用更高性能的 Wi-Fi 模块**:如果您的预算允许,可以考虑使用更高性能的 Wi-Fi 模块,如 ESP32。

3. **优化 SD 卡读写速度**:使用高速 SD 卡,以提高文件的读写速度。

4. **调整 TCP 窗口大小**:尝试调整 TCP 窗口大小,以提高传输效率。但请注意,这可能会影响 TCP 的可靠性。

5. **使用 UDP 协议**:如果您的应用程序可以容忍一定程度的数据丢失,可以考虑使用 UDP 协议进行数据传输。UDP 协议相对于 TCP 协议具有更高的传输速度,但可靠性较低。

6. **优化代码**:检查您的 Arduino 和 Python 代码,看看是否有可以优化的地方,以提高传输效率。

请注意,这些方法可能会对您的应用程序的可靠性和稳定性产生影响。在实际应用中,请根据您的具体需求进行权衡。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分