广州大彩串口屏论坛_大彩开发者交流论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 5467|回复: 8

LUA的事件响应机制,和有可能改进的一个地方,请围观

[复制链接]

5

主题

13

帖子

79

积分

注册会员

Rank: 2

积分
79
发表于 2021-8-1 16:53:01 | 显示全部楼层 |阅读模式
首先说明的是下面的讨论,是我在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
回复

使用道具 举报

0

主题

207

帖子

6873

积分

论坛元老

Rank: 8Rank: 8

积分
6873
发表于 2021-8-2 09:12:08 | 显示全部楼层
不想出现大彩协议的指令报文,开启自由串口协议即可,自行脚本收发解析代码http://doc.gz-dc.com/FAQ/Soft/01_button.html
VisualHMI 人机界面 & VisualTFT 串口屏
回复

使用道具 举报

5

主题

13

帖子

79

积分

注册会员

Rank: 2

积分
79
 楼主| 发表于 2021-8-2 10:49:46 | 显示全部楼层
仔细研读楼上给出的链接,然后另启用一个工程:

工程属性为默认值

只做2个按钮,A按钮发送事件通知,B按钮不发送事件通知,设置在二楼链接里,我这里不贴图了。
代码如下:

默认值是6969,收到a按钮发aaaa,收到b按钮发bbbb

结果如下:

b按钮按下,没有进入到lua程序中,所以看不到bbbb的报文

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

5

主题

13

帖子

79

积分

注册会员

Rank: 2

积分
79
 楼主| 发表于 2021-8-2 11:09:18 | 显示全部楼层
为了节约大家时间,我把例子打包了,有兴趣的可以跑一下

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

10

主题

45

帖子

1195

积分

金牌会员

Rank: 6Rank: 6

积分
1195
发表于 2021-8-2 16:47:26 | 显示全部楼层
你的意思是不是想要关闭事件通知而不影响LUA的运行
回复

使用道具 举报

5

主题

13

帖子

79

积分

注册会员

Rank: 2

积分
79
 楼主| 发表于 2021-8-2 18:35:24 | 显示全部楼层
xjb1783 发表于 2021-8-2 16:47
你的意思是不是想要关闭事件通知而不影响LUA的运行

是的,按按钮,LUA构造报文发送。
否则485总线上,每个lua发的报文后面都会有串口屏自己内部的报文。
回复

使用道具 举报

10

主题

45

帖子

1195

积分

金牌会员

Rank: 6Rank: 6

积分
1195
发表于 2021-8-3 08:38:40 | 显示全部楼层

不想出现大彩协议的指令报文,开启自由串口协议即可
回复

使用道具 举报

10

主题

45

帖子

1195

积分

金牌会员

Rank: 6Rank: 6

积分
1195
发表于 2021-8-3 08:59:05 | 显示全部楼层
不想用自由串口协议
也可以这样来做
自己研究把
自己看
哈哈

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

5

主题

13

帖子

79

积分

注册会员

Rank: 2

积分
79
 楼主| 发表于 2021-8-3 17:19:07 | 显示全部楼层
xjb1783 发表于 2021-8-3 08:59
不想用自由串口协议
也可以这样来做
自己研究把

谢谢~ ,为啥包含一个return 1就可以了呢?能帮解释一下吗?
我这样写也行:
                if control ==1 then
                local snd ={}
                snd[0]=0xaa
                snd[1]=0xaa
                snd[2]=0xaa
                uart_send_data(snd)       
                return 1
也能能让屏不发送内部指令,神奇~

还有你说的开启自由串口协议,是使用uart_free_protocol = 1么?
建议更新下doc.gz-dc;串行通信挺重要的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|广州大彩串口屏论坛_大彩开发者交流论坛

GMT+8, 2024-4-16 18:12 , Processed in 0.048810 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表