Vô hiệu hóa DTR trên ttyUSB0


11

Tôi đang kết nối từ Pi đến bo mạch Arduino. Vấn đề là, tôi cần phải vô hiệu hóa dòng DTR, để ngăn Arduino thiết lập lại kết nối.

Tôi đã đọc rằng trên RPi không thể kiểm soát DTR, DCD và các dòng khác. Điều này có đúng với RPi trên toàn cầu hay chỉ đối với các chân GPIO được sử dụng cho giao tiếp nối tiếp?

Nếu có thể tắt DTR trên cổng USB, làm thế nào để bạn thực hiện điều đó?

Câu trả lời:


6

Các thuộc tính của bộ chuyển đổi nối tiếp USB không liên quan gì đến phần cứng của hệ thống lưu trữ, mà chỉ với chính chip nối tiếp USB và ngăn xếp phần mềm của hệ thống lưu trữ.

Các pi nên sử dụng trình điều khiển nối tiếp USB Linux.

Do đó, bạn có thể bật / tắt liên kết của DTR để mở / đóng cổng thông qua phương pháp Linux thông thường để xóa hupclcài đặt như được ghi lại trên trang Arduino và các nơi khác:

stty -F /dev/ttyUSB0 -hupcl

Hoặc thay thế / dev / ttyUSB0 bằng bất kỳ tệp thiết bị nào thực sự tương ứng với cổng nối tiếp USB của bạn (ví dụ: Uno đầu tiên được kết nối có thể sẽ là / dev / ttyACM0)

Ngay cả đối với cổng nối tiếp riêng của PI, hành vi này của DTR cuối cùng vẫn nằm dưới sự kiểm soát của phần mềm - bất kỳ ai tranh luận khác đều phớt lờ thực tế rằng đó chỉ là trình điều khiển Linux chứ không phải phần cứng, có kiến ​​thức về cổng này mở hoặc đóng Phần cứng cổng thực tế chỉ có thể nói rằng nó đang được đọc từ hoặc được viết hoặc cấu hình lại, không có phần nào thực sự đồng nghĩa với việc mở thiết bị nối tiếp.


Điều này sẽ chỉ hoạt động miễn là lưu trữ pi không được khởi động lại?
dùng2395126

6

Bài đăng @ChrisStrattons mô tả cách sử dụng stty -F /dev/ttyUSB0để tránh bị treo máy dẫn đến thiết lập lại. Đây là một đoạn để làm điều đó trong 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.

Lưu ý rằng số chính xác có thể khi cắm lại cáp USB, vì vậy tôi phát hiện đường dẫn bằng cách đặt vòng tròn:

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

Tôi đã xác nhận rằng tính năng này hoạt động trong Ubuntu trên máy tính xách tay x86_64 chung và Raspberry Pi 2.
Cerin

Có bất kỳ lý do để sử dụng termioshơn, nói , os.system("stty -F /dev/ttyUSB0 -hupcl")? Ngoài ra, btw, tôi nhận thấy điều này không ngăn Arduino thiết lập lại lần đầu tiên bạn kết nối với nó sau khi hệ thống máy chủ được bật; nó ngăn nó đặt lại trên các kết nối tiếp theo. Mà tốt hơn là không có gì. Nhưng tôi ước tôi có thể tìm ra cách ngăn chặn nó khỏi làm hỏng DTR.
Jason C

2
@JasonC Sử dụng termioslưu một fork / exec (cuộc gọi) vào một chương trình bên ngoài ( stty). Không chắc chắn phải làm gì với điều DTR, tôi nghĩ rằng tôi đã chấp nhận "tính năng" này và thêm một số logic (bắt tay tùy chỉnh bằng cách viết / đọc) để phát hiện xem Arduino và ứng dụng trên Pi có đồng bộ hóa hay không.
Lekensteyn

Giải pháp cuối cùng của tôi là thêm lệnh stty khi pi khởi động, theo sau là tiếng vang đến cổng để buộc thiết lập lại đầu tiên đó và trì hoãn 3 giây để chờ thiết lập lại arduino. Sau đó, tôi không phải suy nghĩ về nó nữa sau đó hoặc lo lắng về nó trong các tập lệnh Python. Tôi đã làm nó trong RC.local nhưng bất cứ nơi nào. Chi phí là +3 giây thời gian khởi động pi.
Jason C

3

Bạn có thể thêm điện trở 120Ohm (hoặc kết hợp để tạo điện trở 120Ohm) giữa RESET5VĐiều này sẽ ngăn việc đặt lại hoàn toàn. Đây là ít xâm lấn nhất vì các giải pháp khác yêu cầu loại bỏ một điện trở hoặc tụ điện khỏi bảng, nó làm phức tạp tải lên. Không giữ điện trở nếu bạn đang lập trình. Gỡ bỏ nó.

nhập mô tả hình ảnh ở đây

Bảng Leonardo không thiết lập lại ngay cả khi DTRđược kích hoạt nhưng vấn đề bắt đầu khi bạn cần đặt lại từ xa vì đôi khi nó mất kết nối với Raspberry và bạn phải thiết lập lại vật lý.


3
Tôi không chắc chắn điều này xứng đáng với một downvote. Nó rất hấp dẫn để làm điều đó, và không dựa trên phần mềm, nhưng sau một số nghiên cứu, nó dường như là giải pháp phần cứng hoạt động.
Jason C

0

Nếu bạn sử dụng thư viện Seria và pySerial, Bạn có thể sử dụng:

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


-1

Bạn có thể sử dụng PySerial. Đây là một ví dụ về mã Python:

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

để có thêm tùy chọn kiểm tra Pyserial.


1
Đây không phải là vấn đề của thư viện. Tôi đã alreadz đã thử 4 lib khác nhau, luôn có kết quả giống nhau - Các lệnh DTR bị bỏ qua.
jnovacho

Nếu đây là một tuyên bố chính xác về một cái gì đó hoạt động trên một Linux khác, thì nó cũng sẽ hoạt động trên pi, vì phần cứng pi chỉ lưu trữ phần mềm linux chung và không liên quan duy nhất.
Chris Stratton

1
Điều này không hoạt động. Trên Linux, điều này vẫn khiến Arduino thiết lập lại.
Cerin

1
Có thể xác nhận điều này không hoạt động trên bất kỳ phiên bản nào của Pi và Arduino tôi có (Tôi không biết, xin lỗi, tôi không biết gì về những điều này, tôi không muốn biết, tôi chỉ được cung cấp một hệ thống để gỡ lỗi một số mã trên, heh.) Ngoài ra, không chắc nó có liên quan hay không, nhưng stty -F /dev/ttyUSB0 -cdtrdsrbáo cáo invalid argument: -cdtrdsr.
Jason C
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.