等待串口读取的性能如何?

时间:2015-10-05 17:25:54

标签: python performance cpu-usage cpu-speed

我编写了一个小的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()

1 个答案:

答案 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()