ESP8266字符串最大大小247字节?

时间:2016-07-17 18:47:00

标签: tcp lua esp8266 nodemcu

我使用Lua脚本编程ESP8266 NodeMCU。当我调试问题时,字符串刚开始被切断并进一步扩展。我从ESP8266发送到Android手机。

我更关注通过UART接口测试esp,遇到以下问题: 声明字符串容器时的最大字符串大小为247个字符。在我超过247之后出现错误:

  

stdin:1:' ='

附近的意外符号

字符串显然太长了但我需要为每个字符串发送至少2048个字节以获得最大效率。是否可以扩展字符串变量的输入限制?

(我为HTTP Get响应构建了一个2048字节的数据包和86字节的开销) ESP8266的TCP Tx缓冲区为2920字节。

str_resp0 = "HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=UTF-8\r\n";
str_resp1 = "Connection: close\r\n\r\n";

send_buf = "";

uart.on("data", "$",
  function(data)
    t = {send_buf,data}
    send_buf = table.concat(t);

    if data=="quit$" then
      uart.on("data") -- quit the function
    end
end, 0)

srv=net.createServer(net.TCP)
srv:listen(80,function(conn)
  conn:on("receive",function(conn,payload)
    --print(payload)
    conn:send(str_resp0)
    conn:send(str_resp1)
    conn:send(send_buf)
    send_buf = "";
  end)
  conn:on("sent",function(conn) conn:close() 
  end)
end)

2 个答案:

答案 0 :(得分:1)

  

stdin:1:'='

附近的意外符号

听起来非常像你的“IDE”(ESPlorer?)。

此外,您应该批量发送长有效负载。 SDK将数据包大小限制为大约1500字节,即standard Ethernet MTU

http://nodemcu.readthedocs.io/en/latest/en/modules/net/#netsocketsend有一些解释和一个很好的例子。

srv = net.createServer(net.TCP)
srv:listen(80, function(conn)
  conn:on("receive", function(sck, req)
    local response = {}

    -- if you're sending back HTML over HTTP you'll want something like this instead
    -- local response = {"HTTP/1.0 200 OK\r\nServer: NodeMCU on ESP8266\r\nContent-Type: text/html\r\n\r\n"}

    response[#response + 1] = "lots of data"
    response[#response + 1] = "even more data"
    response[#response + 1] = "e.g. content read from a file"

     -- sends and removes the first element from the 'response' table
    local function send(sk)
      if #response > 0
        then sk:send(table.remove(response, 1))
      else
        sk:close()
        response = nil
      end
    end

    -- triggers the send() function again once the first chunk of data was sent
    sck:on("sent", send)

    send(sck)
  end)
end)

更新2016-07-18

在ESPlorer中进行一些实验的结果。该测试使用单个初始化变量:

buffer = "A very long string with more than 250 chars..."
  • 点击'发送到ESP'(通过UART发送char-by-char)将失败,并出现类似于此处报告的错误。
  • 将其保存到文件中可以正常工作。
    • 点击“保存”,会将该行保存到文件系统上的文件中,例如paul.lua
    • 点击“保存到ESP”,会将paul.lua发送到设备。
    • 如果不是作为“保存到ESP”的一部分自动完成,您可以将dofile("paul.lua")发送到设备。这将使变量buffer在全局空间中可用。
    • 发送print(buffer)会将整个字符串打印到终端窗口。

答案 1 :(得分:0)

问题似乎是不可避免的。参考espressif论坛:

“下级代码添加的延迟是20ms,有记录!”

所以事件框架不能比这更快地处理。调整此功能的唯一方法可能是缓冲微控制器中的数据并每隔20ms发送一次,或者安装所谓的“用于ESP8266的FreeRTOS SDK”,其传输速度仅受uart速度的限制。