使用 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
>
我正在尝试从连接到 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
>