一年前,我需要一个脚本来捕获来自串行设备的输入并将其发送到网络浏览器。 (博物馆中 3D 打印的埃及平板电脑上连接的触摸传感器。)我最初打算使用 Perl,但由于它不起作用,而且距离发布只有几个小时,所以我选择了 Python(我不是python 开发)。我制作了一个运行良好的脚本,并且已经运行了一段时间,唯一的问题是该脚本使用 100% CPU。如何让 Python 在不使用整个 CPU 的情况下从串行端口读取数据,同时无论何时按下输入仍然保持响应?
我的脚本如下:
#!/usr/bin/python
import time
import serial
import sys
from subprocess import call
import traceback
myport = 0
ser = serial.Serial()
def readkey():
while 1:
out = '';
while ser.inWaiting() > 0:
out += ser.read(1);
if out != '\xf8' and out != '\xf9':
call(["xdotool", "key", "F8"])
call(["xdotool", "type", str(ord(out))])
call(["xdotool", "key", "F9"])
out = ''
def main_sys():
global ser
print "Opening Stela serial port"
ser.open();
ser.isOpen();
print "Starting Stela subsystem"
while 1:
try:
readkey()
break
except Exception as e:
print "caught os error".format(e)
time.sleep(1)
main_sys()
def init():
global ser
global myport
while 1:
try:
theport = '/dev/ttyACM'+str(myport)
print "Trying " + theport
ser = serial.Serial(
port=theport,
baudrate=115200,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS
)
main_sys()
break;
except Exception as e:
traceback.print_exc()
myport += 1
if myport > 5:
myport = 0
time.sleep(1)
init()
init()
最佳答案
在 readKey
循环末尾添加一个短暂的 time.sleep
。它将让其他进程运行。
此外,请注意 call
会阻塞,直到操作完成。
关于python 串行 100% cpu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21985090/