2015-11-05 73 views
0

使用NodeMCU:驚慌:呼叫到Lua API未受保護的錯誤(標準輸入:8:試圖調用全球「跑」(一個零值))從<a href="https://github.com/nodemcu/nodemcu-firmware" rel="nofollow">https://github.com/nodemcu/nodemcu-firmware</a>運行下面的代碼

ssid = "www.mydomain.com" 
pass = "234234234432" 


gpio.write(0, gpio.LOW) 

print("Startup up wifi mode") 

wifi.setmode(wifi.STATION) 
wifi.sta.config(ssid, pass) 

wifi.sta.autoconnect(1) 
wifi.sta.connect() 


tmr.alarm(3, 1000, 1, function() 
    if (wifi.sta.status() < 5) then 
     print("Connecting...")   
    else 
     tmr.stop(3) 
     print("Connected having IP "..wifi.sta.getip()) 
     gpio.write(0, gpio.HIGH)   
     run()  
    end 
end) 

gpio.write(0, gpio.HIGH) 




function run() 
    print("run") 

    myhost="www.adafruit.com" 
    mypage="testwifi/index.html" 
    myip="" 

    sk=net.createConnection(net.TCP, 0) 
    sk:dns(myhost,function(conn,ip) 
    myip=ip 
    sk=net.createConnection(net.TCP, 0) 
    sk:on("receive", function(sck, c) print(c) end) 
    sk:connect(80,myip) 
    sk:send("GET/" .. mypage .." HTTP/1.1\r\nHost: " .. myhost .."\r\nConnection: keep-alive\r\nAccept: */*\r\n\r\n") 
    sk=nil 


end 

我得到這個錯誤:

PANIC: unprotected error in call to Lua API (stdin:8: attempt to call global 'run' (a nil value)) 
����m������!������!�1��� 
Waiting answer from ESP - Timeout reached. Command aborted. 

我該如何解決?

+0

將'run()'函數定義移動到'tmr.alarm()'調用的上方?! – siffiejoe

+0

請寫一個答案,以便我可以接受並解釋爲什麼這很重要。 – confile

+0

這個輸出意味着什麼'' m ! ! 1 ''?這裏有什麼不對嗎? – confile

回答

1

請記住,NodeMCU/Lua是完全異步的,並且這些函數需要在調用之前進行定義。

function start() 
    tmr.alarm(3, 1000, 1, function() 
     if (wifi.sta.status() < 5) then 
      print("Connecting...")   
     else 
      tmr.stop(3) 
      print("Connected having IP "..wifi.sta.getip()) 
      gpio.write(0, gpio.HIGH)   
      run()  
     end 
    end) 

    gpio.write(0, gpio.HIGH) 
end 

function run() 
    print("run") 

    myhost="www.adafruit.com" 
    mypage="testwifi/index.html" 
    myip="" 

    sk=net.createConnection(net.TCP, 0) 
    sk:dns(myhost,function(conn,ip) 
    myip=ip 
    sk=net.createConnection(net.TCP, 0) 
    sk:on("receive", function(sck, c) print(c) end) 
    sk:connect(80,myip) 
    sk:send("GET/" .. mypage .." HTTP/1.1\r\nHost: " .. myhost .."\r\nConnection: keep-alive\r\nAccept: */*\r\n\r\n") 
    sk=nil 
end 

start() 

另外,還要考慮如果您的設備連接鬆動到WiFi 後,連接成功時會發生什麼。您停止了定時器...

+0

當wifi連接丟失時我應該怎麼做? – confile

+0

您可以保留一個「全局」連接變量和一個永不停止監視它的計時器。例如:https://gist.github.com/marcelstoer/63ce6e6d78cef435d2ec –

+0

這個輸出是什麼意思 m ! ! 1 ?這裏有什麼不對嗎? – confile

相關問題