硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2433|回复: 17
收起左侧

[emWin] emWin 外部按键不能读取奇怪现象

[复制链接]

12

主题

59

回帖

95

积分

初级会员

积分
95
发表于 2021-11-15 11:14:35 | 显示全部楼层 |阅读模式
本帖最后由 flying1104 于 2021-11-15 11:21 编辑

系统:RTX5
GUI:EMWIN V6.16
移植:使用硬汉的ATM程序

其中把中文换成英文,使用默认值

通过按键按下后发送信息给EMWIN
GUI_SendKeyMsg(GUI_KEY_TAB, 1); 等按键信息

现象:
1.按照程序点击后,不能通过TAB按键切换中文和英文,不知道是否聚焦成功
2.然后把聚焦更换到按键的中文,中文按键有方框,证明聚焦成功
3.按下按键后,回调函数不能读取到WM_KEY信息
4.把_CreateFrame(&_cbLanguage); 放在while(1)里面,才能读取到WM_KEY

请问什么原因造成这样的现象呢?
下面GUI和Main的代码
main.c (10.71 KB, 下载次数: 0) emWin.rar (5.39 MB, 下载次数: 3)


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115834
QQ
发表于 2021-11-15 12:57:39 | 显示全部楼层
测试下我原始程序使用的emWin版本试试看,如果也有问题,应该是程序移植有点问题了。
回复

使用道具 举报

3

主题

424

回帖

433

积分

高级会员

积分
433
发表于 2021-11-15 13:03:23 | 显示全部楼层
跨线程/中断用GUI_StoreKeyMsg()
回复

使用道具 举报

3

主题

424

回帖

433

积分

高级会员

积分
433
发表于 2021-11-15 13:05:10 | 显示全部楼层
另外,WM_KEY必须是具备输入焦点的窗口才能收到。
回复

使用道具 举报

12

主题

59

回帖

95

积分

初级会员

积分
95
 楼主| 发表于 2021-11-15 14:58:37 | 显示全部楼层
再调试了一下,在While循环里面加入获取按键,其实是能够读取到正确的键值,无论使用
  1. GUI_SendKeyMsg(GUI_KEY_DOWN, 1);
  2. GUI_StoreKeyMsg(GUI_KEY_DOWN, 1);
复制代码
MainTask函数
keyVal能够获取到实体按键发送过来的按键值
  1. void MainTask(void)
  2. {
  3.         uint16_t keyVal = 0;
  4.        
  5.         GUI_Init();
  6.        
  7.         /* 使能窗口使用内存设备 */
  8.         WM_SetCreateFlags(WM_CF_MEMDEV);
  9.        
  10.         /* 设置桌面窗口的回调函数 */
  11.         WM_SetCallback(WM_HBKWIN, &_cbBkWindow);
  12.        
  13.         /* 进入主界面 */
  14.         _CreateFrame(&_cbLanguage);
  15.        
  16.         /* 使能UTF8解码 */
  17.         GUI_UC_SetEncodeUTF8();
  18.        
  19.         while(1)
  20.         {
  21. //                _CreateFrame(&_cbLanguage);
  22.                 keyVal = GUI_GetKey();
  23.                 if(keyVal != 0) rttPrintf(0, "keyVal = %x\r\n", keyVal);
  24.                 GUI_Delay(10);
  25.         }
  26. }
复制代码
因此,问题是为什么不能调用回调函数呢

ATM的程序不用放在while也能调用回调函数
而这次移植的要放入while循环里面呢?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115834
QQ
发表于 2021-11-16 09:16:28 | 显示全部楼层
flying1104 发表于 2021-11-15 14:58
再调试了一下,在While循环里面加入获取按键,其实是能够读取到正确的键值,无论使用MainTask函数
keyVal ...

我的意思是你使用我原始的程序和emWin版本正常吗,这样还方便找问题些。

这个例子在V4567板子上都移植过,正常。
===================================
我不知道你是否修改过程序,如果修改过,有个这种问题。

控件被聚焦的情况下,键盘消息优先发给控件,然后才发给窗口回调消息中的WM_KEY
http://www.armbbs.cn/forum.php?m ... 3690&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

12

主题

59

回帖

95

积分

初级会员

积分
95
 楼主| 发表于 2021-11-16 14:55:47 | 显示全部楼层
感谢回复
我没有重新移植整个ATM的程序
我只采用了里面的MainTask函数
因为芯片使用H743,重新移植比较麻烦

上面楼的调试是在原来的基础上MainTask的While循环里面获取数据
通过读取收据发现,只有在While循环里面才能获取实体按键的信息,无论实体按键发送任何按键信息;
我尝试按了
GUI_StoreKeyMsg(GUI_KEY_UP, 1);
GUI_StoreKeyMsg(GUI_KEY_DOWN, 1);
GUI_StoreKeyMsg(GUI_KEY_LEFT, 1);       
GUI_StoreKeyMsg(GUI_KEY_RIGHT, 1);
GUI_StoreKeyMsg(GUI_KEY_ESCAPE, 1);
GUI_StoreKeyMsg(GUI_KEY_BACKTAB, 1);
GUI_StoreKeyMsg(GUI_KEY_TAB, 1);
GUI_StoreKeyMsg(GUI_KEY_ENTER, 1);
在MainTask的While循环里面都能读取正确的按键宏定义

因此感觉只能获取聚焦的控件的按键信息暂时不是这个问题

