我有以下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,所以任何有关改进此代码的帮助或建议都将非常感激。
提前致谢,
答案 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
,当你的从属线程完成读取时,它会自行终止。
两件事: