|
首先说明的是下面的讨论,是我在4寸M屏上验证的(才买的,所以要多玩玩),当然有一部分也在4寸物联屏上试过但不算充分。
LUA对于屏体状态的响应是通过一系列回调函数来实现的,一旦当某些控件被触碰了,或者屏状态改变了,就会调用on_???函数来实现某些特定操作。
最著名的有:
function on_systick() 这是1秒1次的定时回调,有好多异步操作,程序得不到通知,你可以试试用这个函数周期性地刷状态,比如内部modbus轮询变量,而你又不知道可读取到了
function on_control_notify(screen,control,value) 多数控件的响应都是这个函数负责滴。一旦有控件按压或修改了,,你在这个回调里可以写一些自己处理过程
function on_screen_change(screen) 当页面改变后,这个回调函数将被执行
在串口屏的工程设置里有这么一些设置选项,默认如下图所示:
按红框的里的内容设定,当你翻页、或者按下或松开一个按钮的时候,屏会把内部的控制指令发到物理屏唯一的那个485总线上,便于让外部的mcu系统处理。
像这样的内容:
假设说你想独占总线,不让屏发自己的指令,
或者打算把屏直接做主控单元,直接写lua程序控制设备的业务逻辑(现在MCU这么贵,省点成本不香么),
就必须关闭这个两个选项,不让这些报文发到通信总线上。
那么问题就来了。。。。。
不哔哔,先说个结果:一部分可以一部分不行。
我这里是指要实现上述LUA功能调用的话,而不是指屏本身不能用了。无论关闭什么参数选项,屏自己的操作都是没有问题的。
做这个试验之前,我先构造了一段代码如下:
--用户通过触摸修改控件后,执行此回调函数。
--点击按钮控件,修改文本控件、修改滑动条都会触发此事件。
function on_control_notify(screen,control,value)
local snd ={}
snd[0]=0xbb
snd[1]=0xbb
snd[2]=0xbb
uart_send_data(snd)
end
--当画面切换时,执行此回调函数,screen为目标画面。
function on_screen_change(screen)
local snd ={}
snd[0]=0xaa
snd[1]=0xaa
snd[2]=0xaa
uart_send_data(snd)
end
意思是说,如果屏的页面改变就往485总线上发aa aa aa,如果操作了一个控件,比如按了一个按钮,就发bb bb bb
运行一下,我抓结果给你看:
可以看到出现过2次aaaaaa,这是我这个工程上电后,有2次页面变化
但我还按了n次的按钮呢?那个bbbbbb就没有出现过!说明当“按钮事件通知”关闭后,on_control_notify根本就不回调了~
还别不信,我抓图展示一下打开选项的通信过程啊~
看到2行bbbbbb了吧,那分别是按钮按下和弹起时发的。然而后面跟随了一条内部报文,这显然不符合我们预期的结果。
说结论:
lua的on_control_notify和 on_screen_change回调函数,插在了固件程序不同级别的处理过程中。
我猜测:on_screen_change是在内部控制逻辑里被调用的,所以,关闭选项不影响lua运行
而on_control_notify是在发送报文之前的那个函数里调用的,所以一旦关闭选项,这个回调函数里的代码就执行不到了。
若我分析的正确,请贵司开发人员无论如何帮改一下,不然按键发自定义报文真不好实现,谢谢各位!
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|