2009-06-02 42 views
22

Tôi đang gỡ lỗi liên lạc bằng thiết bị nối tiếp và tôi cần xem tất cả dữ liệu đang chảy theo cả hai hướng.Làm cách nào để giám sát dữ liệu trên cổng nối tiếp trong Linux?

Có vẻ như điều này sẽ dễ dàng trên Linux, nơi cổng nối tiếp được biểu diễn bằng một tệp. Có cách nào mà tôi có thể làm một loại "bi-directional tee", nơi tôi nói chương trình của tôi để kết nối với một đường ống sao chép dữ liệu vào một tập tin và cũng shuffles nó đến/từ các thiết bị cổng nối tiếp thực tế?

Tôi nghĩ rằng tôi thậm chí có thể biết làm thế nào để viết một con thú như vậy, nhưng có vẻ như không tầm thường, đặc biệt là để có được tất cả các IOCTLs qua cho cấu hình cổng, vv

Có ai đã xây dựng được một điều như vậy ? Nó có vẻ quá hữu ích (cho những người gỡ lỗi trình điều khiển thiết bị nối tiếp) không tồn tại rồi.

+6

Vậy ... làm thế nào bạn kết thúc việc này, chính xác? – detly

+1

Vâng, tôi cũng muốn biết, vì tôi đã thất bại cho đến nay để hiểu cách sử dụng strace cho việc này. Chúc mừng! – mac

+1

Điều này có thể quan tâm đến những người gặp khó khăn với câu trả lời đã cho: http://unix.stackexchange.com/questions/12359/how-can-i-monitor-serial-port-traffic – geekboyUK

Trả lời

18

strace rất hữu ích cho việc này. Bạn có một hình dung của tất cả các cuộc gọi ioctl, với cấu trúc tương ứng được giải mã. Các tùy chọn sau dường như đặc biệt hữu ích trong trường hợp của bạn:

-e đọc = thiết

Thực hiện một hệ thập lục phân và ASCII đầy đủ bãi chứa của tất cả các dữ liệu đọc từ file descriptor được liệt kê trong bộ quy định. Ví dụ: để xem tất cả hoạt động nhập trên các bộ mô tả tệp 3 và 5 sử dụng -e read = 3,5. Lưu ý rằng này độc lập với truy tìm thông thường của cuộc gọi hệ thống đã đọc (2) là được điều khiển bởi tùy chọn -e trace = read.

-e ghi = thiết

Thực hiện một hệ thập lục phân đầy đủ và ASCII bãi chứa của tất cả các dữ liệu được viết vào tập tin mô tả liệt kê trong quy định bộ. Ví dụ: để xem tất cả đầu ra hoạt động trên các bộ mô tả tệp 3 và 5 sử dụng -e write = 3,5. Lưu ý rằng đây là độc lập với truy tìm thông thường cuộc gọi hệ thống ghi (2) là được điều khiển bởi tùy chọn -e trace = write.

+0

Hoàn hảo, cảm ơn! Tôi biết phải có một cách đơn giản để làm điều này. Tôi sử dụng strace tất cả các thời gian, nhưng thậm chí không xem xét nó cho việc này. – divegeek

+4

Điều đó thật tuyệt vời. Nhưng tôi tự hỏi: Làm thế nào tôi có thể tìm ra những gì các số mô tả tập tin có liên quan là? –

3

Tôi đã tìm thấy pyserial hoàn toàn có thể sử dụng được, vì vậy nếu bạn sử dụng Python, không quá khó để viết một thứ như vậy.

2

Một phương pháp đơn giản là viết một ứng dụng được mở bên chính của pty và thử nghiệm tty. Sau đó, bạn sẽ chuyển ứng dụng tty của bạn bên nô lệ của pty làm 'thiết bị tty'.

Bạn sẽ phải theo dõi các thuộc tính pty với tcgetattr() trên pty chính và gọi tcsetattr() trên tty thực nếu các thuộc tính thay đổi.

Phần còn lại sẽ là đơn giản select() trên cả hai dữ liệu sao chép của fd hai chiều và sao chép dữ liệu đó vào nhật ký.

+0

Làm thế nào để giám sát các sự kiện của một thay đổi được thực hiện với 'tcsetattr()'? Họ sẽ được báo cáo bằng cách lắng nghe với 'chọn'? – dolmen

+0

Trình điều khiển tty (và os) chỉ có một hợp đồng trên select() phản ứng với đầu vào và đầu ra. Cách đơn giản nhất là chỉ cần gọi tcgetattr() sau một cuộc gọi chọn thành công, trước khi xử lý bất kỳ đầu vào/đầu ra nào. – codeDr

1

Tôi đã xem rất nhiều trình theo dõi nối tiếp. Tất cả chúng đều dựa trên ý tưởng tạo cổng nối tiếp ảo và thu thập dữ liệu từ cổng đó. Tuy nhiên, bất kỳ thay đổi baud/parity/flow nào sẽ ngắt kết nối.

Vì vậy, tôi đã viết trình thám thính của riêng mình :). Hầu hết các cổng nối tiếp bây giờ chỉ là bộ chuyển đổi từ USB sang nối tiếp. Trình thám thính của tôi thu thập dữ liệu từ USB thông qua các bản sửa lỗi, phân tích cú pháp và xuất ra bảng điều khiển. Ngoài ra bất kỳ thay đổi baudrate, kiểm soát dòng chảy, sự kiện dòng, và lỗi nối tiếp cũng được ghi lại. Dự án đang trong giai đoạn phát triển ban đầu và hiện tại chỉ có FTDI được hỗ trợ.

http://code.google.com/p/uscmon/

+0

Cái nhìn thú vị này. Sẽ là tuyệt vời nếu bạn có thể cập nhật để sử dụng bất kỳ vid/pid và nơi để thay đổi nó? – not2qubit

+0

sẽ là tốt đẹp nếu nó có một makefile – nhed

+0

Một vị trí khác ở đây (https://github.com/after5cst/uscmon) và các vấn đề thảo luận giúp xây dựng nó nhưng dường như không thực sự làm công việc @MBR bạn có một phiên bản cập nhật không hoặc tài liệu? – nhed

Các vấn đề liên quan