二、ESP8266LUA开发之GPIO映射以及串口的相关知识

1、关于GPIO

从实战中开始吧,就让我们利用GPIO2点亮8266的一个板载小灯吧。

gpio.mode(4, gpio.OUTPUT)
gpio.write(4, 0)

原理图上是GPIO2,为什么对应程序要写4呢?

LUA固件里面是这样封装的!

IO - IndexEPS8266 pin对应关系一览表
这里写图片描述

2、关于串口

ESP8266有两个串口,UART0UART1

由ESP8266 - 12E 规格书<这里, yc6y>可以知道,
这里写图片描述

UART0-TXDGPIO1
UART1-RXDGPIO3
UART1只有TXD引脚,在GPIO2

print输出默认用UART0
uart.write输出则可以使用串口0也可以串口1,输出前指明即可!

实例:当8266收到数据,就让数据回显!

tmr.alarm(1, 2000, 1, function()
            uart.on("data", 0, function(Rec)
                                uart.write(0, Rec)
                               end, 0)
end)

实例:

1、H控制继电器开,L控制继电器关

继电器在GPIO4,对应IO-Index2

gpio.mode(2, gpio.OUTPUT) --设置GPIO模式

tmr.alarm(1, 2000, 0, function() --定时器只启动一次

            uart.on("data", 0, function(Rec)

                    if Rec == 'H' then 
                        gpio.write(2, 1)
                        print("High")
                    end

                    if Rec == 'L' then
                        gpio.write(2, 0)
                        print("LOW")
                    end

                    uart.write(0, Rec) --回显接收的数据

                    end, 0)

end)

上面的作为一个实例来控制继电器吸合,当然是没有问题的,接下来我们稍微改动下,把命令从H改为++H

2、++H控制继电器

gpio.mode(2, gpio.OUTPUT)

tmr.alarm(1, 2000, 0, function()

            uart.on("data", 0, function(Rec)

                    if Rec == '++H' then 
                        gpio.write(2, 1)
                        print("High")
                    end

                    if Rec == '++L' then
                        gpio.write(2, 0)
                        print("LOW")
                    end

                    uart.write(0, Rec)

                    end, 0)

end)

注意,发送命令的时候不要勾选发送新行

理论上可行,但是当我实际真的发送++H的时候却不行
你这个时候可以再试一下+++H的命令,却发现可行

问题出在哪了呢?看这

搞清楚这个问题之前,让我先来了解下printuart.write打印的区别!

  • print默认UART0,不能更换!而uart.write可以使用UART0或者UART1
  • print打印数据后会自动加回车换行!而uart.write不会!

OK,带着上面这两条(主要是第二条)来分析下串口助手打印的信息!

发送++H
串口助手显示

++H

很容易分析出,就是uart.write把我们输入的命令原封不动的回显过来的!

发送+++H
串口助手显示

+High
++H

注意,别自动忽略两条消息不在一行的信息!

最后各种分析,只有一种合理的解释!

uart.on监测数据的时候,它是不管这个数据多长的,只要来来数据,就让第一个字节触发中断,进入一次串口回调函数!

再来个实验验证下猜想。。

gpio.mode(2, gpio.OUTPUT)

tmr.alarm(1, 2000, 0, function()

            uart.on("data", 0, function(Rec)

                    if Rec == '++H' then 
                        gpio.write(2, 1)
                        print("High")
                    else
                        print(Rec)
                    end

                    uart.write(0, Rec)

                    end, 0)

end) 

这里写图片描述

emmm, 上面的结果,自己也能分析个八九不离十了吧。。。
还有一点,根据实验结果,,不管用print或者uart.write 似乎都自动会在最后加一个回车换行。。。。

再来解释一遍吧,
输入++H,后,第一个+触发中断,进入中断函数直接else输出了一个+并回车换行,然后uart.write空闲等待,把第二次录入的+H,以及第一次录入的+,全部输出了,对应的第二次Rec为+H 在else中再次输出。。

再看:

gpio.mode(2, gpio.OUTPUT)

tmr.alarm(1, 2000, 0, function()

            uart.on("data", 0, function(Rec)

                    if Rec == '++H' then 
                        gpio.write(2, 1)
                        print("High")
                    else
                        uart.write(0,Rec)
                    end

                    uart.write(0, Rec)

                    end, 0)

end)                 

这里写图片描述

我有点不知所措了。。。。???

mmp,,,有毒吧。。。。。

吐血。。。。
数据的回显有毒吧。。。。。mmp

 uart.on("data", 0, function(Rec)

第二个参数0,就表示串口接受到1个数据就进入中断函数 function(Rec)

最后再来一个终极版的!
借鉴杨大神的空闲中断写法!


gpio.mode(2, gpio.OUTPUT)

ReadData = ""
ReadDataCopy = ""
ReadCnt = 0

tmr.alarm(2, 5, 1, function()

        if ReadCnt ~= 0 then
            if ReadCnt == ReadCntCopy then//一开始并没有定义ReadCntCopy,所以直接跳到else进行赋值
                ReadCnt = 0
                ReadCntCopy = 0
                ReadDataCopy = ReadData
                ReadData = ""

                if ReadDataCopy == "++H" then
                    gpio.write(2, 1)
                end

                if ReadDataCopy == "++L" then
                    gpio.write(2, 0)
                end

            else
                ReadCntCopy = ReadCnt//只要一赋值就变成了全局变量
            end
        end

end)

tmr.alarm(1, 2000, 0, function()

            uart.on("data", 0, function(Rec)

                ReadData = ReadData..Rec//这是连接字符串
                ReadCnt = ReadCnt + 1//不能连加
            end, 0)                              
end)                 

猜你喜欢

转载自blog.csdn.net/ReCclay/article/details/78161031