2015-05-12 22 views
7

Có cách nào để kết nối với cổng nối tiếp nối mạng RFC2217 với Twisted Python không?Sử dụng cổng nối tiếp mạng RFC2217 với Twisted Python?

Dường như dường như hỗ trợ thông qua serial.serial_for_url("rfc2217://...")function. Và họ chỉ ra rằng sử dụng xoắn để quản lý các kết nối nối tiếp, tuy nhiên twisted.internet.serialport.SerialPort dường như mong đợi một tên cổng hoặc số mà cho thấy nó chỉ là đi qua này để các nhà xây dựng serial.Serial.

Tôi có thể sử dụng socat để tạo PTY bên ngoài và chuyển tên dev thành xoắn mà hoạt động tốt, nhưng tôi tự hỏi liệu tôi có thể bỏ qua bước này bằng cách sử dụng hỗ trợ trực tiếp.

socat PTY,link=/dev/myport TCP:192.168.1.222:9001 

Sửa: Các pyserial faq gợi ý sửa đổi này cho instantiating đối tượng nối tiếp:

try: 
    s = serial.serial_for_url(...) 
except AttributeError: 
    s = serial.Serial(...) 

Không chắc chắn nếu điều này giúp mặc dù ...

+0

Tôi không có câu trả lời cho bạn, tôi sợ; và tôi nghi ngờ câu trả lời sẽ là * Không; chưa*; và bạn có thể muốn gửi một vấn đề :) - Tuy nhiên bạn đã có tôi nghĩ rằng chúng tôi shoudl cũng thêm một tính năng như vậy để [circuit.io.Serial] (https://github.com/circuits/circuits/ blob/master/circuits/io/serial.py) –

+0

Cảm ơn James, vâng tôi sẽ xem xét việc gửi yêu cầu tính năng/vấn đề nếu không có câu trả lời hay. –

+0

WRT để chỉnh sửa của bạn; Tôi nghĩ bạn sẽ muốn làm '' if ": //" in''. tức là: kiểm tra một URI hoặc một cái gì đó. –

Trả lời

2

Tôi đã đi đến kết luận rằng việc sử dụng Pyserial của RFC2217 hỗ trợ với Twisted Python là không tầm thường. thực hiện RFC2217 Pyserial của, bên cạnh being currently experimental, sử dụng chủ đề để quản lý các kết nối ổ cắm mà họ nêu như là một vấn đề đối với các ứng dụng dựa trên chọn:

Việc thực hiện bắt đầu một chủ đề mà giữ đọc từ (nội bộ) socket. Chủ đề được quản lý tự động bởi đối tượng cổng rfc2217.Serial trên mở()/close(). Tuy nhiên nó có thể là một vấn đề cho các ứng dụng người dùng muốn sử dụng lựa chọn thay vì chủ đề.

Nó là khá thẳng về phía trước để phân lớp tiserialport.SerialPort và ghi đè lên các phương pháp _serialFactory (mà tạo ra các đối tượng pyserial sẽ được sử dụng để truy cập vào cổng nối tiếp)

class SerialPort(serialport.SerialPort): 
    def _serialFactory(self, dev, *args, **kwargs): 
     " pyserial recommends the following for supporting serial urls " 
     try: 
      return serial.serial_for_url(dev) 
     except AttributeError: 
      return serial.Serial(dev, *args, **kwargs) 

Tuy nhiên, đối tượng dẫn đến thiếu một bộ mô tả tập tin và do đó phương thức fileno() (được sử dụng trong nội bộ bởi t.i._posixserialport) ném một ngoại lệ.

--- <exception caught here> --- 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/twisted/internet/base.py", line 1204, in mainLoop 
    self.doIteration(t) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/twisted/internet/selectreactor.py", line 105, in doSelect 
    [], timeout) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/twisted/internet/_posixserialport.py", line 48, in fileno 
    return self._serial.fd 
exceptions.AttributeError: 'Serial' object has no attribute 'fd' 

Các cách giải quyết hiện nay là để thể sử dụng socat như mô tả trong câu hỏi, hoặc cho máy chủ nối tiếp mạng Tôi đang sử dụng (Brainboxes ES-842), bạn có thể cấu hình nó trong chế độ "Raw TCP" thay vì " Chế độ Telnet/RFC2217 "và chỉ sử dụng giao thức hiện có của bạn qua kết nối TCP (miễn là bạn không phụ thuộc vào điều khiển luồng hoặc các dòng điều khiển nối tiếp khác và có thể sử dụng tốc độ truyền cố định được xác định trước).

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