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