Я попытаюсь заняться этим. :) Ваш цикл ожидает, пока какой-либо вход станет доступным serial_port.in_waiting > 0
. Отсюда и поведение, которое вы видите. Чтение начнется, как только что-нибудь может быть получено. Не похоже, что PySerial
будет иметь какую-либо дополнительную доступную абстракцию, чтобы вы знали, что что-то вроде последнего готового байта будет символом фигурной скобки ASCII (я действительно только что просканировал документы). Вы всегда можете применить универсальное решение для чтения по мере того, как что-то придумано, и иметь смысл в нем внутри скрипта Python.
Сначала один вопрос. Ваш пример ввода предполагает, что вы будете иметь дело со строкой / JSON одинакового размера Должны ли мы быть действительно такими счастливчиками? Если это так, вы можете подождать, пока этот или несколько байтов станут доступными, и прочитать только нужный размер в ваш buffer
.
В противном случае вариант вашего кода:
buffer = bytes() # .read() returns bytes right?
while True:
if serial_port.in_waiting > 0:
buffer += serial_port.read(serial_port.in_waiting)
try:
complete = buffer[:buffer.index(b'}')+1] # get up to '}'
buffer = buffer[buffer.index(b'}')+1:] # leave the rest in buffer
except ValueError:
continue # Go back and keep reading
print('buffer=', complete)
ascii = buffer.decode('ascii')
print('ascii=', ascii)
ПРИМЕЧАНИЕ 1. Я предполагаю, что serial_port.in_waiting
теоретически может измениться между if и read, но я также предполагаю, что непрочитанные байты просто остаются в буфере, и мы в порядке.
ПРИМЕЧАНИЕ 2. Этот подход немного наивен и не учитывает, что вы могли также прочитать два фрагмента кода JSON.
ПРИМЕЧАНИЕ3: И это также не учитывает вложенные отображения в вашем JSON, если это так.
Надеюсь, это все еще полезно. Нижняя линия. Если вы не обрабатываете входные данные фиксированного размера или не получаете какой-либо другой способ, чтобы pySerial
кормил ваш контент по частям, как вам нужно, вы должны прочитать материал и обработать его в своем сценарии.
ОБНОВЛЕНИЕ: чтобы отразить обсуждение в комментариях.
Ваша проблема на самом деле в том, что вы просто смотрите (поток) байтов на последовательном порту. На этом уровне нет никакого полезного понимания передаваемых данных. Вам нужен более высокий уровень (приложение или промежуточный уровень), который понимает, что входит. Другими словами, для анализа протокола, который инкапсулирует передаваемые данные.
На самом деле, если мы знаем, что строка (группа байтов), представляющая JSON, - это то, что передается через (серверы как протокол, способ инкапсуляции / представления данных (структуры)), которое может работать, но повторная сборка должна случиться над сырой последовательной связью. Наше приложение (или библиотека / модуль) может считывать необработанные последовательные данные, извлекать из них смысл и предоставлять их на более высокие уровни.