【问题标题】:PySerial: how to understand that the timeout occured while reading from serial port?PySerial:如何理解从串口读取时发生超时?
【发布时间】:2014-05-01 13:25:44
【问题描述】:

我正在使用PySerial 从串行端口读取,如下面的代码所示。 CheckReadUntil() 读取我发送到串行端口的命令的输出,直到符号序列 readUntil 在串行输出中。

...

self.ser = serial.Serial(comDev, 115200, timeout=10)

...

#Function that continue to read from Serial port until 'readUntil' 
#sequence of symbols appears
def CheckReadUntil(self, readUntil):
    outputCharacters = []
    while 1:
        ch = self.ser.read()
        outputCharacters += ch
        if outputCharacters[-len(readUntil):]==readUntil:
            break
    outputLines = ''.join(outputCharacters)
    return outputLines

但是,如果没有序列readUntil(出于任何原因),我将永远停留在函数CheckReadUntil() 中。设置 timeout=10 设置了超时,所以我陷入了一个每 10 秒迭代一次并且什么都不做的循环,只是等待。

如何理解存在超时事件以便我可以退出无限循环?输出长度可能不同。

【问题讨论】:

    标签: python serial-port timeout pyserial


    【解决方案1】:

    更新(之前的答案不正确,这是来自@konstantin 的工作代码):

    ...
    
    self.ser = serial.Serial(comDev, 115200, timeout=10)
    
    ...
    
    #Function that continue to read from Serial port until 'readUntil' 
    #sequence of symbols appears
    def CheckReadUntil(self, readUntil):
        outputCharacters = []
        while 1:
            ch = self.ser.read()
            if len(ch) == 0:
                break
            outputCharacters += ch
            if outputCharacters[-len(readUntil):]==readUntil:
                break
        outputLines = ''.join(outputCharacters)
        return outputLines
    

    【讨论】:

    • 您好!谢谢你的回复,刚刚查了一下。您的解决方案存在问题:在每次读取时,我们可能需要等到超时。例如,我们尝试读取 'abcdefg' 和 readUntil = 'efg'。因此,我们读取“abc”,然后读取“def”,然后等待“g”超时
    • 我必须做的是 'ch = self.ser.read()' + 'if len(ch) == 0:' 而不是你相应的行。现在一切都很好!我们只需要在挂机时等待超时,而不是一直等待!再次感谢您的回复!
    • @Konstantin 能否在修复后解释/发布您的最终解决方案,谢谢
    • @schantischul,问题的本质是串行超时不会引发超时异常。通过检查是否未返回任何字符来检测超时:if len(ch) == 0: break。请注意,文档中提到了 read_until() 函数,它的行为似乎与上述 CheckReadUntil() 函数类似。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 2012-05-18
    • 2017-10-18
    相关资源
    最近更新 更多