Как предположил М.Р. выше , вам, вероятно, будет лучше, если вы упакуете больше данных, прежде чем отправлять их, вместо того, чтобы отправлять двухбайтовый пакет за раз.
Но ужасная производительность, которую вы видите, больше связана с тем, как вы читаете данные на вашем компьютере. Если вы прочитаете только два байта из вашего последовательного порта и подключите их к графику, это приведет к огромным накладным расходам.
Если вместо этого вы обрабатываете столько байтов, сколько у вас имеется в буфере 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, и по совпадению я нашел этот вопрос , который очень похож на ваш. Так что заслуга в этом заключается в откровенном решении.
К сожалению, батарея моего портативного прицела разрядилась, поэтому я не смог должным образом проверить приведенный выше код. Но я думаю, что оттуда должно получиться хорошее решение.
Я не проверял подробно код Teensy, но, на первый взгляд, я думаю, что таймер прерывания, которое вы используете для задания темпа для АЦП, может быть слишком сжатым. Вы забыли рассмотреть начальные и конечные биты, которые перемещаются с каждым байтом данных, и вы не учитываете время, необходимое для выполнения преобразования AD (я думаю, оно должно быть очень маленьким, возможно, 10 микросекунд). Учитывая все вышесказанное, я думаю, вам может понадобиться увеличить сердцебиение, чтобы быть уверенным, что вы не вводите нерегулярные времена выборки. Должно быть возможно получить намного более высокую частоту дискретизации с помощью Teensy, но для этого вам нужно использовать совершенно другой подход. Хорошая тема для другого вопроса, я думаю ...