1

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

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

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

我正在使用的代码:

--
--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 时做错了什么,但我不知道它是什么。

4

2 回答 2

1

解决了:

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

nodemcu uart.alt() 函数似乎不会“关闭”标准串行 I/O 引脚。

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

于 2016-04-21T20:27:45.403 回答
0

(更新)一种解决方法是使用简单的 telnet 服务器与 lua 解释器进行交互。您可以将 ESP8266 连接到您的 wifi 路由器,或者更好的是,将其设置为接入点 (AP),这样您所要做的就是将您的计算机连接到它,然后简单地远程登录(到网关的 IP) . 因此,除了 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
> 
于 2016-12-31T04:01:01.903 回答