I have the following python code that expects data coming from the serial port, and writes it to a file.
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
It works to an extent, as after some time, it starts to hang, bringing the CPU all the way up, and not writing anything (or sometimes writing only pieces of text) to the .log file.
The process here is pretty intensive, as my serial port will be writing an 8 bytes string every second, and this python script is supposed to then receive it, and write its contents to the log file.
I’m thinking the problem here is the fact that I’m opening and closing the file too much, and this is somehow making the whole process slow. I’m no python wizz, so any help or advice on improving this code would be greatly appreciated.
Thanks in advance,
I think the problem here is that you are polling for updates.
Python’s
serial.read()function actually blocks the current thread until something becomes readable on the thread, until timeout. What you should do, therefore, is break out another thread to handle serial IO. Have it loop indefinitely, checking a condition (the master thread wants you to stay listening and the serial port is still available). This thread will do something like:Then, when you want it to exit, your master thread sets
thisthread_should_keep_doing_this=Falseand when your slave thread has finished reading, it kills itself.Two things:
See http://pyserial.sourceforge.net/examples.html#miniterm