我使用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)
答案 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..."
paul.lua
paul.lua
发送到设备。dofile("paul.lua")
发送到设备。这将使变量buffer
在全局空间中可用。print(buffer)
会将整个字符串打印到终端窗口。答案 1 :(得分:0)
问题似乎是不可避免的。参考espressif论坛:
“下级代码添加的延迟是20ms,有记录!”
所以事件框架不能比这更快地处理。调整此功能的唯一方法可能是缓冲微控制器中的数据并每隔20ms发送一次,或者安装所谓的“用于ESP8266的FreeRTOS SDK”,其传输速度仅受uart速度的限制。