在pyserial中使用超时阻塞read(1)

时间:2015-06-18 22:21:14

标签: python serial-port blocking flags pyserial

我使用以下代码读取串口,直到我得到一个终止字符。

"""Read until you see a terminating character with a timeout"""
    response=[]
    byte_read=''
    break_yes=0
    time_now = time.clock()
    while ((not (byte_read=='\r') ) and (break_yes==0)):
        byte_read = self.ser.read(1)
        if (not(len(byte_read)== 0) and (not (byte_read =='\r'))):
            response.append(byte_read)
        if ( time.clock() - time_now > 1 ):
            if self.DEBUG_FLAG: 
                print "[animatics Motor class] time out occured. check code"
            break_yes=1
    if break_yes==0:
        return ''.join(response)
    else:
        return 'FAIL'

这很好但是由于while循环,cpu资源被占用了。

我认为使用超时阻塞读取(1)将节省一些cpu。 我在寻找C的旗帜是“MIN == 0,TIME> 0(超时读取)”在termios中

我正在寻找Python中的类似标志。

我也可以使用io.readline读取直到我得到'\ r',但我想尽可能地坚持pyserial而没有任何其他依赖。

非常感谢建议。如果我也应该以完全不同的方式做到这一点,请告诉我。

谢谢,

2 个答案:

答案 0 :(得分:0)

你应该阅读Pyserial的文档:它清楚地表明,当你将它传递给构造函数时,超时为0会打开非阻塞行为:

http://pyserial.sourceforge.net/pyserial_api.html#classes

只需摆脱超时参数,就应该设置。

答案 1 :(得分:0)

Aight,所以我发现了一个方法。我没有使用no timeout进行轮询,而是在python中使用select模块,这类似于C中的模块。

如果有任何数据立即可用,或者等待超时时间并退出,则返回,这正是我想要的。我采取了deets注释来清理代码,现在看起来就是这样。

def readOnly(self):
"""Read until you see a terminating character with a timeout"""
    response=[]
    byte_read=''
    while (not (byte_read=='\r')):
        reading,_,_ = select.select([self.ser], [], [], 1) #returns immediately if there is data on serial port. waits 1 second to timeout if not.
        if reading !=[]:                                   #something is to be read on the file descriptor
            byte_read = self.ser.read(1)
            if (byte_read !='\r'):
                response.append(byte_read)
            else:                                          #'\r' received
                return ''.join(response)
                break
        else:
            if self.DEBUG_FLAG: 
                print "[Motor class] time out occured. check code"
            return 'FAIL'
            break

`

这将CPU使用率从50%降低到5%,因此现在生活得更好。

谢谢,