python 串行 100% cpu

标签 python serial-port pyserial

一年前,我需要一个脚本来捕获来自串行设备的输入并将其发送到网络浏览器。 (博物馆中 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/

相关文章:

Python dir(dict) 与 dir(dict.__class__)

python - AttributeError: 'MyGrid' 对象没有我的函数的属性

java - 使用 Java 检测串行 COM 端口

python - 如何解析从pyserial接收的json字符串?

python - 为什么serial.tools在os.system中可用而不是在os.system中可用?

python - 使用 mysql 数据库配置 apache 超集

python - Python 中最小的负整数

c# - 将字符串变量写入字节数组的一个字节,例如bytes [6] =“c6”

C# 'SerialPort' 不包含采用 6 个参数的构造函数

python - pyserial:没有名为工具的模块