ข้อผิดพลาดแอตทริบิวต์ 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