2016-11-14 3 views
-1

NodeMCU를 사용하여 LUA에서 프로그래밍하는 ESP8266 wifi 모듈로 작업하고 있습니다. 나는 아이폰 앱에서 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` 

얻을 "CONN :에"인수 "SRV : 듣고"몇 시간 후에게

도움을 주셔서 감사합니다. 서식이 엉망인 경우 죄송합니다. 처음으로

답변

1

댓글이 너무 길어서 죄송합니다.

PANIC : 루아 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 빌드

20,150,704는 옛날 0.9.x 바이너리를 사용하지 마십시오, 그들은 구식이고 버그가 많이 포함되어 있습니다. http://nodemcu.readthedocs.io/en/latest/en/#getting-started은 새로운 펌웨어를 시작하는 데 도움이됩니다.