จะส่งและรับข้อมูลโดยใช้ Pyserial ได้อย่างไร

ฉันต้องการส่งและรับข้อมูลระหว่างพอร์ตอนุกรมสองพอร์ต ฉันใช้ชุดเครื่องมือ CANtact เป็นอุปกรณ์ซีเรียลของฉัน ฉันใช้รหัสต่อไปนี้

เขียน.py:

import serial
#init serial port and bound
# bound rate on two ports must be the same
ser = serial.Serial('/dev/ttyACM1', 9600)
print(ser.portstr)

#send data via serial port
serialcmd=("012345688902341")
ser.write(serialcmd.encode())
ser.close()

Listen.py

import serial
serBarCode = serial.Serial('/dev/ttyACM0', 9600, timeout=1)

while True:

    #read data from serial port
    serBarCode = serBarCode.readline()

    #if there is smth do smth
    if len(serBarCode) >= 1:
        print(dataBarCode.decode("utf-8"))

ฉันได้รับข้อผิดพลาดต่อไปนี้:

hp@HP-โน้ตบุ๊ก:~$ cd /home/hp/Desktop

hp@HP-โน้ตบุ๊ก:~/Desktop$ python3 write.py

/dev/ttyACM1

hp@HP-โน้ตบุ๊ก:~/Desktop$ python3 Listen.py

Traceback (การโทรล่าสุดครั้งล่าสุด):

ไฟล์ "listen.py" บรรทัด 7 นิ้ว

serBarCode = serBarCode.readline()

AttributeError: วัตถุ 'ไบต์' ไม่มีแอตทริบิวต์ 'readline'

hp@HP-โน้ตบุ๊ก:~/Desktop$


person annonymous    schedule 06.03.2019    source แหล่งที่มา


คำตอบ (2)


serBarCode = serBarCode.readline()

คุณกำลังเขียนทับวัตถุซีเรียล serBarCode ด้วยข้อมูลที่คุณกำลังอ่าน ดังนั้นการวนซ้ำจะทำงานอย่างถูกต้องในครั้งแรก แต่ในการวนซ้ำครั้งต่อไป อ็อบเจ็กต์อนุกรมของคุณจะถูกแทนที่ด้วยไบต์ที่คุณอ่านจากมันก่อนหน้านี้

ทำสิ่งนี้แทน:

data = serBarCode.readline()
if len(data) >= 1:
    print(dataBarCode.decode("utf-8"))
person entropy    schedule 06.03.2019
comment
ข้อผิดพลาดได้รับการแก้ไขแล้ว แต่ฉันยังคงไม่ได้พิมพ์ผลลัพธ์ออกมา - person annonymous; 06.03.2019
comment
คุณกำลังส่ง /dev/ttyACM2 ไปยัง write.py ของคุณ แต่จริงๆ แล้วมันถูกเขียนไปที่ /dev/ttyACM1 และ Listen.py ของคุณอ่านจาก /dev/ttyACM0 สิ่งที่คุณเขียนถึง ACM1 จะไม่สามารถใช้ได้บน ACM0 เว้นแต่จะมีกระบวนการอื่นในระบบที่อ่านจาก ACM1 และเขียนไปยัง ACM0 - person entropy; 06.03.2019
comment
อุปกรณ์ที่ฉันใช้สำหรับการสื่อสารแบบอนุกรมมีความสำคัญหรือไม่? ฉันใช้ CANtact ซึ่งโดยทั่วไปจะส่งข้อความ CAN ฉันควรสร้างซ็อกเก็ตระหว่างอุปกรณ์ทั้งสองหรือไม่ - person annonymous; 06.03.2019
comment
listen.py และ write.py ควรทำงานบนเครื่องเดียวกันหรือไม่ - person entropy; 06.03.2019
comment
@annonymous มันสำคัญถ้ามีโปรโตคอลเฉพาะที่จำเป็นในการสื่อสารระหว่างหน่วย มิฉะนั้นข้อมูลของคุณอาจตกหล่น - person John Szakmeister; 06.03.2019
comment
หากคุณสงสัยว่าอุปกรณ์ซีเรียลของคุณกำลังส่งข้อมูลผ่านพอร์ตอนุกรม แต่สคริปต์ของคุณไม่อ่าน คุณสามารถลองส่งและรับข้อมูลจากพอร์ตด้วยตนเองได้ ลอง echo "012345688902341" > /dev/ttyACM1 แล้วจึงทำ cat /dev/ttyACM0 - person entropy; 06.03.2019
comment
ฉันได้รับข้อผิดพลาดต่อไปนี้เมื่อฉันลอง echo และ cat bash: echo: write error: Input/output error and cat: /dev/ttyACM0: Input/output error - person annonymous; 06.03.2019
comment
@suicidalteddy write.py และ Listen.py ทำงานบนอุปกรณ์สองเครื่องที่แตกต่างกัน - person annonymous; 06.03.2019

คุณเขียนว่าคุณกำลังใช้อุปกรณ์ CANtact

