Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.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和失控的CPU使用_Python_Pyserial - Fatal编程技术网

Python pyserial和失控的CPU使用

Python pyserial和失控的CPU使用,python,pyserial,Python,Pyserial,MacOS 10.7.3、python 2.5 我正在使用pyserial打开与外部服务器的连接。连接打开为: HOST = '10.0.0.1' PORT = '16010' theURL = 'socket://' + HOST + ':' + PORT conn = serial.serial_for_url(theURL, baudrate=115200) conn.timeout = 2 然后读数如下所示: try: while len(rawData) == 0 and s

MacOS 10.7.3、python 2.5

我正在使用pyserial打开与外部服务器的连接。连接打开为:

HOST = '10.0.0.1'
PORT = '16010'
theURL = 'socket://' + HOST + ':' + PORT
conn = serial.serial_for_url(theURL, baudrate=115200)
conn.timeout = 2
然后读数如下所示:

try:
    while len(rawData) == 0 and self.shutdown == False:
        rawData = conn.readline()
except:
    some error handling code...
self.plugin.conn = Serial(..., timeout = 1)
...
if not self.shutdown:
    rawData = self.plugin.conn.read(1)
    if rawData:
        rawData += self.plugin.conn.read(self.plugin.conn.inWaiting())
    else:
        raise Exception("timeout")
问题是,如果我在10.0.0.1:16010关闭服务器,代码将继续运行,但cpu使用率将达到100%。不会抛出错误,因此从不输入except

这看起来像是pyserial中的一个问题,但可能这里的某个人以前遇到过这个问题,并且知道如何检测丢失的连接,以便能够优雅地处理这种情况


谢谢。

如果您不依赖于
.readline()
您可以这样做:

try:
    while len(rawData) == 0 and self.shutdown == False:
        rawData = conn.readline()
except:
    some error handling code...
self.plugin.conn = Serial(..., timeout = 1)
...
if not self.shutdown:
    rawData = self.plugin.conn.read(1)
    if rawData:
        rawData += self.plugin.conn.read(self.plugin.conn.inWaiting())
    else:
        raise Exception("timeout")

我不确定我是否正确理解了您的意图,因此您可能需要调整…

您的CPU使用率被固定的事实可能表明readline调用没有阻塞到超时,但会立即返回。所以如果你的正常超时 是2,您可以使用:

from time import time

try:
    while len(rawData) == 0 and self.shutdown == False:
        before = time()  
        rawData = conn.readline()
        if (len(rawData)==0) and ((time()-before)<2):
              raise Exception("Early readline return.")
except:
    some error handling code...
从时间导入时间
尝试:
当len(rawData)==0且self.shutdown==False时:
before=时间()
rawData=conn.readline()

如果(len(rawData)==0)和((time()-before)可以找到很好的解决方案:


Readline适用于此应用程序,因为传入记录的长度不同,但所有记录都\n终止。如果捕获错误的唯一方法是一次读取字符并以这种方式构建字符串,我想它可以工作……但这似乎是不必要的工作。但是,问题是不会引发异常,因此,错误捕获g不起作用。我测试了这种方法,但仍然得到了相同的结果。没有错误。啊,当然我忘了提到必须设置读取超时:
Serial(…,timeout=1)
pyserial或底层套接字模块似乎有问题。但是,当远端退出时,pyserial肯定不会报告错误。我将提交错误报告。