代码之家  ›  专栏  ›  技术社区  ›  Mohamed Embaby

ESP8266节点内存不足

  •  0
  • Mohamed Embaby  · 技术社区  · 6 年前

    NodeMCU信息

    > Lua 5.1.4 
    > SDK 2.2.1
    > Memory Usage :
    > Total : 3260490 bytes 
    > Used  : 9287 bytes 
    > Remain: 3251203 bytes
    

    json_response

    PANIC: unprotected error in call to Lua API (file.lua:5: out of memory)
    

    代码:

      -- a simple HTTP server
        srv = net.createServer(net.TCP)
        srv:listen(80, function(conn)
            conn:on("receive", function(sck, payload)
                sck:send("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n"..json_response)
            end)
            conn:on("sent", function(sck) sck:close() end)
        end)
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Marcel Stör    6 年前

    是的,如果你想发送很多数据,那就不行了。你得一件一件地寄过去。 Our API documentation 显示了两种方法(您可以在此处找到更多参考资料),第一种方法是:

    srv = net.createServer(net.TCP)
    
    function receiver(sck, data)
      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(localSocket)
        if #response > 0 then
          localSocket:send(table.remove(response, 1))
        else
          localSocket: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
    
    srv:listen(80, function(conn)
      conn:on("receive", receiver)
    end)