Pet*_*son 7 python twisted pyserial rfc2217
有没有办法连接到Twisted Python的RFC2217网络串口?
Pyserial似乎通过该serial.serial_for_url("rfc2217://...") 功能支持它.并且它们表明twisted使用pyserial来管理串行连接,但是twisted.internet.serialport.SerialPort似乎期望端口名称或数字表明它只是将它传递给serial.Serial构造函数.
我可以使用socat在外部创建一个PTY并将dev名称传递给twisted,这很好,但是我想知道我是否可以通过直接使用pyserial支持来绕过这一步.
socat PTY,link=/dev/myport TCP:192.168.1.222:9001
Run Code Online (Sandbox Code Playgroud)
编辑:pyserial faq建议对实例化串行对象进行此修改:
try:
s = serial.serial_for_url(...)
except AttributeError:
s = serial.Serial(...)
Run Code Online (Sandbox Code Playgroud)
不确定这是否有帮助...
我得出的结论是,将 Pyserial 的 RFC2217 支持与 Twisted Python 结合使用并非易事。Pyserial 的 RFC2217 实现除了当前处于实验阶段外,还使用线程来管理套接字连接,他们认为这对于基于选择的应用程序来说是一个问题:
当前的实现启动一个线程,不断从(内部)套接字读取数据。该线程由 open()/close() 上的 rfc2217.Serial 端口对象自动管理。然而,对于喜欢使用 select 而不是线程的用户应用程序来说,这可能是一个问题。
子类 tiserialport.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)
Run Code Online (Sandbox Code Playgroud)
但是,生成的对象缺少文件描述符,因此该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'
Run Code Online (Sandbox Code Playgroud)
socat当前的解决方法是按照问题中所述使用,或者对于我正在使用的网络串行服务器(Brainboxes ES-842),您可以将其配置为“Raw TCP”模式而不是“Telnet/RFC2217”模式,然后使用通过 TCP 连接的现有协议(只要您不依赖流量控制或其他串行控制线并且可以使用预定义的固定波特率)。
| 归档时间: |
|
| 查看次数: |
651 次 |
| 最近记录: |