2016-07-17 2 views
0

루아 스크립트를 사용하여 ESP8266 NodeMCU를 프로그래밍합니다. 문자열을 처음부터 잘랐다가 더 이상 확장한다는 문제를 디버깅하는 중이었습니다. 나는 ESP8266에서 안드로이드 전화로 보낸다.ESP8266 문자열 최대 크기 247 바이트?

문제점을 다음과 같이 UART 인터페이스를 통해 esp를 테스트 할 때 더 많이 보았습니다. 문자열 컨테이너를 선언 할 때 최대 문자열 크기는 247 자입니다. 나는 247번째을 초과하면이 오류가 :

stdin:1: unexpected symbol near '='

문자열 분명히 너무 긴하지만 최대 효율을 위해 문자열 당 적어도 2048 바이트를 보내야합니다. 문자열 변수의 입력 제한을 확장 할 수 있습니까?

(HTTP Get 응답의 경우 2048 바이트 패킷 및 86 바이트 오버 헤드 구성) ESP8266의 TCP 송신 버퍼는 2920 바이트입니다.

str_resp0 = "HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=UTF-8\r\n"; 
str_resp1 = "Connection: close\r\n\r\n"; 

send_buf = ""; 

uart.on("data", "$", 
    function(data) 
    t = {send_buf,data} 
    send_buf = table.concat(t); 

    if data=="quit$" then 
     uart.on("data") -- quit the function 
    end 
end, 0) 

srv=net.createServer(net.TCP) 
srv:listen(80,function(conn) 
    conn:on("receive",function(conn,payload) 
    --print(payload) 
    conn:send(str_resp0) 
    conn:send(str_resp1) 
    conn:send(send_buf) 
    send_buf = ""; 
    end) 
    conn:on("sent",function(conn) conn:close() 
    end) 
end) 
+0

당신이 말하는 루아 문자열은 무엇입니까? – greenapps

+0

'처음에 끊어지고 더 확장됩니다.' 이해가 안되네. 예를 들어주십시오. – greenapps

+0

전송 ---> 버퍼 = "버닝 버킷 위로 점프하다"---> 버퍼 = "버닝 버킷 위로 점프하다". 그래서 문자열의 시작 부분이 사라집니다. – ionman

답변

1

stdin:1: unexpected symbol near '='

매우 당신의 "IDE"문제 같은 소리 (ESPlorer?).

또한 긴 페이로드를 일괄 적으로 보내야합니다. SDK는 패킷 크기를 standard Ethernet MTU 인 1500 바이트로 제한합니다.

http://nodemcu.readthedocs.io/en/latest/en/modules/net/#netsocketsend에는 몇 가지 설명과 좋은 예가 있습니다. ESPlorer에서 실험을 일부

srv = net.createServer(net.TCP) 
srv:listen(80, function(conn) 
    conn:on("receive", function(sck, req) 
    local response = {} 

    -- if you're sending back HTML over HTTP you'll want something like this instead 
    -- local response = {"HTTP/1.0 200 OK\r\nServer: NodeMCU on ESP8266\r\nContent-Type: text/html\r\n\r\n"} 

    response[#response + 1] = "lots of data" 
    response[#response + 1] = "even more data" 
    response[#response + 1] = "e.g. content read from a file" 

    -- sends and removes the first element from the 'response' table 
    local function send(sk) 
     if #response > 0 
     then sk:send(table.remove(response, 1)) 
     else 
     sk:close() 
     response = nil 
     end 
    end 

    -- triggers the send() function again once the first chunk of data was sent 
    sck:on("sent", send) 

    send(sck) 
    end) 
end) 

업데이트 2016년 7월 18일

결과. 여기에보고 된 하나와 유사한 오류로 실패합니다 (문자 별 문자 UART 이상을 보내는) 'ESP 보내기'를 친

buffer = "A very long string with more than 250 chars..." 
  • : 테스트는 하나의 초기화 변수를 사용합니다.
  • 파일로 저장하는 것이 좋습니다.
    • '저장'을 누르면 파일 시스템의 파일에 저장됩니다. paul.lua
    • 'ESP에 저장'을 누르면 paul.lua가 기기로 전송됩니다.
    • 'ESP에 저장'의 일부로 자동으로 수행되지 않으면 기기에 dofile("paul.lua")을 보낼 수 있습니다. 그러면 변수 buffer이 전역 공간에서 사용 가능하게됩니다.
    • 보내기 은 전체 문자열을 터미널 창에 인쇄합니다. 어쩔 보인다
+0

나는 lua loader를 사용한다. putty pukes this : stdin : 2 : 미완성 문자열 근처 '' '' , 그래서 문제가 여전히 있습니다. 제한이 보입니다 또는 그냥 일을 잘못 (일반적으로) – ionman

+0

예제 기능을 작동합니다, 감사합니다 – ionman

+1

글쎄, 내가 말했듯이, UART를 통해 긴 문자열을 장치로 전송할 때 문제가된다. 변수에 할당 된 문자열이 ~ 250자를 넘으면 ESPlorer로이를 재현 할 수있다. 문자열을 별도의'.lua' 파일에 저장하고, _save_ (char-by-char을 전송하는 대신) 장치에 파일을로드 한 다음 파일을로드하십시오 –

0

문제는. 에스 프레시 포럼을 참고하면 :

"지연이 하위 수준 코드에 의해 추가 된 20ms 그것이 문서화되어 있습니다!"

이벤트 프레임은 이보다 더 빨리 처리 할 수 ​​없습니다. 이것을 조정할 수있는 유일한 방법은 마이크로 컨트롤러에서 데이터를 버퍼링하고 20ms마다 한 번에 전송하거나 전송 속도가 uart 속도로 제한되는 소위 "FreeRTOS SDK for ESP8266"을 설치하는 것입니다.