文件的多次写入

0 投票
2 回答
566 浏览
提问于 2025-04-16 07:44

我有一段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不是很精通,所以如果有人能给我一些改进这段代码的建议,我会非常感激。

提前谢谢大家,

2 个回答

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

我对休眠这个部分也不太确定;其实你可以直接在读取数据的时候等着,直到数据可用。

我想了一下,虽然我不太了解串口类里有哪些方法,但我觉得主要的循环应该尝试从串口设备读取数据。如果没有数据可以读取,就在那儿等着,只有当输入方法告诉你没有更多数据时,才结束循环——比如设备被关闭了,或者出现了其他故障。

0

我觉得这里的问题是你在不停地检查更新。

Python的 serial.read() 函数会让当前的程序停下来,直到有数据可以读取,或者超时。因此,你应该开一个新的线程来处理串口输入输出。这个线程可以一直循环,检查一个条件(主线程希望它继续监听,并且串口仍然可用)。这个线程的工作大概是这样的:

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

撰写回答