您好,我正在尝试从串口读取一些数据并将其记录在硬盘中。我正在使用Visual C++ Express,并使用Windows窗体制作了一个应用程序。
该程序基本上每 t 秒发送一个字节(“s”),这会触发连接到串行端口的设备发回 3 个字节。现在波特率是38400bps。时间t由Visual C++的定时器类控制。
我遇到的问题是,如果我将计时器的滴答时间设置为 1ms,则数据不是每 1ms 记录一次,而是每 15ms 左右记录一次。我读到也许计时器的分辨率设置为 15ms,但不确定。无论如何,如何让计时器事件每 1 毫秒触发一次,而不是每 15 毫秒触发一次?或者有没有其他方法可以更快地读取串口数据?我正在寻找 500Hz 或更高的频率。
连接到串行端口的设备是一个32位微 Controller ,我也可以控制程序,因此我可以轻松地更改它,但只是无法找到另一种方式来进行此传输。
感谢您的帮助!
最佳答案
Windows 不是实时操作系统,无论您的计时器设置为什么时间段,都不能保证它会得到一致的维护。此外,操作系统时钟分辨率取决于硬件供应商的 HAL 实现,并且因系统而异。多媒体定时器的分辨率更高,但实时性仍然没有保证。
除此之外,您还需要对要达到的时间进行一些算术。在 38400,N,8,1 中,您最多只能在 1 毫秒内传输 3.84 个字符,因此无论如何您的时间都很紧张,因为您正在 ping 一个字符并期望返回 3 个字符。如果不增加比特率,您肯定无法更快。
更好的解决方案是让 PC 主机向嵌入式目标发送一次所需的报告周期,然后让嵌入式目标执行自己的计时,以便它在每个周期自动发出数据,直到 PC 请求它停止或发送一个报告。不同时期。您的嵌入式系统更有能力维持硬实时约束。
或者,您可以简单地让设备执行采样并传输三个字符,其时间完全由三个字符的传输时间决定,并不断地传输数据。这将为您提供 781.25us (1280Hz) 的采样周期,无需 PC 进行任何触发,并且它将真正具有周期性且无抖动。如果您想要更快的采样率,只需增加比特率即可。
关于windows - 500Hz以上串口数据记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8340034/