ESP8266 字符串最大长度为 247 字节?

我编写了一个基于 Lua 脚本的 ESP8266 NodeMCU。在我调试字符串截断和扩展问题时,我将字符串从 ESP8266 发送到安卓手机。

我通过 UART 接口测试 ESP8266 时,发现了以下问题:当我声明一个字符串容器时,最大的字符串长度为 247 个字符。当我超过第 247 个字符时,就会发生错误:

stdin:1: unexpected symbol near '='

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

(我构建了一个 2048 字节的数据包和 86 字节的 HTTP Get 响应开销)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)
点赞
用户131929
用户131929

stdin:1: unexpected symbol near '='

这很像是你的“IDE”(例如ESPlorer)有问题。

另外,你应该分批发送长数据负载。SDK将数据包大小限制在大约1500字节,这是标准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..."
  • 点击“Send to ESP”(逐个字符通过UART发送)将失败,出现类似于此处报告的错误。

  • 将其保存到文件中可以正常工作。

    • 点击“Save”,将行保存到您的文件系统的一个文件中,例如paul.lua
    • 点击“Save to ESP”,将paul.lua发送到设备。
    • 如果它不是作为“Save to ESP”的一部分自动完成的,则可以将“dofile(“paul.lua”)”发送到设备。这将使变量buffer在全局空间中可用。
    • 发送print(buffer)将在终端窗口中打印整个字符串。
2016-07-17 20:01:46
用户6152957
用户6152957

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

"低层代码增加的延迟为 20ms,已有文件记载!"

因此,事件框架无法比这更快地处理。唯一的调整方法可能是在微控制器中缓冲数据,并且每 20ms 一次性发送,或者安装所谓的 "FreeRTOS SDK for ESP8266",其传输速度仅受 UART 速度限制。

2016-07-21 12:13:18