我正在使用PySerial与集成电路板(ICB)一起持续监控几个红外(IR)发射器/传感器单元的状态(即检查IR光束是否断裂或清除),我的程序似乎大约一天后通过电脑的记忆吃。我怀疑这与PySerial有关,但我不确定。
一些项目背景:我有三个标记为1,2和3的红外发射器/传感器单元。如果没有任何一个光束损坏,ICB通过串行连接输出字符串'0'。如果单元1上的光束断开,则输出字符串“1”,单元2输出“2”,依此类推。假设在任何时间点只能打破一个光束是安全的。我已经将ICB编程为每1/10秒输出一个字符串值(0,1,2或3)。
通过以下代码,我使用PySerial读取ICB输出,并使用PyGame将每个波束断开的时间记录到最大时间(所有在Python 2.7中):
import pygame, serial
def breakLoop(cumulative_break_time, max_cumulative_break_time, ser, is_beam_broken_org):
elapsed_break_time = 0.
clock.tick() #Start clock.
while (cumulative_break_time + elapsed_break_time < max_cumulative_break_time):
ser.flushInput()
is_beam_broken = int(ser.read(1))
if is_beam_broken == is_beam_broken_org:
elapsed_break_time += clock.tick()/1000.
else:
break
cumulative_break_time += elapsed_break_time
return cumulative_break_time, elapsed_break_time
#Initialize objects and constants
ser = serial.Serial()
ser.baudrate = 115200
ser.port = 'COM3'
ser.open()
clock = pygame.time.Clock()
max_cumulative_break_time = 900.
cumulative_break_time = 0.
out_file = open('test.csv','w')
while cumulative_break_time < max_cumulative_break_time: #Enter main event loop.
ser.flushInput()
is_beam_broken = int(ser.read(1))
if is_beam_broken:
print 'Beam %s broken.' % is_beam_broken
cumulative_break_time, elapsed_break_time = breakLoop(cumulative_break_time, max_cumulative_break_time, ser, is_beam_broken)
print 'Beam %s un-broken.' % is_beam_broken
print 'Elapsed break time was: ', elapsed_break_time, ' s'
print 'Cumulative break time is now: ', cumulative_break_time, ' s'
print''
out_file.write(','.join([str(is_beam_broken),str(elapsed_break_time)]) + '\n')
out_file.flush()
out_file.close()
ser.close()
print '\n\nDone! Press any key to quit.'
raw_input('')
现在,代码运行正常,但是当我让它运行一天左右时,我得到一个“内存不足”错误。我猜这与PySerial有关,因为我不断地从ICB读取输入...也许是因为我总是刷新串行缓冲区?我不认为刷新内存内容使相同的内存不可用...
另外,我阅读了PySerial的文档并遇到了这一行:
尚未实现/实现可能出现的问题:客户端和服务器之间的RFC 2217流控制(对象内部缓冲区在未读取时可能占用所有内存)。 < / p>
我不知道RFC 2217是什么,但我知道我在某种程度上泄漏了内存。
我真的很感激任何意见。我是在正确的轨道上吗?或者是否有其他原因导致我的脚本内存使用过多?
当然,如果有任何细节可以帮助我帮助我,我很乐意进一步解释:)