LUAT系列全部教程可以点击下面链接查看(建议保存书签):
https://www.chenxublog.com/tag/luat系列教程
阅读本文需要具有的技能:
看过该系列前几篇文章或明白前几篇文章内容的
可以明白字符串、字节码之间的区别
了解串口的原理和使用
其实串口这个部分,我觉得挺简单的,看demo都能看懂吧。。
官方demo代码
官方代码可以在github(https://github.com/openLuat/Luat_2G_RDA_8955/)的Luat_2G_RDA_8955/script_LuaTask/demo/uart
目录或luatools的LuaTools 1.x.x\script\script_LuaTask\demo\uart
目录找到
如果你能看懂官方例程,那么可以直接去使用,不需要再看本文了
先定义一个假装能用来测试的串口收发规则
- 串口通讯使用9600波特率,3.3V ttl电平
- 模块开机第10秒后,向设备发送
0x01 0x02 0x03
三个字节 - 模块收到
qwerty
字符串后,回复asdfgh
字符串 - 模块收到
0xaa 0xbb 0xcc
三个字节后,回复0xdd 0xee 0xff
三个字节 - 模块收到
abcdefghijklmnopqrstuvwxyz
字符串后,回复ok
字符串
建立文件结构
测试需要新建两个文件,main.lua
和testuart.lua
main.lua
在前面的文章中,已经新建过大概不下四次了,所以这里不再举例。main.lua
需要require"testuart"
testuart.lua
可以看到,uart文件中已经配置好了串口
发送串口信息
发送接口特别简单,只需要调用uart.write()
函数即可,我们可以在设置唤醒状态代码前面加上发送函数:
接收串口信息
为了能接收到串口消息,我们在配置并且打开串口
函数的上方注册串口接收函数:
并在发送函数上方新建接收函数:
我们可以看到,所有串口数据都交给了proc()
函数进行处理,我们可以在接收函数上方新建一个proc()
函数:
实现功能
模块开机第10秒后,向设备发送0x01 0x02 0x03
三个字节
实现这个功能,我们只需要在文件末尾加上一个定时器即可:
模块收到qwerty
字符串后,回复asdfgh
字符串
处理这个信息,可以去proc()
函数里进行修改,将函数更改为如下形式:
剩下两个需求
剩下两个需求处理起来和前面一样,我们直接仿照着改就行:
测试
这个测试需要大家自己去测试了
测试结果会发现,第三条指令无法完成。为什么呢?因为串口会有截断现象。
处理串口数据截断问题
串口数据接收经常会出现的一个问题:数据被截断
这个现象很常见,你可以像普通单片机一样一个字节一个字节去解析,也可以加一个缓冲区定时清空处理
我们首先在proc()
函数上方,新建一个缓冲区:
然后可以把proc()
函数改造成下面这样:
函数中首先判断数据是否被使用,如果没被使用,就将数据追加到缓冲区,如果已被使用,缓冲区内容会被清除
完整代码
经过一系列修改,testuart.lua
整体代码如下:
为什么这么淘气,哈哈哈
大神,能帮忙解决个问题不?
在这段代码每段 gpio.write(LED, gpio.HIGH) 下想加一个串口发送像“7EFF06000000EF”这样命令?
忘了说了,用的是ESP8266 12-F那种NODENCU。用Uart.Write(),不是不能执行就是运行不了,或者一发命令就重启。。。
nodemcu和这个luat的用法完全不一样,请去nodemcu的论坛询问
哦。谢谢!
luat学完啦,感谢,完结撒花