使用 uart.alt(1) 时 UART 数据错误

UART data error when using uart.alt(1)

我正在尝试从连接到 ESP8266 的设备获取 rs232 数据(然后数据将通过 http/wifi 发送给我们)。

我正在使用 max3232 IC 为 ESP8266 提供必要的 3.3v TTL。

我已经将max3232(pin 12)连接到ESP8266上的GPIO pin 13(rx)(我只接收数据不发送数据,所以只连接了rx pin)。

我使用的代码:

--
--file: test2.lua 
--
tst2 = require "tst2"
tst2.start()


--tst2.lua (testing script)
local module = {}

function module.start()
    print("in tst2.start")
    uart.alt(1)         --use alt GPIO pin 13 (Rx)
    uart.setup(0, 9600,8, uart.PARITY_NONE, uart.STOPBITS_1,0)
    uart.on("data",10, 
        function(data) 
            file.open("data.tmp", "w+")
            file.writeline("starting")
            for i=1,10 do
                 file.writeline(string.byte(string.sub(data,i,i)) )
            end
            file.writeline("from uart: ", data)
            file.writeline("finished")
            file.close()
    end, 0)
    uart.alt(0)         --switch back to standard Rx/Tx pins
end
return module

连接ESP8266的rs232设备每3秒输出一个字符,但是写入文件(data.tmp)的数据如下

starting
10
13
10
13
10
13
10
13
10
13
from uart: 
finished
file.close()

问题:

1- rs232 设备未发出任何 newln 或 cr 字符,但这些字符出现在数据文件中。

2- 字符串 "file.close()" 正在写入数据文件,看起来它是最终 file.writeline 命令之后的实际 lua 命令。

3- 字母数据未出现在数据文件中。

4- 通过 uart.alt(0) 切换回标准 uart 引脚不起作用(ESP8266 必须重启 - 这不是主要问题,因为标准 uart 引脚仅在调试期间使用) .

我正在将 rs232 数据写入文件而不是简单地将其打印在屏幕上(我使用的是 ESPlorer v0.2.0),因为 uart.alt(1) 命令将串行端口重定向到替代端口ESP8266 的 GPIO 引脚。

我认为我在设置 uart 时犯了一些根本性的错误,但我不知道是什么。

已解决:

看来您无法将 ESP8266 连接到串行端口进行调试(例如 pc 上的串行端口 运行 ESPlorer),并且还具有备用串行引脚(ESP8266 GPIO 13 和 15) ) 同时连接(到外部串行设备)。

nodemcu uart.alt() 函数没有出现在 "turn off" 标准串行 i/o 引脚上。

将 pc 与标准串行 i/o 引脚断开连接解决了问题(调试成为一个问题,但有解决方法可以解决这个问题)。

(已更新)一种解决方法是使用 simple telnet server 与 lua 解释器交互。您可以将 ESP8266 连接到您的 wifi 路由器,或者更好的是,将其设置为接入点 (AP),这样您所要做的就是将您的计算机连接到它,然后简单地远程登录(到网关的 IP) .因此,除了 telnet 代码之外,您还需要在 init.lua 中设置 AP。 telnet 服务器和 AP 设置的完整代码如下。一个很好的好处是我可以使用现成的 telnet 应用程序从我的 phone 对 ESP8266 进行编程和监控!

jj =  [[
 sock = 22 -- just a placeholder, so it stays global. may not be needed.
 -- use sock:send("hello") to insert your own custom output to the client.
 telnet_srv = net.createServer(net.TCP, 180)
 telnet_srv:listen(2323, function(socket)
     local fifo = {}
     local fifo_drained = true

     local function sender(c)
         if #fifo > 0 then
             c:send(table.remove(fifo, 1))
         else
             fifo_drained = true
         end
     end

     local function s_output(str)
         table.insert(fifo, str)
         if socket ~= nil and fifo_drained then
             fifo_drained = false
             sender(socket)
         end
     end
     sock = socket -- make the socket globally available.

     node.output(s_output, 0)   -- re-direct output to function s_ouput.

     socket:on("receive", function(c, l)
         node.input(l)           -- works like pcall(loadstring(l)) but support multiple separate line
     end)
     socket:on("disconnection", function(c)
         node.output(nil)        -- un-regist the redirect output function, output goes to serial
     end)
     socket:on("sent", sender)

     print("Welcome to NodeMCU world.")
 end)
]]

file.open("telnet.lua", "w")
file.write(jj)
file.close()


jj = [[
 wifi.setmode(wifi.STATIONAP);
 wifi.ap.config({ssid="ESPtest",pwd=""});
 print("Server IP Address:",wifi.ap.getip())
 dofile("telnet.lua")
]]

file.open("init.lua","w")
file.write(jj)
file.close()

node.restart()

输出:

Server IP Address:  192.168.4.1 255.255.255.0   192.168.4.1
>