1

我已经编写了一个 Arduino 以将数据串行发送到我的计算机。pySerial 正在从串行中正确读取,但由于我总是想拥有最新的信息,我想我可以使用 flushInput() 刷新输入缓冲区,但是当执行命令时,我无法再读取连续剧。我只尝试每 51 次刷新一次(因为 51 是质数,我可以用计数器轻松计数 51 次而无需重置它),这样 Arduino 就有足够的时间发送下一个数据包(以 57600 波特运行),但仍然无法正常工作。也就是说,我使用了一个变量来存储读取行的长度,使用期限(),但是,一旦我达到 51 并且输入缓冲区被刷新,我总是得到 0 的读数,这意味着它没有读取任何内容。我已经阅读了 pySerial 的文档,但没有找到任何相关信息。flushInput() 是否也会终止串行连接?非常感谢。

编辑:我正在运行 Mac OS 10.7.5 和 Python 2.7.3

try:
    self.s = serial.Serial("/dev/tty.usbmodemfa131", 57600, timeout = 0)
    self.FlightLoopCB = self.FlightLoopCallback
    XPLMRegisterFlightLoopCallback(self, self.FlightLoopCB, self.interval, 0)
except serial.SerialException:
    self.s = None
    .
    .
    .

    self.length=0
    self.myline=self.s.readline()
    self.length=len(self.myline)
    print "Test: %i %i" % (self.length, self.j)
    if(self.length>=7):
        if(self.myline[0:2]=="R,"):
            if(self.j%51==0):
                self.s.flushInput()

            self.length=len(self.myline)
            self.myline=self.myline[2:6]
            self.myLineBytes=[0,0]

            self.myLineBytes[0]=unpack('>H', self.myline[0:2])
            self.myLineBytes[1]=unpack('>H', self.myline[2:4])
4

1 回答 1

9

是否Serial.flushInput()也关闭流?

所以我确实研究了 pySerial 的代码(它是可用的,你可以通过 SVN 拉它,如果你有进一步的麻烦,我建议你这样做)。

由于您在 OSX 上,python 报告os.name为“posix”,因此serial.Serial实际上解析为serial.serialposix.Serial. for的定义flushInput()是:

def flushInput(self):
    """Clear input buffer, discarding all that is in the buffer."""
    if not self._isOpen: raise portNotOpenError
    termios.tcflush(self.fd, TERMIOS.TCIFLUSH)

(如果你想看它,它第 500 行)

所以本质上它只是一个包装器termios.tcflush()文档有这样的说法:

termios.tcflush(fd,队列)

丢弃文件描述符 fd 上的排队数据。队列选择器指定哪个队列:TCIFLUSH 用于输入队列,TCOFLUSH 用于输出队列,或 TCIOFLUSH 用于两个队列。

然后根据文档,它不会关闭底层流,只会丢弃数据。这可能是您最初期望的行为。

这使我说您的代码可能还有其他问题。没有足够的发布代码能够推断出问题所在。

这只是一个猜测,但也许递增的代码self.j在一个块内,它在达到 51 后没有被调用,所以你总是在刷新?如果您可以发布一个产生问题的完整代码示例(也许一些简化的代码集只是练习您所看到的这个问题),那么我可能会提供帮助。

PS——关于过早优化的说明:

除非在串行接口的另一端产生数据的速度比您消耗的速度快得多,否则可能不需要首先刷新,因为缓冲区中不会积聚大量数据. 不知何故,我怀疑以 57600 波特运行的串行接口是否能够做到这一点。在进行之前,您应该首先检查并确保确实需要冲洗。

不要仅仅因为您认为可能需要它或“只是为了确保”而这样做。在做之前检查它是否真的解决了一个问题,否则这是一个过早的优化,它只会无缘无故地增加代码的复杂性和脆弱性。

于 2013-02-24T20:47:22.780 回答