准确的pyserial读取周期
Posted
技术标签:
【中文标题】准确的pyserial读取周期【英文标题】:Accurate pyserial read period 【发布时间】:2017-09-08 22:03:34 【问题描述】:我目前正在尝试与正在测量某些数据的硬件进行通信。
我必须通过串口与这个硬件进行交互。我可以通过向设备发送GETDATA
字符串来获取数据。我的目标是在 1 秒内准确获取数据。我有一个线程读取和一个线程写入,因此它们不会相互阻塞。
目前使用这种方法,我每隔几秒就会增加 1 毫秒。有没有办法防止这种情况发生,或者有没有一种技术可以进一步优化?
def _writing(self):
start_time = 0
while(self.__running_write):
current_time = time.time()
if (current_time - start_time) >= self.interval:
ser.write("GETDATA\r")
start_time = current_time
def _reading(self):
while(self.__running_read):
data = ser.read(100)
if data:
_output = "0".format(str(datetime.now()))
print _output
输出:
2017-09-08 14:53:44.335000
2017-09-08 14:53:45.335000
2017-09-08 14:53:46.336000
2017-09-08 14:53:47.336000
2017-09-08 14:53:48.337000
2017-09-08 14:53:49.337000
2017-09-08 14:53:50.338000
2017-09-08 14:53:51.338000
2017-09-08 14:53:52.339000
2017-09-08 14:53:53.339000
【问题讨论】:
【参考方案1】:首先“每个人都在说时间”。没有理想的频率来源 (Frequency drift) 或 100% 精确时间 (Clock drift)。源设备或计算机端口的频率也不那么准确。频率可能会受到 I/O 硬件级别、操作系统、CPU 负载、HDD 交互延迟的影响......
您可以为每个数据包设置精确的时间戳(不要忘记NTP 或PTP 或GPS-based time source),并在数据处理阶段更正时间。许多设备都有内部时间源(有时也不那么精确!)以创建更准确的时间戳。
但是如果你真的需要高稳定的数据采集频率(如果将数据采集进程的优先级设置为最大,并将数据采集工具设置为实时操作系统环境,稳定性是不够的)你能做的就是删除或复制数据包(或其中的一部分)以纠正频率,然后错误将变得太多。例如,参见leap second 的主机。
【讨论】:
以上是关于准确的pyserial读取周期的主要内容,如果未能解决你的问题,请参考以下文章
仅当终端应用程序在后台打开时,使用 pyserial 从串行端口读取才有效