您好我正在尝试从串口读取一些数据并将其记录在硬盘中。我正在使用visual C ++ express,并使用windows窗体创建了一个应用程序。
程序基本上每t秒发送一个字节(“s”),这会触发连接到串口的设备发回3个字节。波特率现在是38400bps。时间t由visual c ++的计时器类控制。
我遇到的问题是,如果我将定时器的滴答时间设置为1ms,则数据不会每1ms记录一次,而是大约每15ms记录一次。我已经读过,也许定时器的分辨率设置为15ms,但不确定。无论如何,我怎样才能使定时器事件每1ms触发一次,而不是每15ms触发一次?还是有另一种方法可以更快地读取串口数据?我正在寻找500Hz或更高。
连接到串口的设备是32位微控制器,我也可以控制程序,所以我可以很容易地改变它,但是无法想出另一种方法来进行这种传输。
感谢您的帮助!
答案 0 :(得分:3)
Windows不是实时操作系统,无论您的计时器设置为什么时间段,都不能保证它会得到一致的维护。此外,OS时钟分辨率取决于硬件供应商的HAL实现,因系统而异。多媒体定时器具有更高的分辨率,但实时保证仍然不存在。
除此之外,你需要对你想要达到的时间做一点算术。在38400,N,8,1,你只能在1ms内传输最多3.84个字符,所以你的时间安排在任何情况下都很紧,因为你正在使用一个字符并且期望返回三个字符。如果不提高比特率,你肯定不会更快。
更好的解决方案是让PC主机向嵌入式目标发送所需的报告周期,然后使嵌入式目标执行自己的计时,以便每个周期自动发送数据,直到PC请求停止或发送不同的时期。您的嵌入式系统更能够维持硬实时约束。
或者,您可以简单地让您的设备执行其样本并传输三个字符,其时间完全取决于三个字符的传输时间,并不断地传输数据。这将为您提供781.25us(1280Hz)的采样周期,而无需PC的任何触发,它将是真正的周期性和无抖动。如果您想要更快的采样率,只需增加比特率。
答案 1 :(得分:1)
Windows窗体计时器分辨率约为15-20毫秒。您可以尝试使用多媒体计时器,请参阅timeSetEvent函数。
http://msdn.microsoft.com/en-us/library/windows/desktop/dd757634%28v=vs.85%29.aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/dd743609%28v=vs.85%29.aspx
定时器精度由uResolution参数设置(0 - 最大可能精度)。在任何情况下,您都无法每隔ms获得一次计时器回调 - Windows不是实时系统。