1、关于GPIO
从实战中开始吧,就让我们利用GPIO2
点亮8266
的一个板载小灯吧。
gpio.mode(4, gpio.OUTPUT)
gpio.write(4, 0)
原理图上是GPIO2
,为什么对应程序要写4
呢?
LUA
固件里面是这样封装的!
IO - Index
与EPS8266 pin
对应关系一览表
2、关于串口
ESP8266
有两个串口,UART0
和UART1
。
由ESP8266 - 12E 规格书<这里, yc6y
>可以知道,
UART0-TXD
在GPIO1
UART1-RXD
在GPIO3
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-Index
为2
。
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
的命令,却发现可行!
问题出在哪了呢?看这
搞清楚这个问题之前,让我先来了解下print
和uart.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)