จะค้นหาพอร์ตอนุกรมที่ใช้งานอยู่ได้อย่างไร?


33

คำถาม:

ฉันเสียบอุปกรณ์ (เช่นโมเด็ม GSM) ผ่านพอร์ตอนุกรม (aka RS-232) และฉันต้องดูว่าไฟล์ใดใน/dev/ระบบไฟล์ที่อุปกรณ์นี้เชื่อมโยงอยู่เพื่อให้สามารถสื่อสารกับมันได้ น่าเสียดายที่ไม่มีไฟล์ที่สร้างขึ้นใหม่ใน/dev/และไม่สามารถเห็นสิ่งใดในdmesgผลลัพธ์ ดังนั้นนี่เป็นคำถามที่ยากมาก

พื้นหลัง:

ฉันไม่เคยทำงานกับอุปกรณ์อนุกรมดังนั้นเมื่อวานนี้เมื่อมีความต้องการฉันพยายาม Google แต่ไม่พบว่ามีประโยชน์ ฉันใช้เวลาค้นหาสองสามชั่วโมงและฉันต้องการแบ่งปันคำตอบที่พบเนื่องจากอาจเป็นประโยชน์กับใครบางคน


1
ฉันชอบใช้บิตเหล่านี้เพื่อตรวจจับอุปกรณ์ - ฉันอาจจะใช้มันแม้ว่าฉันจะมีอุปกรณ์จำนวนมากที่ใช้หมุด Tx / Rx เท่านั้น แต่ฉันอาจแฮ็กพวกมันเพื่อเก็บสาย CTS ไว้ได้
Danny Staple

คำตอบ:


34

แต่น่าเสียดายที่พอร์ตอนุกรมจะไม่ PlugNPlay ดังนั้นเคอร์เนลไม่ทราบว่าอุปกรณ์เสียบ. หลังจากอ่านHowToกวดวิชาที่ผมเคยมีความคิดในการทำงาน

/dev/ไดเรกทอรีของยูนิกซ์เช่นระบบปฏิบัติการที่มีไฟล์ชื่อเป็นttySN (กับ n เป็นตัวเลข) ส่วนใหญ่ไม่ตรงกับอุปกรณ์ที่มีอยู่ เพื่อค้นหาสิ่งที่ทำออกคำสั่ง:

$ dmesg | grep ttyS
[    0.872181] 00:06: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[    0.892626] 00:07: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
[    0.915797] 0000:01:01.0: ttyS4 at I/O 0x9800 (irq = 19) is a ST16650V2
[    0.936942] 0000:01:01.1: ttyS5 at I/O 0x9c00 (irq = 18) is a ST16650V2

ด้านบนเป็นตัวอย่างผลลัพธ์ของพีซีของฉัน คุณสามารถเห็นการเริ่มต้นของพอร์ตอนุกรมสองสามตัว:

ttyS0, ttyS1, ,ttyS4ttyS5

หนึ่งในนั้นจะมีแรงดันไฟฟ้าเป็นบวกเมื่อเสียบอุปกรณ์ดังนั้นโดยการเปรียบเทียบเนื้อหาของไฟล์ที่/proc/tty/driver/serialมีและไม่มีอุปกรณ์ที่เสียบอยู่เราสามารถหาttySที่เกี่ยวข้องกับอุปกรณ์ของเราได้อย่างง่ายดาย ดังนั้นตอนนี้ทำ:

$ sudo cat /proc/tty/driver/serial> /tmp/1

(un) เสียบอุปกรณ์

$ sudo cat /proc/tty/driver/serial> /tmp/2

ตรวจสอบความแตกต่างระหว่างสองไฟล์ต่อไป ด้านล่างเป็นผลลัพธ์ของพีซีของฉัน:

$ diff /tmp/1 /tmp/2
2c2
< 0: uart:16550A port:000003F8 irq:4 tx:6 rx:0
---
> 0: uart:16550A port:000003F8 irq:4 tx:6 rx:0 CTS|DSR

โดยการเปรียบเทียบตัวเลขสามตัวกับเอาต์พุต dmesg เราสามารถกำหนดได้ว่าอันไหนคือพอร์ต:

[    0.872181] 00:06: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A

ดังนั้นอุปกรณ์ของเรา/dev/ttyS0บรรลุภารกิจแล้ว!


1
หากฉันไม่เห็นอุปกรณ์ใด ๆ ในเอาต์พุต dmesg
3019105

2
@ user3019105 ขออภัยฉันไม่เคยพบปัญหาเช่นนี้ จากสิ่งที่ฉันเข้าใจdmesgควรมีข้อความเกี่ยวกับการกำหนดirqให้กับอุปกรณ์อนุกรม และหากไม่เป็นเช่นนั้นฉันจะถือว่าปัญหาฮาร์ดแวร์บางอย่าง นั่นเป็นเพียงข้อสันนิษฐานและอาจผิด แต่ถ้าฉันแก้ไขข้อบกพร่องของปัญหาได้ฉันจะเริ่มต้นการวิจัยด้วยความคิดที่ว่าพอร์ตอนุกรมควรได้รับการเริ่มต้น
สวัสดีแองเจิล

1
เมื่อฉันย้ายจากเครื่องหนึ่งไปอีกเครื่องฉันได้กำหนดนามแฝงเพื่อแสดงพอร์ตอนุกรมในเครื่องนี้ มันทำงานบนระบบครอบครัว Ubuntu ด้วย systemd พอร์ตนามแฝง = 'ข้อมูล udevadm --export-DB | grep -i "^ N: ttyu'
DDay
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.