我使用以下代码读取串口,直到我得到一个终止字符。
"""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而没有任何其他依赖。
非常感谢建议。如果我也应该以完全不同的方式做到这一点,请告诉我。
谢谢,
答案 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%,因此现在生活得更好。
谢谢,