我编写了一个小的COM重定向和克隆python脚本,它将接受物理串行端口的输入,然后将它们输出到两个虚拟串行端口(其中一个是只读的)。
问题是我注意到使用这个脚本使用了大量的CPU,大约50%,并且我启动的唯一其他应用程序是socat来制作虚拟端口。
是否有任何我可能丢失或查看的内容,可能会降低CPU使用率,而不会引入任何类型的超时。
我正在使用Raspberry Pi,使用基于debian的Raspian操作系统。
代码:
import serial, threading, sys
def transferData(serialIn, serialOutA, serialOutB):
data = serialIn.read(1024)
if data:
serialOutA.write(data)
serialOutB.write(data)
def main():
serialIn = serial.Serial(port = sys.argv[1], timeout=0, baudrate = 19200, parity=serial.PARITY_NONE, bytesize=serial.EIGHTBITS, stopbits=serial.STOPBITS_ONE)
serialOutA = serial.Serial(port = sys.argv[2], timeout=0, baudrate = 19200, parity=serial.PARITY_NONE, bytesize=serial.EIGHTBITS, stopbits=serial.STOPBITS_ONE)
serialOutB = serial.Serial(port = sys.argv[3], timeout=0, baudrate = 19200, parity=serial.PARITY_NONE, bytesize=serial.EIGHTBITS, stopbits=serial.STOPBITS_ONE)
while True:
transferData(serialIn, serialOutA, serialOutB)
transferData(serialOutA, serialIn, serialOutB)
if __name__ == '__main__':
main()
答案 0 :(得分:0)
您编写的代码不断读取串口。使用此常量读取任务不需要占用cpu。根据while循环中的延迟要求添加sleep
,以允许其他进程获取cpu。
import serial, threading, sys, time
def transferData(serialIn, serialOutA, serialOutB):
data = serialIn.read(1024)
if data:
serialOutA.write(data)
serialOutB.write(data)
def main():
serialIn = serial.Serial(port = sys.argv[1], timeout=0, baudrate = 19200, parity=serial.PARITY_NONE, bytesize=serial.EIGHTBITS, stopbits=serial.STOPBITS_ONE)
serialOutA = serial.Serial(port = sys.argv[2], timeout=0, baudrate = 19200, parity=serial.PARITY_NONE, bytesize=serial.EIGHTBITS, stopbits=serial.STOPBITS_ONE)
serialOutB = serial.Serial(port = sys.argv[3], timeout=0, baudrate = 19200, parity=serial.PARITY_NONE, bytesize=serial.EIGHTBITS, stopbits=serial.STOPBITS_ONE)
while True:
transferData(serialIn, serialOutA, serialOutB)
transferData(serialOutA, serialIn, serialOutB)
time.sleep(1)
if __name__ == '__main__':
main()