อุปกรณ์เหล่านี้ไม่เข้าใจ "012345688902341"

อุปกรณ์พูดโปรโตคอลบางอย่าง เช่น. สำหรับการส่งข้อความ CAN คำสั่งจะเริ่มต้นด้วย t ตามด้วย CAN-ID ตามด้วย DLC ตามด้วยข้อมูล และอื่นๆ

คำสั่งอื่นๆ เริ่มต้นด้วย F, K ฯลฯ

ข้อความของคุณมักจะถูกละเลยโดยอุปกรณ์ CANtact

คุณควรใช้ไลบรารีระดับสูงกว่าเช่น pyvit สำหรับการใช้งานอุปกรณ์อย่างแน่นอน

person M. Spiller    schedule 06.03.2019
comment
พิวิตจะรับข้อความอย่างเช่น 012345688902341 ได้ไหม - person annonymous; 06.03.2019
comment
ใช่ pyvit สามารถใช้ส่งข้อมูลได้ จะจัดการการสื่อสารกับอุปกรณ์ CANtact และพูดโปรโตคอลแบบอนุกรมเพื่อให้อุปกรณ์รู้ว่าต้องทำอะไร ข้อความของคุณมีขนาดใหญ่กว่า 8 ไบต์ ดังนั้นคุณจึงมักจะต้องใช้ ISO-TP เพื่อถ่ายโอนข้อมูลของคุณ - person M. Spiller; 06.03.2019
comment
ฉันใช้ข้อมูลนี้ 012345688902341 เพื่อวัตถุประสงค์ในการทดสอบ แต่จริงๆ แล้วฉันต้องการส่งสตริงข้อมูลเช่นนี้ 7f33117cf266a525a029a59541b3e80f3f ซึ่งไม่มีอะไรนอกจากข้อความ CAN ที่แฮชแล้ว ฉันลองใช้ ISO-TP เพื่อส่งข้อความนี้ แต่ที่ฝั่งผู้รับ ฉันได้รับข้อความเป็นส่วนย่อย ข้อความที่กระจัดกระจายเหล่านี้ไม่อยู่ในลำดับที่ส่งและฉันไม่สามารถประกอบใหม่ได้ นั่นเป็นเหตุผลว่าทำไมฉันถึงย้ายไปใช้การสื่อสารแบบอนุกรม ฉันต้องการให้ข้อความที่ส่งทางฝั่งผู้ส่งได้รับเช่นเดียวกับฝั่งผู้รับ มีวิธีใดบ้างสำหรับสิ่งนั้น? - person annonymous; 06.03.2019
comment
ในกรณีนี้ คุณพูดคุยกับอุปกรณ์แบบอนุกรม ซึ่งไม่เกี่ยวข้องกับการสื่อสารแบบอนุกรมผ่าน CAN ISO-TP คือหนทางที่จะไปที่นี่ แน่นอนว่าฝั่งผู้รับก็ต้องพูดถึง ISO-TP ด้วย การรับแฟรกเมนต์ที่ไม่เรียงลำดับ (ในเครือข่าย CAN ของสองโหนด) สามารถทำได้เฉพาะเมื่อส่งแฟรกเมนต์ไม่เป็นระเบียบเท่านั้น - person M. Spiller; 06.03.2019
comment
CANtact ยอมรับเฉพาะข้อความ CAN ไม่ใช่รูปแบบอื่น เช่น สตริง ข้อมูล ไฟล์ข้อความ หรือไม่ - person annonymous; 06.03.2019
comment
CANtact คือชิ้นส่วนฮาร์ดแวร์สำหรับการส่งและรับข้อมูลบน CAN บัส ดังนั้นจึงสามารถส่งและรับข้อความ CAN เท่านั้น แต่คุณสามารถรวมสตริง ข้อมูล ไฟล์ ฯลฯ ของคุณลงในข้อความ CAN และส่งและรับสิ่งเหล่านั้นได้ - person M. Spiller; 06.03.2019
comment
ขอขอบคุณสำหรับข้อมูล. คุณช่วยแนะนำเว็บไซต์ โครงการ และ Git Repositories เพื่อใช้อ้างอิงได้ไหม เนื่องจากฉันยังใหม่กับโดเมนนี้ - person annonymous; 06.03.2019
comment
เพิ่งรู้ว่านี่ไม่ใช่คำถามเดียวของคุณที่ฉันตอบ Pyvit รองรับ ISO-TP สำหรับข้อมูลทั่วไปเกี่ยวกับ ISO-TP เพียงแค่ดูที่ Wikipedia โปรโตคอลอธิบายไว้ที่นั่น โดยทั่วไป อาจเป็นความคิดที่ดีที่จะอ่านเกี่ยวกับโมเดล OSI และทำความเข้าใจเลเยอร์ต่างๆ - person M. Spiller; 06.03.2019
comment
ให้เราสนทนาต่อในการแชท - person annonymous; 06.03.2019