搜索
bottom↓
回复: 30

再请教C#精度定时问题

[复制链接]

出0入0汤圆

发表于 2017-11-14 14:14:23 | 显示全部楼层 |阅读模式
前段时间在做串口通信的时候,发现定时不准确,想用精度高的定时器,因为我要定时去获取下位机的数据,如果定时器不准确,那么数据就尴尬,后来发现通过System.Threading.Timer,定时就比较好,使用的官方测试程序,分别测试200,300,400ms定时器,然后打印到屏幕上,最右排是时间差值


从上图可以看出,定时200ms,出现203ms间隔,定时300ms出现312ms间隔,定时400ms出现405--414ms间隔,谁知道是为什么不?尴尬,程序见附件

本帖子中包含更多资源

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

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出40入42汤圆

发表于 2017-11-14 14:34:38 | 显示全部楼层
一定要说为什么的话,那就是因为系统不是实时操作系统,是分时的

出0入0汤圆

 楼主| 发表于 2017-11-14 14:44:07 | 显示全部楼层
落叶知秋 发表于 2017-11-14 14:34
一定要说为什么的话,那就是因为系统不是实时操作系统,是分时的

我是想说怎么解决这个问题,哈哈

出0入0汤圆

发表于 2017-11-14 15:50:15 | 显示全部楼层
霸气侧漏 发表于 2017-11-14 14:44
我是想说怎么解决这个问题,哈哈

基本无解 只能差不多 因为你不可能得到最高权限

出0入8汤圆

发表于 2017-11-14 16:09:34 | 显示全部楼层
霸气侧漏 发表于 2017-11-14 14:44
我是想说怎么解决这个问题,哈哈

程序一行都不动的解决方案:
换个I7 7700的电脑。

出0入0汤圆

 楼主| 发表于 2017-11-14 16:13:48 | 显示全部楼层
-佛听- 发表于 2017-11-14 15:50
基本无解 只能差不多 因为你不可能得到最高权限

但是我看到sscom5.13.1.exe这个定时精度就很高

出0入0汤圆

 楼主| 发表于 2017-11-14 16:14:11 | 显示全部楼层
tongdayusu 发表于 2017-11-14 16:09
程序一行都不动的解决方案:
换个I7 7700的电脑。


还是你得解决办法好,

出0入0汤圆

发表于 2017-11-14 16:16:35 | 显示全部楼层
为什么定时不准确,数据就会尴尬。我觉得你软件设计的思路可能不对

出0入0汤圆

发表于 2017-11-14 16:24:50 | 显示全部楼层
准确的定时不能靠上位机来维护,要靠下位机维护
比如你需要200ms采一个点,可以下位机定时上报(有必要吗?下位机能保证200ms采一个点,然后随便报不行吗?)
或者上位机每隔一个稍短的时间(例如100ms)获取下位机数据,下位机如果有新数就上报,没有新数就不报

上位机也不需要实时显示和存储,不知道楼主要精确来干嘛,

出0入0汤圆

 楼主| 发表于 2017-11-14 16:37:53 | 显示全部楼层
