2016-11-14 11 views
-1

Я работаю с модулем wifi ESP8266, программируя его в LUA с помощью NodeMCU. Мне удалось подключиться из приложения iPhone к TCP-серверу, созданному модулем wifi, чтобы отправить 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` 

Это не будет работать на "свя: на" аргумент для "СРВ: Listen" после того, как несколько раз

Спасибо за помощь и извините, если форматирование перепутано. Первый раз

ответ

1

Слишком долго для комментария, извините.

PANIC: незащищенный ошибка в вызове 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 двоичные файлы, они устарели и содержат много ошибок. http://nodemcu.readthedocs.io/en/latest/en/#getting-started поможет вам начать работу с новой прошивкой.