我继承了前雇员编写的python / twisted代码。
我拥有的代码(并且它可以工作)打开一个串行端口并接收数据5秒钟,然后以相反的顺序将其写回。这是代码:
from twisted.internet import reactor
from twisted.internet.protocol import Protocol
from twisted.internet.serialport import SerialPort
import serial
class ReverseEchoProtocol(Protocol):
"""Wait for specific amount of data.
Regardless of success, closes connection timeout seconds after opening.
"""
def __init__(self, port, timeout, logger):
self._logger = logger
self._timeout = timeout
def connectionMade(self):
self._logger.info('RS485 connection made.')
reactor.callLater(self._timeout, self.transport.loseConnection, 'timeout')
def connectionLost(self, reason):
self._logger.info('RS485 connection lost. ' + str(reason))
def dataReceived(self, data):
self._logger.info('RS485 received data. ' + repr(data))
self.transport.write(data[::-1])
self.transport.flushOutput()
从python函数中,上面的代码通过以下调用启动:
protocol = ReverseEchoProtocol(port, 5 self._logger)
try:
port.open(protocol)
except serial.SerialException as err:
# print/log err.message here
return False
return True
对 port.open 的此调用在成功打开端口后立即返回(在完成5秒之前)
这是我想写的。从python函数内部,我需要启动一个串行事务。它需要等待事务完成,失败或超时。 以下是串行事务需要执行的操作:
这是我的问题....试图调整我已经拥有的代码,我可以编写一个新的协议。在 connectionMade 中,它可以执行写入,启动读取,然后通过调用 reactor.callLater 设置超时。在 dataReceived 里面,我可以将读取的数据附加到字符串中。在 connectionLost 里面,我可以返回字符串read。
但是如何让python函数调用port.open等到事务完成? (有没有类似reactor.wait函数或连接函数?)另外,如果有错误(或异常),我该如何传递它(一个try块?)如何将字符串传递给python函数?
我认为我继承的代码让我接近......我只需要回答这几个问题就可以完成任务。
答案 0 :(得分:0)
要回答您的前两个问题,您正在寻找运行<# THis code works ok #>
try{
Connect-SPOService -Url $adminUrl
return $True
}
catch{
return $False
}
<# THis code Fail #>
try{
$siteExists = get-SPOSite | where{$_.url -eq $sitePath}
<# or nextfail to #>
$sites = Get-SPOSite -Limit All
return $True
}
catch{
return $False
}
的扭曲主循环,但这听起来像并且看起来像您正在期待一个阻塞的api并且扭曲是事件驱动的,这可能意味着您正在强迫使用扭曲。您可以直接使用串行模块,而无需扭曲即可完成所需的工作。如果您确实希望将事件驱动为非阻塞的,那么您将不得不提出更具体的问题。