Làm thế nào để tìm thấy cổng nối tiếp đang được sử dụng?


33

Câu hỏi:

Tôi đã cắm một thiết bị (tức là modem GSM) thông qua cổng nối tiếp (còn gọi là RS-232) và tôi cần xem tập tin nào trong /dev/hệ thống tập tin mà thiết bị này được gắn, để có thể giao tiếp với nó. Thật không may, không có tập tin mới được tạo trong /dev/và cũng không thể nhìn thấy bất cứ điều gì trong dmesgđầu ra. Vì vậy, đây có vẻ là một câu hỏi khó.

Lý lịch:

Tôi chưa bao giờ làm việc với một thiết bị nối tiếp, vì vậy ngày hôm qua, khi có nhu cầu, tôi đã thử Google nhưng không thể tìm thấy bất cứ điều gì hữu ích. Tôi đã dành một vài giờ để tìm kiếm, và tôi muốn chia sẻ một câu trả lời tìm thấy vì nó có thể hữu ích cho ai đó.


1
Tôi thích sử dụng các bit đó để phát hiện thiết bị - Có lẽ tôi sẽ sử dụng nó, mặc dù tôi có nhiều thiết bị chỉ sử dụng chân Tx / Rx, tôi có thể hack chúng để giữ dòng CTS cao cho điều đó.
Daniel Staple

Câu trả lời:


34

Thật không may, các cổng nối tiếp không phải là PlugNPlay, vì vậy kernel không biết thiết bị nào đã được cắm. Sau khi đọc hướng dẫn HowTo tôi đã có ý tưởng làm việc.

Thư mục /dev/của unix như OSes chứa các tệp có tên là ttySn (với n là một số) . Hầu hết chúng không tương ứng với các thiết bị hiện có. Để tìm cái nào làm, hãy ra lệnh:

$ 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

Trên đây là một ví dụ đầu ra của PC của tôi. Bạn có thể thấy việc khởi tạo một vài cổng nối tiếp:

ttyS0, ttyS1, ttyS4, ttyS5.

Một trong số chúng sẽ có điện áp dương khi cắm thiết bị. Vì vậy, bằng cách so sánh nội dung của tệp /proc/tty/driver/serialcó và không có thiết bị được cắm, chúng ta có thể dễ dàng tìm thấy các ttyS liên quan đến thiết bị của mình. Vì vậy, bây giờ làm:

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

(un) cắm thiết bị

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

Tiếp theo kiểm tra sự khác biệt giữa hai tập tin. Dưới đây là một đầu ra của PC của tôi:

$ 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

Bằng cách so sánh ba số với đầu ra dmesg, chúng ta có thể xác định được số nào là cổng:

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

Do đó, thiết bị của chúng tôi là /dev/ttyS0, nhiệm vụ đã hoàn thành!


1
Điều gì xảy ra nếu tôi không thấy bất kỳ thiết bị nào trong đầu ra dmesg?
user3019105

2
@ user3019105 xin lỗi, tôi chưa bao giờ phải đối mặt với vấn đề như vậy. Từ những gì tôi hiểu, dmesgnên có một thông điệp về việc gán irq cho một thiết bị nối tiếp. Và nếu không, tôi sẽ gặp một số vấn đề về phần cứng. Đó chỉ là một giả định và có thể sai, nhưng nếu tôi gỡ lỗi một vấn đề như vậy, tôi sẽ bắt đầu nghiên cứu với ý tưởng rằng cổng nối tiếp nên được khởi tạo.
Hi-Angel

1
Kể từ khi tôi chuyển từ máy này sang máy khác, tôi đã xác định một bí danh để hiển thị cho tôi các cổng nối tiếp trên máy này. Nó hoạt động trên các hệ thống gia đình Ubuntu với systemd. cổng bí danh = 'udevadm thông tin --export-db | grep -i "^ n: ttyu"'
DDay
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.