yerrmin 发表于 2017-11-14 16:24
准确的定时不能靠上位机来维护,要靠下位机维护
比如你需要200ms采一个点,可以下位机定时上报(有必要吗? ...

是这样的,要做一个数据分析的软件,来测试我们的仪器,定时去获取天平重量信息,但是呢,天平是没有主动上报功能,只能用软件去获取,哎,就是这样

出0入36汤圆

发表于 2017-11-14 16:45:58 | 显示全部楼层
去买一块51开发板 让51定时了去读你的数据然后上位机定时分批问51拿数据不就全解决了,为什么非要让windows去做毫秒级的定时,自找麻烦不。或者楼主也可以励精图治,开始学习windows最难学的底层驱动开发,从ring3进入到ring0,然后再ring0里面访问主板或者cpu的高精度定时器然后做完事情返回到ring3部分,当然我估计从入门到实现很难。

出5入8汤圆

发表于 2017-11-14 16:55:43 | 显示全部楼层
霸气侧漏 发表于 2017-11-14 16:13
但是我看到sscom5.13.1.exe这个定时精度就很高

大虾用的c++,精度会比.net高不少

出0入0汤圆

发表于 2017-11-14 16:56:11 | 显示全部楼层
用VC封装一个多媒体定时器,然后用C#调用就可以了。网上有很多例子。

出0入0汤圆

 楼主| 发表于 2017-11-14 16:56:12 | 显示全部楼层
norman33 发表于 2017-11-14 16:45
去买一块51开发板 让51定时了去读你的数据然后上位机定时分批问51拿数据不就全解决了,为什么非要让windows ...

好吧,看来得换一个方案来实现这个功能

出0入0汤圆

 楼主| 发表于 2017-11-14 17:00:36 | 显示全部楼层
wt3333 发表于 2017-11-14 16:55
大虾用的c++,精度会比.net高不少

刚刚测试了,和我的精度一样高,原来之前我弄错了,请看下图 ,定时发送300ms,一收一接

本帖子中包含更多资源

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

x

出5入8汤圆

发表于 2017-11-14 17:05:51 | 显示全部楼层
霸气侧漏 发表于 2017-11-14 17:00
刚刚测试了,和我的精度一样高,原来之前我弄错了,请看下图 ,定时发送300ms,一收一接
...

那你的实现已经接近windows的定时精度极限了.   
过去我测试一般误差十几个ms

出0入0汤圆

发表于 2017-11-14 17:09:38 | 显示全部楼层
http://www.voidcn.com/article/p-fyjnwnvj-rw.html

这个是C++的 调Windows多媒体定时器,简单易懂。C#如果可以调的话 那应该也不难

出10入210汤圆

发表于 2017-11-14 18:19:33 | 显示全部楼层
在任务管理器中把这个程序的等级改“实时”看看。

出10入210汤圆

发表于 2017-11-14 18:27:18 | 显示全部楼层
Changing period to 400ms.

6:22:26.956 Checking status  1.
6:22:27.366 Checking status  2.     这个是410
6:22:27.766 Checking status  3.     这个是400
6:22:28.176 Checking status  4.     这个是410
6:22:28.576 Checking status  5.     这个是400
6:22:28.986 Checking status  6.     这个是410
6:22:29.386 Checking status  7.     这个是400
6:22:29.796 Checking status  8.     这个是410

这个是调整到实时后测的,还是有规律的,一个410下一个就是410。

出0入0汤圆

 楼主| 发表于 2017-11-14 18:28:55 | 显示全部楼层
rainbow 发表于 2017-11-14 18:19
在任务管理器中把这个程序的等级改“实时”看看。

修改了,貌似效果不明显,

出0入0汤圆

 楼主| 发表于 2017-11-14 18:29:40 | 显示全部楼层
rainbow 发表于 2017-11-14 18:27
Changing period to 400ms.

6:22:26.956 Checking status  1.

你这个数据是不是在你电脑上跑的?

出0入0汤圆

发表于 2017-11-14 19:27:09 来自手机 | 显示全部楼层
闲的蛋疼  如果是通用软件别人不会给你理想环境  如果是专用 有这蛋疼时间早就加个单片机fifo过来了

出0入85汤圆

发表于 2017-11-14 19:29:15 | 显示全部楼层
可以在win下跑一个试试内核,当然这个内核那可不便宜

出0入93汤圆

发表于 2017-11-14 19:56:21 | 显示全部楼层
方案多得很,问题是你就是不用
1、LS一群哥们说的换电脑,加转发、写驱动都可以
2、弄个USB,监测SOF包。这个是标准的1ms,误差万分之几,相当高了吧。
3、换操作系统,比如换WinCE,1ms还是勉强能达到的
4、嫌WinCE麻烦就换Win95、Win98,直接修改底层定时器。最不济换XP

出0入0汤圆

 楼主| 发表于 2017-11-14 21:11:46 | 显示全部楼层
takashiki 发表于 2017-11-14 19:56
方案多得很,问题是你就是不用
1、LS一群哥们说的换电脑,加转发、写驱动都可以
2、弄个USB,监测SOF包。这 ...

我只是做一个测试软件,那样搞也太。。。。。

出500入109汤圆

发表于 2017-11-14 21:41:02 来自手机 | 显示全部楼层
为什么很多人问这个问题,而且有人回答多媒体定时器的时候楼主都没回应,多媒体定时器不是挺好的吗,完全能满足需求啊

出0入475汤圆

发表于 2017-11-15 10:06:56 | 显示全部楼层
我来给楼主计算一下吧:

你200ms误差3ms左右,那么实际上就是 200/15.625=12.8--->13次,再换算过来:15.625*13=203.125
同样300ms时候                                 300/15.625=19.2--->20次,再换算过来:15.625*20=312.5
同样400ms时候                                 400/15.625=25.6--->26次,再换算过来:15.625*26=406.25

能看出来问题了吗? 为啥上面总是出现15.625这个数字?
还是我说的那句话,一个ticks是 15.625ms!!!!  1秒钟除以64就是系统时钟15.625ms.因此楼主不用验证了。你用大基数的来比较当然相对准确,你试试看定时个15.625的10倍以内的值看看

出255入0汤圆

发表于 2017-11-15 13:05:12 | 显示全部楼层
霸气侧漏 发表于 2017-11-14 16:37
是这样的,要做一个数据分析的软件,来测试我们的仪器,定时去获取天平重量信息,但是呢,天平是没有主动 ...

你需要的是相对时间差,windows你想要很准确的定时基本不可能。但你可以得到相对准确的时间差。

出0入0汤圆

 楼主| 发表于 2017-11-29 08:38:21 来自手机 | 显示全部楼层
1a2b3c 发表于 2017-11-15 10:06
我来给楼主计算一下吧:

你200ms误差3ms左右,那么实际上就是 200/15.625=12.8--->13次,再换算过来:15.6 ...

现在搞定了,用的多媒体定时器

出10入120汤圆

发表于 2017-11-29 08:41:55 | 显示全部楼层
霸气侧漏 发表于 2017-11-29 08:38
现在搞定了,用的多媒体定时器

使用多媒体定时器能到多少误差呢

出0入0汤圆

 楼主| 发表于 2017-11-29 11:06:55 | 显示全部楼层
makesoft 发表于 2017-11-29 08:41
使用多媒体定时器能到多少误差呢

ms级别是可以的
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 06:45

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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