硬汉嵌入式论坛

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

[emWin] emwin显示实时检测温度问题

[复制链接]

1

主题

5

回帖

1

积分

新手上路

积分
1
发表于 2017-8-3 13:17:11 | 显示全部楼层 |阅读模式
最近在做emwin界面卡在了实时检测并显示温度这个坎了,我用stm32开发板里的ds18b20传感器检测温度,然后在emwin对话框中创建了定时器,在回调函数也有定时器消息,但显示的温度很不正常,有很多不知道哪里来的数据。求大神指点一二。谢谢!
回复

使用道具 举报

1

主题

5

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2017-8-3 13:29:05 | 显示全部楼层
case WM_TIMER:
        
            sprintf(buf,"%03d",temperature);   
            TEXT_SetText(WM_GetDialogItem(hItem,ID_TEXT_3),(const char*)buf);
            WM_RestartTimer(pMsg->Data.v,1000);
            break;

程序如上。自己找了好久找不出所以然来。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117635
QQ
发表于 2017-8-3 13:31:18 | 显示全部楼层
先保证你的18B20程序在裸机,不使用RTOS,也不使用emWin的时候没问题。

然后就是18B20最好1-2秒更新一次即可,不太频繁,因为这个器件时序要求比较严格,中断不能有打断,所以读取前后做个开关中断或者调度锁功能。
回复

使用道具 举报

1

主题

5

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2017-8-3 13:35:53 | 显示全部楼层

回 eric2013 的帖子

eric2013:先保证你的18B20程序在裸机,不使用RTOS,也不使用emWin的时候没问题。

然后就是18B20最好1-2秒更新一次即可,不太频繁,因为这个器件时序要求比较严格,中断不能有打断,所以读取前后做个开关中断或者调度锁功能。 (2017-08-03 13:31) 
你好,18b20在裸机是能正常使用的,并且我写在emwin上偶尔也是可以显示出来,只是中间会多出一个比较大的数据,我也不知道是哪里来的,是不是我程序问题?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117635
QQ
发表于 2017-8-3 13:40:31 | 显示全部楼层

回 煜煜啊 的帖子

煜煜啊:你好,18b20在裸机是能正常使用的,并且我写在emwin上偶尔也是可以显示出来,只是中间会多出一个比较大的数据,我也不知道是哪里来的,是不是我程序问题?
 (2017-08-03 13:35) 
因为这个器件时序要求比较严格,读取器件不可被其它任务打断,所以读取前后做个开关中断或者调度锁功能。
回复

使用道具 举报

1

主题

5

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2017-8-3 13:45:44 | 显示全部楼层

回 eric2013 的帖子

eric2013:因为这个器件时序要求比较严格,读取器件不可被其它任务打断,所以读取前后做个开关中断或者调度锁功能。 (2017-08-03 13:40) 
您能详细讲一下开关中断或者调度锁功能的原理么?因为这个我也没怎么接触过这些。
回复

使用道具 举报

8

主题

59

回帖

83

积分

初级会员

积分
83
发表于 2017-8-3 14:20:56 | 显示全部楼层
建议用消息处理,计算出温度后给窗口发消息,不要开那么多定时器,窗口回调函数内处理这个消息并显示就可以了
回复

使用道具 举报

11

主题

68

回帖

198

积分

初级会员

积分
198
发表于 2017-8-4 10:23:09 | 显示全部楼层
你的buf要清零 啊,memset(buf,0,sizeof(buf))
回复

使用道具 举报

11

主题

68

回帖

198

积分

初级会员

积分
198
发表于 2017-8-4 10:26:54 | 显示全部楼层
我就是用的温度读取,不过我显示间隔比较大,大概是3秒多更新一次,我的ds18b20没有加中断使能和失能
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117635
QQ
发表于 2017-8-4 11:06:45 | 显示全部楼层

回 煜煜啊 的帖子

煜煜啊:您能详细讲一下开关中断或者调度锁功能的原理么?因为这个我也没怎么接触过这些。 (2017-08-03 13:45) 
可以学习下我们FreeRTOS中这两个知识点的说明,其它RTOS一样,https://forum.anfulai.cn/forum.php?mod=viewthread&tid=17658
回复

使用道具 举报

1

主题

5

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2017-8-6 15:59:29 | 显示全部楼层

回 邵少少 的帖子

邵少少:建议用消息处理,计算出温度后给窗口发消息,不要开那么多定时器,窗口回调函数内处理这个消息并显示就可以了 (2017-08-03 14:20) 
对,我后来用了消息方式去显示可以显示了,但还是会有其他的类似7楼说的buf数据
回复

使用道具 举报

1

主题

5

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2017-8-6 16:01:46 | 显示全部楼层

回 thinkself 的帖子

thinkself:你的buf要清零 啊,memset(buf,0,sizeof(buf)) (2017-08-04 10:23) 
清零是在传送数据之前还是之后?我感觉中间数据是从温度值返回函数上来的
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117635
QQ
发表于 2017-8-7 01:37:31 | 显示全部楼层

回 煜煜啊 的帖子

煜煜啊:清零是在传送数据之前还是之后?我感觉中间数据是从温度值返回函数上来的
 (2017-08-06 16:01) 
用sprintf不用清零。
回复

使用道具 举报

8

主题

42

回帖

71

积分

初级会员

积分
71
发表于 2017-8-7 08:14:43 | 显示全部楼层
光加锁还不行,还得校验,18B20有校验功能,如果校验失败则不显示值即可
回复

使用道具 举报

11

主题

68

回帖

198

积分

初级会员

积分
198
发表于 2017-8-7 09:23:09 | 显示全部楼层

回 eric2013 的帖子

eric2013:用sprintf不用清零。 (2017-08-07 01:37) 
不懂啊 ,是buf每次填充字节不变吗?完全覆盖吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117635
QQ
发表于 2017-8-7 09:32:02 | 显示全部楼层

回 thinkself 的帖子

thinkself:不懂啊 ,是buf每次填充字节不变吗?完全覆盖吗? (2017-08-07 09:23) 
会重新覆盖的,从buf[0]开始。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-19 17:34 , Processed in 0.048475 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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