霸气侧漏 发表于 2017-11-14 14:14:23

再请教C#精度定时问题

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


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

落叶知秋 发表于 2017-11-14 14:34:38

一定要说为什么的话,那就是因为系统不是实时操作系统,是分时的

霸气侧漏 发表于 2017-11-14 14:44:07

落叶知秋 发表于 2017-11-14 14:34
一定要说为什么的话,那就是因为系统不是实时操作系统,是分时的

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

-佛听- 发表于 2017-11-14 15:50:15

霸气侧漏 发表于 2017-11-14 14:44
我是想说怎么解决这个问题,哈哈

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

tongdayusu 发表于 2017-11-14 16:09:34

霸气侧漏 发表于 2017-11-14 14:44
我是想说怎么解决这个问题,哈哈

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

霸气侧漏 发表于 2017-11-14 16:13:48

-佛听- 发表于 2017-11-14 15:50
基本无解 只能差不多 因为你不可能得到最高权限

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

霸气侧漏 发表于 2017-11-14 16:14:11

tongdayusu 发表于 2017-11-14 16:09
程序一行都不动的解决方案:
换个I7 7700的电脑。

还是你得解决办法好,

semonpic 发表于 2017-11-14 16:16:35

为什么定时不准确,数据就会尴尬。我觉得你软件设计的思路可能不对

yerrmin 发表于 2017-11-14 16:24:50

准确的定时不能靠上位机来维护,要靠下位机维护
比如你需要200ms采一个点,可以下位机定时上报(有必要吗?下位机能保证200ms采一个点,然后随便报不行吗?)
或者上位机每隔一个稍短的时间(例如100ms)获取下位机数据,下位机如果有新数就上报,没有新数就不报

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

霸气侧漏 发表于 2017-11-14 16:37:53

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

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

norman33 发表于 2017-11-14 16:45:58

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

wt3333 发表于 2017-11-14 16:55:43

霸气侧漏 发表于 2017-11-14 16:13
但是我看到sscom5.13.1.exe这个定时精度就很高

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

flamma 发表于 2017-11-14 16:56:11

用VC封装一个多媒体定时器,然后用C#调用就可以了。网上有很多例子。

霸气侧漏 发表于 2017-11-14 16:56:12

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

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

霸气侧漏 发表于 2017-11-14 17:00:36

wt3333 发表于 2017-11-14 16:55
大虾用的c++,精度会比.net高不少

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

wt3333 发表于 2017-11-14 17:05:51

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

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

ywlzh 发表于 2017-11-14 17:09:38

http://www.voidcn.com/article/p-fyjnwnvj-rw.html

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

rainbow 发表于 2017-11-14 18:19:33

在任务管理器中把这个程序的等级改“实时”看看。

rainbow 发表于 2017-11-14 18:27:18

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。

霸气侧漏 发表于 2017-11-14 18:28:55

rainbow 发表于 2017-11-14 18:19
在任务管理器中把这个程序的等级改“实时”看看。

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

霸气侧漏 发表于 2017-11-14 18:29:40

rainbow 发表于 2017-11-14 18:27
Changing period to 400ms.

6:22:26.956 Checking status1.


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

huangqi412 发表于 2017-11-14 19:27:09

闲的蛋疼如果是通用软件别人不会给你理想环境如果是专用 有这蛋疼时间早就加个单片机fifo过来了

marshallemon 发表于 2017-11-14 19:29:15

可以在win下跑一个试试内核,当然这个内核那可不便宜

takashiki 发表于 2017-11-14 19:56:21

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

霸气侧漏 发表于 2017-11-14 21:11:46

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

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

momo_li 发表于 2017-11-14 21:41:02

为什么很多人问这个问题,而且有人回答多媒体定时器的时候楼主都没回应,多媒体定时器不是挺好的吗,完全能满足需求啊

1a2b3c 发表于 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倍以内的值看看{:lol:}

天使之翼 发表于 2017-11-15 13:05:12

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

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

霸气侧漏 发表于 2017-11-29 08:38:21

1a2b3c 发表于 2017-11-15 10:06
我来给楼主计算一下吧:

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

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

makesoft 发表于 2017-11-29 08:41:55

霸气侧漏 发表于 2017-11-29 08:38
现在搞定了,用的多媒体定时器

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

霸气侧漏 发表于 2017-11-29 11:06:55

makesoft 发表于 2017-11-29 08:41
使用多媒体定时器能到多少误差呢

ms级别是可以的
页: [1]
查看完整版本: 再请教C#精度定时问题