Ошибка атрибута PySerial с «read_until»

Мне нужна помощь в устранении ошибки атрибута в моем коде Python.

Я работаю с последовательным устройством, подключенным через /dev/ttyUSB0 к Raspberry Pi 2B. Моя цель для этого кода - непрерывно считывать последовательные данные в реальном времени с последовательного устройства и отделять команды, обозначенные символом '@' вместо /n или /r.

Этот проект все еще находится на ранней стадии, но после некоторых быстрых исследований, которые я провел, атрибут pyserial 'read_until' отлично подойдет в качестве его основы. Это позволило бы мне читать по одному байту за раз и останавливаться на символе «@», а затем обрабатывать данные, прежде чем переходить к следующей части последовательных данных.

По какой-то причине я получаю ошибку атрибута, когда пытаюсь использовать «read_until», утверждая, что объект «Serial» не имеет этой функции. Ниже приведен тестовый код, который я использую, и ошибка, которую он выдает:

import serial

gc = serial.Serial('/dev/ttyUSB0', baudrate = 230400)
print(gc.name)

def getCommand():
    gcData = gc.read_until('@', 1).decode('ascii')
    print(gcData)

getCommand()

gc.close()

И вот вывод, который дал мне этот код:

>>>
/dev/ttyUSB0
Traceback (most recent call last):
  File "/home/pi/Python/GC/serialRead1.py", line 10, in <module>
    getCommand()
  File "/home/pi/Python/GC/serialRead1.py", line 7, in getCommand
    gcData = gc.read_until('@', 1).decode('ascii')
AttributeError: 'Serial' object has no attribute 'read_until'
>>>

Разочарование заключается в том, что «read_until» должен был быть импортирован вместе с последовательной библиотекой. Возможно, я упускаю что-то довольно простое, но было бы очень полезно, если бы я мог использовать этот атрибут. Большинство других вопросов о «read_until» ссылаются на «telnetlib», который, насколько я знаю, не совпадает с тем, что есть у PySerial.

Вот ссылка на веб-сайт, где я нашел документацию, в которой говорится, что read_until должен принадлежать PySerial: https://pyserial.readthedocs.io/en/latest/pyserial_api.html

Просто чтобы вы знали, я очень новичок в программировании в целом. Некоторые из жаргонных слов, которые используют опытные программисты, такие как вы, могут пройти мимо меня, и поэтому я могу понятия не иметь, как выполнять решения, которые у вас есть. Я прошу вашего терпения, пока я узнаю больше о программировании и Python в целом.

Большое спасибо за уделенное время!


person Sgt_Baconbits    schedule 17.03.2020    source источник
comment
какую версию Python вы используете ??   -  person Mohammad Zain Abbas    schedule 17.03.2020
comment
Я использую Python 3.4.2 на Raspberry Pi 2B.   -  person Sgt_Baconbits    schedule 17.03.2020
comment
Пожалуйста, запустите следующую команду в терминале и добавьте результат в свой пост: python3 -c 'import serial; print(serial.__version__)'   -  person tttapa    schedule 17.03.2020
comment
@tttapa Я использовал команду, которую вы предоставили дословно в терминале, и вот результат, который она мне дала: Traceback (most recent call last): File "<string>", line 1, in <module> Attribute Error: 'module' object has no attribute '__version__'   -  person Sgt_Baconbits    schedule 17.03.2020
comment
Звучит как очень старая версия. Атрибут __version__ был добавлен в 2016 году. Как вы установили PySerial? Вместо этого вы можете попробовать python3 -c 'import serial; print(serial.VERSION)'.   -  person tttapa    schedule 17.03.2020
comment
@tttapa Это сработало. Там написано, что это версия 2.6. Сначала я установил его с помощью sudo apt-get install python-serial. Мне было интересно, что вы сказали, что это действительно старая версия. Я просмотрел обновленные способы установки pip и попробовал sudo python3 -m pip install --upgrade pyserial Это больше не дает мне ошибки атрибута. Могу ли я забежать слишком далеко вперед, чтобы сказать, что это исправлено?   -  person Sgt_Baconbits    schedule 17.03.2020


Ответы (1)


Кажется, у вас установлен PySerial версии 2.6. Эта версия была выпущена в 2011, а метод read_until был добавлен в 2015.

Самый простой способ установить последнюю версию (как вы обнаружили) — использовать pip:

sudo apt install python3-pip
python3 -m pip install --user pyserial

Обратите внимание, что использование pip с sudo является плохой практикой.
Лучше всего использовать виртуальную среду или используйте флаг --user, как показано выше.

person tttapa    schedule 17.03.2020