2015-10-05 87 views
1

我已经写了一个小的COM重定向和克隆python脚本,将采取物理串行端口的输入,然后将它们输出到两个虚拟串行端口(其中一个是只读的)。等待串口读取的性能?

问题是我一直注意到使用这个脚本利用了大量的CPU,大约50%,并且我发起的唯一的其他应用程序是socat来创建虚拟端口。

有什么我可能会丢失或查看,这可能会导致CPU使用率下降,而不会引入任何超时。

我正在使用基于Debian的Raspian OS的Raspberry Pi。

代码:

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

为什么重定向串口而不是直接连接它们?你打算解析还是注入数据? – John

回答

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