您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

使用Python最大化来自Teensy 3.2的实时绘图数据的串行通信速度

使用Python最大化来自Teensy 3.2的实时绘图数据的串行通信速度

正如上面MR所建议的,如果在发送之前打包更多数据而不是一次发送两个字节的数据包,则可能会更好。

但是,您看到的可怕性能与在计算机上读取数据的方式有关。如果您仅从串行端口读取两个字节并将它们附加到绘图上,那么最终的开销将是巨大的。

如果改用RX缓冲区中可用的字节数来处理,则几乎可以获得实时性能

只需更改您的更新功能

def update():

    global curve, ptr, Xm

    if ser.inWaiting() > 0                         # Check for data not for an open port
        b1 = ser.read(ser.inWaiting())             # Read all data available at once
        if len(b1) % 2 != 0:                       # Odd length, drop 1 byte
            b1 = b1[:-1]
        data_type = dtype(uint16)
        data_int = fromstring(b1, dtype=data_type) # Convert bytes to numpy array
        data_int = data_int.byteswap()             # Swap bytes for big endian
        Xm = append(Xm, data_int)              
        ptr += len(data_int)                              
        Xm[:-len(data_int)] = Xm[len(data_int):]   # Scroll plot
        curve.setData(Xm[(len(Xm)-windowWidth):])                     
        curve.setPos(ptr,0)                   
        QtGui.QApplication.processEvents()

在略过一次迭代两个字节的想法之后,我认为可以用numpy进行处理,巧合的是,我发现了这个问题,该问题与您的非常相似。因此,值得信赖的是numpy解决方案。

不幸的是,便携式示波器的电池没电了,所以我无法正确测试上面的代码。但是我认为从那里开始一个好的解决方案应该是可行的。

我没有详细检查Teensy代码,但快速浏览一下,我认为您用于提供ADC速度的中断定时器可能太紧了。您忘了考虑随每个数据字节移动的起始位和停止位,并且您没有考虑完成AD转换所花费的时间(我想这应该很小,可能是10微秒)。考虑到所有因素,我认为您可能需要增加心跳,以确保您不会引入不规则的采样时间。Teensy应该有可能获得更快的采样率,但是要做到这一点,您需要使用完全不同的方法。我猜是另一个问题的好话题…

python 2022/1/1 18:34:19 有452人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