2016-04-13 12 views
0

メッセージを受信するサーバーを作成するシンプルなLuaスクリプトがあります。メッセージが 'led1'または 'led2'のとき、スクリプトは2つのGPIOの出力を反転します。問題は、スクリプトが2〜3回しか動作しないことです。私は実際のスクリプトで戻ってきます。NodeMCUでESP8266が3回しか応答しません

編集1:サーバ用のスクリプトでは、次の(GPIO部分がスクリプト簡素化するために削除された)である。

wifi.setmode(1) 
wifi.sta.config("my_router","12345678") 
tmr.delay(3000000) 
print(wifi.sta.getip()) 

s=net.createServer(net.TCP) 
s:listen(433,function(conn) 
    conn:on("receive",function(conn,payload) 
     print(payload) 
    conn:send("received") 
    end) 
    conn:on("sent",function(conn) conn:close() end) 
end) 

結果があるが、私はより多くのサーバーに「LED1」を送信する場合(以下3回):この後

>192.168.0.117 255.255.255.0 192.168.0.1 
>led1 
>led1 
>led1 

、クライアントは述べている)は、少なくともシリアル回線(「接続がタイムアウト」はESP8266はまだ動作

+2

エラーメッセージがある場合はそれを示します。 NodeMCUは再起動しますか? – dda

+0

実際のコードを表示するまで、疑問は無意味です。 –

+0

私は知っています。瞬間、私はちょうどこの種の問題が誰にも現れたかどうかを知りたがっていました。More come come –

答えて

1

3のtmr.delay wifiスタックが壊れてしまいます。 tmr.alarmを使用し、メイン処理を停止します。この例では、私のためにうまく働いた:

do 
    local srv = net.createServer(net.TCP) 
    srv:listen(8888, function(sk) 
     sk:on("receive", function(sk, rec) 
     print("Received ", rec) 
     sk:send("echo "..rec, sk.close) 
    end) 
    end) 
    function close() srv:close() end 
end 

を送信するために、最後の引数は、ソケットをクローズするだけで完了コールバックです。また、Luaレジスタのリスナー関数への参照を解放するには、srvを閉じる必要があります。

nodeMCUクラウドビルダーから現在のdevビルドを使用していることを確認してください。

+0

私はこの種の間違いをしたとは信じられません。 12時間後に私はそれをテストし、結果を教えてくれるでしょう!ありがとう! –

+0

実際、その遅延が問題でした。今、魅力のように動作します、ありがとう! –

0

これはテリーの答えに加えてあります。

主な問題はお客様のtmr.delay(3000000)です。 マイクロ秒(ミリ秒単位ではありません)を受け入れる理由があります。他に何も実行して、 ネットワークスタック(および他のもの)し得ないので、これは、一般的に悪い考えです

結果として転倒することができます:ここでAPI documentationからの抜粋です。 時刻tmr.delay()は、 周辺機器(コマンド間に(非常に)短い遅延を必要とする)を扱う場合には、 などとするのが適切です。 注意して使用してください!

最初に遅延を追加した理由は、WiFiスタックが完全に初期化される(つまりIPが割り当てられる)まで待つ必要があるためです。代わりにやりたいことは、WiFiが準備完了するまで1秒間隔で "ループ"するtmr.alarmを設定することです。ここでhttps://cknodemcu.wordpress.comから省略例です:私はold Gistで行うよう

--init.lua 
function startup() 
    -- do stuff here 
end 

print("set up wifi mode") 
wifi.setmode(wifi.STATION) 
wifi.sta.config(SSID,PASSWORD) 
wifi.sta.connect() 
tmr.alarm(1, 1000, 1, function() 
    if wifi.sta.getip() == nil then 
     print("IP unavaiable, Waiting...") 
    else 
     tmr.stop(1) 
     print("Config done, IP is "..wifi.sta.getip()) 
     print("You have 5 seconds to abort Startup") 
     print("Waiting...") 
     tmr.alarm(0, 5000, 0, startup) 
    end 
end) 

代わりのwifi.sta.getip()をチェックするあなたにもwifi.sta.status() == 5をチェックすることがあります。

また、net module API documentationをご覧ください。

関連する問題