【问题标题】:Preformance of waiting on a serial port read?等待串口读取的性能?
【发布时间】:2015-10-05 17:25:53
【问题描述】:

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

【问题讨论】:

  • 为什么要重定向串口而不是直接连接它们?您是否打算解析或注入数据?

标签: python performance cpu-usage cpu-speed


【解决方案1】:

您编写的代码不断读取串行端口。这种不断的读任务就不需要占用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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 2015-10-08
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多