多次写入文件

时间:2010-11-28 22:18:41

标签: python io serial-port

我有以下python代码,它希望数据来自串口,并将其写入文件。

import time
import serial

def write_log ( text ):
    f = open('logger.log', 'a')
    f.write( text )
    f.close()

ser = serial.Serial()
ser.port = "/dev/ttyS0"
ser.baudrate = 4800
ser.open()
if ser.isOpen():
    while 1:
        while ser.inWaiting() <= 0:
            time.sleep(1)
            response = ser.read(ser.inWaiting())
            if len ( response ):
                write_log( response )
                print response

它在一定程度上起作用,因为经过一段时间后,它开始挂起,使CPU一直向上,而不是写任何东西(或者有时只写一些文本)到.log文件。

这里的过程非常密集,因为我的串口将每秒写一个8字节的字符串,然后这个python脚本应该接收它,并将其内容写入日志文件。

我认为这里的问题是我打开和关闭文件过多的事实,这在某种程度上使整个过程变得缓慢。我不是python wizz,所以任何有关改进此代码的帮助或建议都将非常感激。

提前致谢,

2 个答案:

答案 0 :(得分:1)

您的代码中存在无限循环,并且在出现问题时不会突然出现 - 或者串行设备不再打开。

可能使用:

while ser.isOpen():
    while ser.inWaiting() <= 0:
        time.sleep(1)
        response = ser.read(ser.inWaiting())
        if len(response):
            write_log(response)
            print response

甚至:

while ser.isOpen() && ser.inWaiting() <= 0:
    time.sleep(1)
    response = ser.read(ser.inWaiting())
    if len(response):
        write_log(response)
        print response

我也不确定睡眠;只需等待读取数据就可以了。

在我考虑它时,不知道串行类中可用的方法,我认为主循环应该尝试从串行设备读取的越多,如果当前没有任何可用的东西,则快乐地挂起,并且仅在输入法表示没有更多输入 - 设备已经关闭,或者以某种方式失败。

答案 1 :(得分:0)

我认为这里的问题是您正在轮询更新。

Python的serial.read()函数实际上阻塞当前线程,直到线程上的某些东西变得可读,直到超时。因此,您应该做的是打破另一个处理串行IO的线程。让它无限循环,检查一个条件(主线程希望你保持监听,串口仍然可用)。该主题将执行以下操作:

while ser.isOpen() && thisthread_should_keep_doing_this:
    response = ser.read(ser.inWaiting())
    if len(response):
        write_log(response)
        print response

然后,当你希望它退出时,主线程设置thisthread_should_keep_doing_this=False,当你的从属线程完成读取时,它会自行终止。

两件事:

  • 相对频繁地进行读取超时。
  • 不要“远程杀死”线程。传递一条消息让它自杀。远程杀死线程造成了可怕的混乱。

请参阅http://pyserial.sourceforge.net/examples.html#miniterm