gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:56:52 27 4
gpt4 key购买 nike

有没有办法使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com