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

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

使用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应该有可能获得更快的采样率,但是要做到这一点,您需要使用完全不同的方法。我猜是另一个问题的好话题…



欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/zaji/5673739.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-16
下一篇2022-12-16

发表评论

登录后才能评论

评论列表(0条)

    保存