2

我将 PySerial 与集成电路板 (ICB) 结合使用,以持续监控多个红外 (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 流控制(对象内部缓冲区可能会在从不读取时吃掉所有内存)。

我不知道 RFC 2217 是什么,但我知道我正在以某种方式泄漏内存。

我真的很感激任何意见。我在正确的轨道上吗?还是我的脚本内存使用过多的其他原因?

当然,如果他们帮助您帮助我,我很乐意进一步解释任何细节:)

4

0 回答 0