准确的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 读取问题

如何为pyserial读取运行线程

仅当终端应用程序在后台打开时,使用 pyserial 从串行端口读取才有效

从 Pyserial 读取串行输出不能可靠地工作

Jetson Xavier NX 无法读取 pyserial (usb)

Pyserial readline() 永远挂起程序而不读取串行数据