python - 将 RFC2217 网络串行端口与 Twisted Python 一起使用?

标签 python twisted pyserial rfc2217

有没有办法使用 Twisted Python 连接到 RFC2217 网络串口?

Pyserial 似乎通过 serial.serial_for_url("rfc2217://...") function 支持它.他们指出 twisted 使用 pyserial 来管理串行连接,但是 twisted.internet.serialport.SerialPort 似乎需要一个端口名称或编号,这表明它只是将其传递给 serial.Serial 构造函数。

我可以使用 socat 在外部创建一个 PTY 并将开发名称传递给 twisted,这工作正常,但我想知道我是否可以通过直接使用 pyserial 支持来绕过这一步。

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

编辑:pyserial faq建议对实例化串行对象进行此修改:

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

虽然不确定这是否有帮助...

最佳答案

我得出的结论是,将 Pyserial 的 RFC2217 支持与 Twisted Python 结合使用并非易事。 Pyserial 对 RFC2217 的实现,除了 being currently experimental ,使用线程来管理套接字连接,他们认为这是基于选择的应用程序的问题:

The current implementation starts a thread that keeps reading from the (internal) socket. The thread is managed automatically by the rfc2217.Serial port object on open()/close(). However it may be a problem for user applications that like to use select instead of threads.

继承 t.i.serialport.SerialPort 并覆盖 _serialFactory 方法(创建用于访问串口的 pyserial 对象)是相当直接的

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)

但是,生成的对象缺少文件描述符,因此 fileno() 方法(由 t.i._posixserialport 内部使用)抛出异常。

--- <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'

当前的解决方法是按照问题中的描述使用 socat,或者对于我正在使用的网络串行服务器 (Brainboxes ES-842),您可以将其配置为“原始 TCP”模式而不是“Telnet/RFC2217”模式,只需通过 TCP 连接使用您现有的协议(protocol)(只要您不依赖于流量控制或其他串行控制线并且可以使用预定义的固定波特率)。

关于python - 将 RFC2217 网络串行端口与 Twisted Python 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30182663/

相关文章:

python - Twisted - FTP 服务器的简单文件完成事件

python - 如何计算和测试并发连接数?

python - pySerial - 只读取一个字节

python - Pyserial:无法配置端口:(22, 'Invalid argument')

python - NameError:未定义名称“LabelEncoder”

python - 在 Python 中编辑多行字符串

Python 到 MySQLdb 不会传递变量我想我已经尝试了一切

python - 如何将值赋值到字符串基 ForeignKey 中?

linux - 使用 Tcpreplay 进行 UDP 调整

python通过串口监控