首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用uart.alt时UART数据错误(1)

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

Stack Overflow用户
提问于 2016-04-20 16:00:54
回答 2查看 3.4K关注 0票数 1

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

我使用max3232集成电路向ESP8266提供必要的3.3v TTL。

我已经将max3232 (pin 12)连接到ESP8266上的GPIO引脚13 ( rx ) (我只接收数据而没有发送数据,所以只有rx引脚被连接)。

我使用的代码:

代码语言:javascript
复制
--
--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

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

代码语言:javascript
复制
starting
10
13
10
13
10
13
10
13
10
13
from uart: 
finished
file.close()

问题:

1- rs232设备不发出任何新字符或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设置,但我不知道它是什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-21 20:27:45

已解决:

看来,您不能将ESP8266连接到两个串口进行调试(例如,运行ESPlorer的pc上的串行端口),也不能同时连接备用串行引脚(ESP8266、GPIO 13和15) (连接到外部串行设备)。

nodemcu uart.alt()函数似乎没有“关闭”标准串行i/o引脚。

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

票数 1
EN

Stack Overflow用户

发布于 2016-12-31 04:01:01

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

代码语言:javascript
复制
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()

产出:

代码语言:javascript
复制
Server IP Address:  192.168.4.1 255.255.255.0   192.168.4.1
> 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36749282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档