ปิดใช้งาน DTR ใน ttyUSB0


11

ฉันกำลังเชื่อมต่อจาก Pi กับบอร์ด Arduino-clone ปัญหาคือว่าฉันต้องปิดการใช้งานสาย DTR เพื่อป้องกัน Arduino จากการรีเซ็ตในการเชื่อมต่อ

ฉันได้อ่านแล้วว่าใน RPi ไม่สามารถควบคุม DTR, DCD และสายอื่น ๆ ได้ มันเป็นเรื่องจริงสำหรับ RPi ทั่วโลกหรือเฉพาะสำหรับ GPIO พินที่ใช้สำหรับการสื่อสารแบบอนุกรม?

หากเป็นไปได้ที่จะปิดการใช้งาน DTR บนพอร์ต USB คุณจะทำเช่นนั้นได้อย่างไร

คำตอบ:


6

คุณสมบัติของตัวแปลงอนุกรม USB ไม่มีส่วนเกี่ยวข้องกับฮาร์ดแวร์ของระบบโฮสต์ แต่จะใช้เฉพาะกับชิปอนุกรม USB เท่านั้นและซอฟต์แวร์สแต็กของระบบโฮสต์

ปี่ควรใช้ไดรเวอร์ลินุกซ์อนุกรม USB USB ของหุ้น

ดังนั้นคุณสามารถเปิดใช้งาน / ปิดใช้งานการเชื่อมโยงของ DTR ไปยังพอร์ตเปิด / ปิดผ่านวิธี Linux ปกติของการล้างการhupclตั้งค่าเป็นเอกสารบนไซต์ Arduino และที่อื่น ๆ :

stty -F /dev/ttyUSB0 -hupcl

หรือแทนที่ / dev / ttyUSB0 ด้วยไฟล์อุปกรณ์ใด ๆ ที่สอดคล้องกับพอร์ตอนุกรม USB ของคุณ (ตัวอย่างเช่น Uno ที่เชื่อมต่อครั้งแรกน่าจะเป็น / dev / ttyACM0)

แม้จะเกี่ยวข้องกับพอร์ตอนุกรมดั้งเดิมของ PI แต่พฤติกรรมนี้ของ DTR นั้นอยู่ภายใต้การควบคุมซอฟต์แวร์ในที่สุด - ทุกคนที่โต้แย้งเป็นอย่างอื่นจะเพิกเฉยต่อความจริงที่ว่ามันเป็นเพียงไดรเวอร์ Linux เท่านั้นไม่ใช่ฮาร์ดแวร์ที่มีความรู้เกี่ยวกับพอร์ต เปิดหรือปิด ฮาร์ดแวร์พอร์ตจริงสามารถบอกได้ว่ากำลังอ่านหรือเขียนหรือกำหนดค่าใหม่เท่านั้นซึ่งไม่มีความหมายเหมือนกันกับการเปิดอุปกรณ์อนุกรม


จะใช้งานได้ตราบใดที่ไม่ได้รีสตาร์ทโฮสติ้ง pi หรือไม่
user2395126

6

โพสต์ @ChrisStrattonsอธิบายวิธีใช้stty -F /dev/ttyUSB0เพื่อหลีกเลี่ยงการแฮงค์ซึ่งส่งผลให้มีการรีเซ็ต นี่เป็นตัวอย่างข้อมูลที่ต้องทำใน Python:

import termios

path = '/dev/ttyACM0'

# Disable reset after hangup
with open(path) as f:
    attrs = termios.tcgetattr(f)
    attrs[2] = attrs[2] & ~termios.HUPCL
    termios.tcsetattr(f, termios.TCSAFLUSH, attrs)

ser = serial.Serial(path, 9600)
# etc.

โปรดทราบว่าจำนวนที่แน่นอนอาจเมื่อเสียบสาย USB ดังนั้นฉันตรวจสอบเส้นทางโดย globbing:

try:
    path = glob.glob('/dev/ttyACM*')[0]
except IndexError:
    # retry, error out, etc.
    pass

ฉันยืนยันว่ามันใช้งานได้ใน Ubuntu บนแล็ปท็อปทั่วไป x86_64 และ Raspberry Pi 2
Cerin

มีเหตุผลที่จะใช้termiosเกินพูดos.system("stty -F /dev/ttyUSB0 -hupcl")? ยิ่งไปกว่านั้นฉันสังเกตเห็นว่าสิ่งนี้ไม่ได้ป้องกันการรีเซ็ต Arduino ในครั้งแรกที่คุณเชื่อมต่อกับมันหลังจากเปิดระบบโฮสต์ มันป้องกันไม่ให้รีเซ็ตในการเชื่อมต่อที่ตามมา ซึ่งดีกว่าไม่มีอะไร แต่ฉันหวังว่าฉันจะสามารถหาวิธีหยุดไม่ให้สลับ DTR ได้
Jason C