我感到疑惑的是以前的程序不用在While循环里面都能获取到按键信息
而我这个一定要在While循环才能读取到按键信息
不知道是否移植的原因,还是新版本的原因
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115834
QQ
发表于 2021-11-17 07:47:23 | 显示全部楼层
flying1104 发表于 2021-11-16 14:55
感谢回复
我没有重新移植整个ATM的程序
我只采用了里面的MainTask函数

先换成和我程序一样的版本,然后看看聚焦的问题。
回复

使用道具 举报

12

主题

59

回帖

95

积分

初级会员

积分
95
 楼主| 发表于 2021-11-22 14:27:36 | 显示全部楼层
尝试把ATM里面的stemWin V5.16移植
移植后,屏幕不能正常显示,只是底层bsp_init里面初始化后的显示

尝试回原来的程序,发现屏幕初始化后,就不再进入
00> MsgId = 1
00> WM_CREATE
00> MsgId = 38
00> WM_NOTIFY_PARENT
00> MsgId = 32
00> MsgId = 46
00> MsgId = 15
00> WM_PAINT
00> MsgId = 47
在WM_POST_PAINT后,就不再进入回调函数;
只有在WHILE里面加入语句
WM_SendMessageNoPara(WM_GetClientWindow(hDlg), WM_UPDATE);
才能进入回调函数并调用对应的代码
00> MsgId = 23
00> MsgId = 1025
00> WM_UPDATE
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115834
QQ
发表于 2021-11-22 16:27:26 | 显示全部楼层
flying1104 发表于 2021-11-22 14:27
尝试把ATM里面的stemWin V5.16移植
移植后,屏幕不能正常显示,只是底层bsp_init里面初始化后的显示

使用最新的6.16试试。
回复

使用道具 举报

12

主题

59

回帖

95

积分

初级会员

积分
95
 楼主| 发表于 2021-11-22 19:42:22 | 显示全部楼层
在STM32F407平台移植
6.16和RTX5
程序和代码基本一样,能够正确识别焦点,程序正常运作

移植5.16在RTX5上,不能通过过GUI_X_INIT()初始化函数
GUI OS文件文件使用的是GUI_X_RTE.c,可能是因为接口函数与6.16不同
没有继续研究剩下的问题

由此,得到初步结论,就是可能EMWIN对H7的在RTX5的外部键盘输入不支持,或者对应的库文件还停留M4上
查了一下NXP的有支持的M7的库文件,ST的没有对应的M7库
使用NXP的M7库,不能运作,应该是只支持NXP的M7
回复

使用道具 举报

12

主题

59

回帖

95

积分

初级会员

积分
95
 楼主| 发表于 2021-11-22 19:47:03 | 显示全部楼层
哦,忘记还有尝试了裸机跑EMWIN6.16
因此也与系统没有关联了,

应该是库文件不支持H7外部按键输入聚焦
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115834
QQ
发表于 2021-11-23 08:46:56 | 显示全部楼层
flying1104 发表于 2021-11-22 19:42
在STM32F407平台移植
6.16和RTX5
程序和代码基本一样,能够正确识别焦点,程序正常运作

貌似你的测试不太行。

测试ST没用对应的M7库?有啊。
然后H7不能运行这个外置触发? 晚上有时间我给你测试下



回复

使用道具 举报

12

主题

59

回帖

95

积分

初级会员

积分
95
 楼主| 发表于 2021-11-23 09:02:15 | 显示全部楼层
环境一样,RTX5,MainTask程序,EMWIN库 GUI_CM4F_L.lib
F407能够正常聚焦和进入下一级菜单
H743完全没有相应,GUI_GetKey()在while里面是能够获取按键传输的信息
剩下就是他进入GUI_Delay()能否识别了
所以可能跟库函数有关系
回复

使用道具 举报

12

主题

59

回帖

95

积分

初级会员

积分
95
 楼主| 发表于 2021-11-23 09:26:01 | 显示全部楼层
今天突然想起还有一个不一样的地方,就是使用了2个LCD驱动
关闭了另外一个LCD的驱动就能够正确聚焦了
回复

使用道具 举报

12

主题

59

回帖

95

积分

初级会员

积分
95
 楼主| 发表于 2021-11-23 14:42:39 | 显示全部楼层
总结一下:
出现这个问题的原因是因为使用了双屏控制,聚焦没在指定的层

解决:
需要在while(1)循环里面设置哪个是当前层
  1.     while (1)
  2.     {
  3.                 if(layerId == 0)
  4.                 {
  5.                         GUI_SelectLayer(0);
  6.                 }
  7.                 else
  8.                 {
  9.                         GUI_SelectLayer(1);
  10.                 }
  11.         GUI_Delay(10);
  12.     }
复制代码

这样就能在多层里面使用外部按键
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115834
QQ
发表于 2021-11-24 01:43:29 | 显示全部楼层
flying1104 发表于 2021-11-23 14:42
总结一下:
出现这个问题的原因是因为使用了双屏控制,聚焦没在指定的层

防不胜防,没有提到这关键信息。
回复

使用道具 举报

12

主题

59

回帖

95

积分

初级会员

积分
95
 楼主| 发表于 2021-11-24 08:56:26 | 显示全部楼层
eric2013 发表于 2021-11-24 01:43
防不胜防,没有提到这关键信息。

一开始就忽略了,移植407的时候才突然想起。。。。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-21 16:40 , Processed in 0.550191 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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