【问题标题】:TCP connection crashes after reading only a few strings仅读取几个字符串后 TCP 连接崩溃
【发布时间】:2016-11-14 05:28:37
【问题描述】:

我正在使用 ESP8266 wifi 模块使用 NodeMCU 在 LUA 中对其进行编程。我能够从 iPhone 应用程序连接到 wifi 模块创建的 TCP 服务器以发送 3 个浮点数。我将巨大的字符串解析为 3 个字符串,然后使用 uart 将它们发送到 Arduino。它工作得很好,但在大约 10 次输入后它崩溃/冻结。我需要源源不断的数据流来保持稳定,但我无法可靠地做到这一点。 我在每一行之后打印以跟踪实际发生的情况,即使在那之后我仍然不确定发生了什么。

代码 `

print("11\n")
wifi.setmode(wifi.STATION)
print("22\n")
wifi.sta.config("WDTS03","Walker14!")
print("33\n")
elWiFi =(wifi.sta.getip())
if elWiFi ~= nil then
    print(wifi.sta.getip())
end
print("44\n")
if srv~=nil then
    print("444\n")
    srv:close()
    print("555 \n")
end

print("Create server \n")
srv=net.createServer(net.TCP) 
print("1\n")
if srv ~= nil then
    print("srv !=nil \n")
    srv:listen(6969,function(conn) 
    print("listening \n")
        if conn ~= nil then
        print("incoming\n")

        conn:on("receive",function(conn,numbers) 
        print("2\n")
        print(#numbers)
        print("chekcing for nil \n")
        if numbers ~= nil then 
            print("3\n")
            p = string.find(numbers, "x=")
            print("4\n")
            q = string.find(numbers, "&y")
            print("5\n")
            if p ~= nill then
                print("6\n")
                if q ~=  nil then
                    print("7\n")
                    x = (string.sub(numbers,p+2, q-1))
                    print("x=" .. x)
                end
            end --p ~= nill
            print("8\n")
            p = string.find(numbers, "y=")
            print("9\n")
            q = string.find(numbers, "&z")
            print("10\n")
            if p ~= nill then
                print("11\n")
                if q ~=  nil then
                 print("12\n")
                    y = (string.sub(numbers,p+2, q-1))
                    print("y=" .. y)
                end
            end --p ~= nill
            print("13\n")
            p = string.find(numbers, "z=")
            print("14\n")
            q = string.find(numbers, " H")
            print("15\n")
            if p ~= nill then
                print("16\n")
                if q ~=  nil then
                    print("17\n")
                    z = (string.sub(numbers,p+2, q-1))
                    print("z=" .. z)
                end
            end-- p ~= nill
            print("18\n")

        end --numbers ~= nil
        print("54\n")

        --conn:send("test\n")

        end)
        print("55 \n")
        end
        print("66 \n")
    end)
    print("77\n")

end
print("666\n")`

我得到以下输出

11

22

33

44

Create server 

1

srv !=nil 

77

666

> listening 

incoming

55 

66 

listening 

incoming

55 

66 

listening 

incoming

55 

66 

listening 

incoming

55 

66 

2

338
chekcing for nil 

3

4

5

6

7

x=0.1722259521484375
8

9

10

11

12

y=-0.7733306884765625
13

14

15

16

17

z=-0.5716094970703125
18

54

2

337
chekcing for nil 

3

4

5

6

7

.
.--repeats a few times 
.

y=-0.005340576171875
13

14

15

16

17

z=-0.9838409423828125
18

54

PANIC: unprotected error in call to Lua API (attempt to call a nil value)
�l� �=+���T2n���

NodeMCU 0.9.6 build 20150704  powered by Lua 5.1.4
11

22`

几次后,“srv:listen”的“conn:on”参数失败

感谢您的帮助,如果格式混乱,我们深表歉意。第一次

【问题讨论】:

    标签: sockets tcp lua esp8266 nodemcu


    【解决方案1】:

    评论太长了,抱歉。

    PANIC:调用 Lua API 时出现不受保护的错误(尝试调用 nil 值)

    很难判断哪个值是 nil/null。创建Minimal, Complete, and Verifiable Example (MCVE) 以减少需要分析的代码量。

    后面的sn-p最终会因为关闭upvalues而导致内存不足。您的每个回调函数都应该使用它自己的传递的套接字实例的副本,而不是引用一个包装回调函数。第三行不应重复使用conn 变量,而是使用新名称定义一个变量。 详情请见https://stackoverflow.com/a/37379426/131929

    srv:listen(6969,function(conn)
      if conn ~= nil then
        conn:on("receive",function(conn,numbers)
    

    NodeMCU 0.9.6 build 20150704

    不要使用那些旧的 0.9.x 二进制文件,它们已经过时并且包含很多错误。 http://nodemcu.readthedocs.io/en/latest/en/#getting-started 帮助您开始使用新固件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-01
      • 2020-07-16
      • 1970-01-01
      • 2015-10-23
      • 2011-10-19
      • 1970-01-01
      相关资源
      最近更新 更多