2016-11-14 75 views
-1

我正在使用NodeMCU在LUA中對ESP8266 wifi模塊進行編程。我能夠從一個iPhone應用程序連接到由wifi模塊創建的TCP服務器來發送3個浮點數。我將這個巨大的字符串解析成3個字符串,並使用uart將它們發送給Arduino。它工作得很好,但大約10次輸入後,它崩潰/凍結。我需要不斷的數據流來保持未來,但始終如一,我無法可靠地做到這一點。 我在每行之後打印以跟蹤實際發生的情況,甚至之後我仍然不確定發生了什麼。TCP連接在讀取僅幾個字符串後崩潰

代碼 `

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:聽」 了幾次後

感謝您的幫助和抱歉,如果格式化搞砸了。第一次

回答

1

太長的評論,對不起。

驚慌:呼叫到Lua API未受保護的錯誤(試圖調用一個零值)

很難說哪值零/零。創建一個Minimal, Complete, and Verifiable Example (MCVE)以減少需要分析的代碼量。

下面的代碼片段最終會由於封閉的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構建20150704

不要使用那些老0.9.x版本的二進制文件,他們是過時的,含有大量的bug。 http://nodemcu.readthedocs.io/en/latest/en/#getting-started可幫助您開始使用新的固件。