扭曲

时间:2016-07-17 19:01:26

标签: python serial-port twisted

我继承了前雇员编写的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函数内部,我需要启动一个串行事务。它需要等待事务完成,失败或超时。 以下是串行事务需要执行的操作:

  1. 事务以字符串和超时值传递。
  2. 打开串口。未能打开导致返回错误
  3. 该字符串被写入串口。写入失败导致返回错误
  4. 如果写入成功,则会在“超时”秒内连续读取相同的端口。在读取数据时(可能是多次读取),它会附加到字符串中。
  5. 在“超时”秒后,返回在此期间从端口读取的所有数据的字符串(如果没有读取任何内容,则返回空字符串)。
  6. 这是我的问题....试图调整我已经拥有的代码,我可以编写一个新的协议。在 connectionMade 中,它可以执行写入,启动读取,然后通过调用 reactor.callLater 设置超时。在 dataReceived 里面,我可以将读取的数据附加到字符串中。在 connectionLost 里面,我可以返回字符串read。

    但是如何让python函数调用port.open等到事务完成? (有没有类似reactor.wait函数或连接函数?)另外,如果有错误(或异常),我该如何传递它(一个try块?)如何将字符串传递给python函数?

    我认为我继承的代码让我接近......我只需要回答这几个问题就可以完成任务。

1 个答案:

答案 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并且扭曲是事件驱动的,这可能意味着您正在强迫使用扭曲。您可以直接使用串行模块,而无需扭曲即可完成所需的工作。如果您确实希望将事件驱动为非阻塞的,那么您将不得不提出更具体的问题。