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

时间:2016-04-20 16:00:55

标签: esp8266 nodemcu

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

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

我已将max3232(引脚12)连接到ESP8266上的GPIO引脚13(rx)(我只接收数据不发送数据,因此只连接了rx引脚)。

我正在使用的代码:

   alpha beta gamma
4      2    3     2
5      2    5     9
6      2    2     6
10     4    3     4
11     4    8     3
12     4    4     9
13     5    9     8
14     5    5     5
15     5    3     5

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

--
--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

问题:

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设置时遇到了根本性的错误,但我不知道它是什么。

2 个答案:

答案 0 :(得分:0)

解决:

您似乎无法将ESP8266连接到串行端口进行调试(例如,运行ESPlorer的PC上的串行端口),并且还连接了备用串行引脚(ESP8266 GPIO 13和15)(至一个外部串行设备)。

nodemcu uart.alt()函数似乎没有"关闭"标准串行I / O引脚。

断开电池与标准串行I / O引脚的连接解决了这个问题(调试成为一个问题,但有解决方法可以解决这个问题。)

答案 1 :(得分:0)

(更新)一个解决方法是使用simple telnet server与lua解释器进行交互。您可以将ESP8266连接到您的wifi路由器,或者更好的是,将其设置为接入点(AP),这样您只需将计算机连接到它,然后只需远程登录(到网关&#39) ;啜)。因此,除了telnet代码之外,您还需要在init.lua中设置AP。 telnet服务器的完整代码和AP设置如下。一个很好的好处是我可以使用现成的telnet应用程序从我的手机编程和监控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
>