2
@JasonC การใช้termiosบันทึก fork / exec (call) ไปยังโปรแกรมภายนอก ( stty) ไม่แน่ใจว่าจะทำอย่างไรเกี่ยวกับสิ่ง DTR ฉันคิดว่าฉันเพิ่งยอมรับ "ฟีเจอร์" นี้และเพิ่มตรรกะบางอย่าง (จับมือกำหนดเองโดยการเขียน / อ่าน) เพื่อตรวจสอบว่า Arduino และแอปพลิเคชันใน Pi ซิงค์กันหรือไม่
Lekensteyn

ทางออกสุดท้ายของฉันคือการเพิ่มคำสั่ง stty เมื่อ pi boots ตามด้วยเสียงสะท้อนไปยังพอร์ตเพื่อบังคับให้รีเซ็ตครั้งแรกและการหน่วงเวลา 3 วินาทีเพื่อรอการรีเซ็ต arduino หลังจากนั้นฉันไม่ต้องคิดอะไรอีกแล้วหลังจากนั้นหรือกังวลกับมันในสคริปต์ของ Python ฉันทำมันใน rc.local แต่ทุกที่ ราคาคือเวลาบูต pi +3 วินาทีที่สอง
Jason C

3

คุณสามารถเพิ่มตัวต้านทาน 120Ohm (หรือชุดค่าผสมเพื่อสร้างตัวต้านทาน 120Ohm) ระหว่างRESETและ5Vสิ่งนี้จะป้องกันการรีเซ็ตอย่างสมบูรณ์ นี่เป็นวิธีที่น้อยที่สุดเนื่องจากโซลูชั่นอื่น ๆ ต้องการเอาตัวต้านทานหรือตัวเก็บประจุออกจากบอร์ด อย่าเก็บตัวต้านทานหากคุณกำลังเขียนโปรแกรม ย้ายมัน.

ป้อนคำอธิบายรูปภาพที่นี่

บอร์ดของ Leonardo จะไม่รีเซ็ตแม้ว่าDTRจะถูกเรียกใช้ แต่ปัญหาเริ่มต้นขึ้นเมื่อคุณจำเป็นต้องรีเซ็ตมันจากระยะไกลเนื่องจากบางครั้งมันขาดการเชื่อมต่อกับราสเบอร์รี่และคุณต้องรีเซ็ตมันทางกายภาพ


3
ฉันไม่แน่ใจว่าสิ่งนี้สมควรได้รับ downvote มันแย่มากที่จะทำและไม่ใช่ซอฟต์แวร์ แต่หลังจากการวิจัยบางอย่างดูเหมือนว่าจะเป็นโซลูชันฮาร์ดแวร์ที่ทำงานได้จริง
Jason C

0

หากคุณใช้ไลบรารี Seria และ pySerial คุณสามารถใช้:

ser = serial.Serial ('/ dev / ttyACM0', 9600, dsrdtr = True)


-1

คุณสามารถใช้ PySerial นี่คือตัวอย่างของรหัสไพ ธ อน:

port =serial.Serial(
    "/dev/ttyUSB0",
    baudrate=57600,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS,
    dsrdtr = False
    )

สำหรับตัวเลือกเพิ่มเติมตรวจสอบPyserial


1
นี่ไม่ใช่ปัญหาของห้องสมุด ฉันใช้ alreadz แล้วลอง libs 4 แบบผลลัพธ์ที่เหมือนกันเสมอ - คำสั่ง DTR ถูกละเว้น
jnovacho

หากนี่เป็นคำสั่งที่ถูกต้องเกี่ยวกับบางสิ่งที่ทำงานบนลีนุกซ์ตัวอื่นก็ควรทำงานบน pi ด้วยเช่นกันเนื่องจากฮาร์ดแวร์ pi เป็นเพียงโฮสติ้งซอฟต์แวร์ลินุกซ์ทั่วไปและไม่เกี่ยวข้องโดยเฉพาะ
Chris Stratton

1
มันใช้งานไม่ได้ บน Linux นี่ยังทำให้ Arduino รีเซ็ต
Cerin

1
สามารถยืนยันได้ว่ามันไม่ทำงานกับ Pi และ Arduino รุ่นใดก็ตามที่ฉันมี (ฉันไม่รู้ขอโทษฉันรู้ว่าไม่มีสิ่งเหล่านี้ฉันไม่อยากรู้ฉันเพิ่งได้รับระบบเพื่อแก้ไขรหัส บนหึ.) นอกจากนี้ยังไม่แน่ใจว่ามันเกี่ยวข้อง แต่รายงานstty -F /dev/ttyUSB0 -cdtrdsr invalid argument: -cdtrdsr
Jason C
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.