Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PySerial:如何理解从串行端口读取时发生超时?_Python_Serial Port_Timeout_Pyserial - Fatal编程技术网

Python PySerial:如何理解从串行端口读取时发生超时?

Python PySerial:如何理解从串行端口读取时发生超时?,python,serial-port,timeout,pyserial,Python,Serial Port,Timeout,Pyserial,我正在使用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 C

我正在使用
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秒迭代一次,什么都不做,只是等待

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

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


你好谢谢你的回复,只是检查了一下。您的解决方案存在一个问题:每次读取时,我们可能需要等待超时。例如,我们尝试读取'abcdefg'和readUntil='efg'。因此,我们先读取'abc',然后读取'def',然后等待'g'一段超时时间。我要做的是读取'ch=self.ser.read()'+'如果len(ch)==0:'而不是相应的行。现在一切都很好!我们需要等待超时只有当我们挂断,而不是所有的时间!再次感谢您的回复@康斯坦丁你能解释一下/发布你的最终解决方案吗,thanks@schantischul,问题的实质是串行超时不会引发超时异常。通过检查是否未返回任何字符来检测超时:
如果len(ch)=0:break
。请注意,文档中提到了一个
read_until()
函数,其行为与上述
CheckReadUntil()函数类似。
...

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