再请教C#精度定时问题
前段时间在做串口通信的时候,发现定时不准确,想用精度高的定时器,因为我要定时去获取下位机的数据,如果定时器不准确,那么数据就尴尬,后来发现通过System.Threading.Timer,定时就比较好,使用的官方测试程序,分别测试200,300,400ms定时器,然后打印到屏幕上,最右排是时间差值从上图可以看出,定时200ms,出现203ms间隔,定时300ms出现312ms间隔,定时400ms出现405--414ms间隔,谁知道是为什么不?尴尬,程序见附件
一定要说为什么的话,那就是因为系统不是实时操作系统,是分时的 落叶知秋 发表于 2017-11-14 14:34
一定要说为什么的话,那就是因为系统不是实时操作系统,是分时的
我是想说怎么解决这个问题,哈哈 霸气侧漏 发表于 2017-11-14 14:44
我是想说怎么解决这个问题,哈哈
基本无解 只能差不多 因为你不可能得到最高权限 霸气侧漏 发表于 2017-11-14 14:44
我是想说怎么解决这个问题,哈哈
程序一行都不动的解决方案:
换个I7 7700的电脑。{:titter:} -佛听- 发表于 2017-11-14 15:50
基本无解 只能差不多 因为你不可能得到最高权限
但是我看到sscom5.13.1.exe这个定时精度就很高 tongdayusu 发表于 2017-11-14 16:09
程序一行都不动的解决方案:
换个I7 7700的电脑。
还是你得解决办法好, 为什么定时不准确,数据就会尴尬。我觉得你软件设计的思路可能不对 准确的定时不能靠上位机来维护,要靠下位机维护
比如你需要200ms采一个点,可以下位机定时上报(有必要吗?下位机能保证200ms采一个点,然后随便报不行吗?)
或者上位机每隔一个稍短的时间(例如100ms)获取下位机数据,下位机如果有新数就上报,没有新数就不报
上位机也不需要实时显示和存储,不知道楼主要精确来干嘛,
yerrmin 发表于 2017-11-14 16:24
准确的定时不能靠上位机来维护,要靠下位机维护
比如你需要200ms采一个点,可以下位机定时上报(有必要吗? ...
是这样的,要做一个数据分析的软件,来测试我们的仪器,定时去获取天平重量信息,但是呢,天平是没有主动上报功能,只能用软件去获取,哎,就是这样 去买一块51开发板 让51定时了去读你的数据然后上位机定时分批问51拿数据不就全解决了,为什么非要让windows去做毫秒级的定时,自找麻烦不。或者楼主也可以励精图治,开始学习windows最难学的底层驱动开发,从ring3进入到ring0,然后再ring0里面访问主板或者cpu的高精度定时器然后做完事情返回到ring3部分,当然我估计从入门到实现很难。 霸气侧漏 发表于 2017-11-14 16:13
但是我看到sscom5.13.1.exe这个定时精度就很高
大虾用的c++,精度会比.net高不少 用VC封装一个多媒体定时器,然后用C#调用就可以了。网上有很多例子。 norman33 发表于 2017-11-14 16:45
去买一块51开发板 让51定时了去读你的数据然后上位机定时分批问51拿数据不就全解决了,为什么非要让windows ...
好吧,看来得换一个方案来实现这个功能 wt3333 发表于 2017-11-14 16:55
大虾用的c++,精度会比.net高不少
刚刚测试了,和我的精度一样高,原来之前我弄错了,请看下图 ,定时发送300ms,一收一接
霸气侧漏 发表于 2017-11-14 17:00
刚刚测试了,和我的精度一样高,原来之前我弄错了,请看下图 ,定时发送300ms,一收一接
...
那你的实现已经接近windows的定时精度极限了.
过去我测试一般误差十几个ms
http://www.voidcn.com/article/p-fyjnwnvj-rw.html
这个是C++的 调Windows多媒体定时器,简单易懂。C#如果可以调的话 那应该也不难 在任务管理器中把这个程序的等级改“实时”看看。 Changing period to 400ms.
6:22:26.956 Checking status1.
6:22:27.366 Checking status2. 这个是410
6:22:27.766 Checking status3. 这个是400
6:22:28.176 Checking status4. 这个是410
6:22:28.576 Checking status5. 这个是400
6:22:28.986 Checking status6. 这个是410
6:22:29.386 Checking status7. 这个是400
6:22:29.796 Checking status8. 这个是410
这个是调整到实时后测的,还是有规律的,一个410下一个就是410。 rainbow 发表于 2017-11-14 18:19
在任务管理器中把这个程序的等级改“实时”看看。
修改了,貌似效果不明显, rainbow 发表于 2017-11-14 18:27
Changing period to 400ms.
6:22:26.956 Checking status1.
你这个数据是不是在你电脑上跑的? 闲的蛋疼如果是通用软件别人不会给你理想环境如果是专用 有这蛋疼时间早就加个单片机fifo过来了 可以在win下跑一个试试内核,当然这个内核那可不便宜 方案多得很,问题是你就是不用
1、LS一群哥们说的换电脑,加转发、写驱动都可以
2、弄个USB,监测SOF包。这个是标准的1ms,误差万分之几,相当高了吧。
3、换操作系统,比如换WinCE,1ms还是勉强能达到的
4、嫌WinCE麻烦就换Win95、Win98,直接修改底层定时器。最不济换XP takashiki 发表于 2017-11-14 19:56
方案多得很,问题是你就是不用
1、LS一群哥们说的换电脑,加转发、写驱动都可以
2、弄个USB,监测SOF包。这 ...
我只是做一个测试软件,那样搞也太。。。。。 为什么很多人问这个问题,而且有人回答多媒体定时器的时候楼主都没回应,多媒体定时器不是挺好的吗,完全能满足需求啊 我来给楼主计算一下吧:
你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倍以内的值看看{:lol:}
霸气侧漏 发表于 2017-11-14 16:37
是这样的,要做一个数据分析的软件,来测试我们的仪器,定时去获取天平重量信息,但是呢,天平是没有主动 ...
你需要的是相对时间差,windows你想要很准确的定时基本不可能。但你可以得到相对准确的时间差。 1a2b3c 发表于 2017-11-15 10:06
我来给楼主计算一下吧:
你200ms误差3ms左右,那么实际上就是 200/15.625=12.8--->13次,再换算过来:15.6 ...
现在搞定了,用的多媒体定时器 霸气侧漏 发表于 2017-11-29 08:38
现在搞定了,用的多媒体定时器
使用多媒体定时器能到多少误差呢 makesoft 发表于 2017-11-29 08:41
使用多媒体定时器能到多少误差呢
ms级别是可以的
页:
[1]