Skip to main content
 首页 » 编程设计

python之读写 Socket-SerialPort 使用昂贵的 CPU

2025年05月04日1252php

def threadSocket(Socket, port): 
    ''' 
    Thread encargado de sotener comunicacion entre Socket cliente y 
    el puerto serial asignado 
    Mientras se mantenga activo el thread de recepcion se intentara leer del 
    puerto serial y enviarlo al socket cliente 
    Se asume que socket y port son objetos vaidos validos 
    ''' 
    #Intenta abrir el puerto serial 
    try: 
        COM = serial.Serial(port-1) 
    except: 
        #Si esta en uso no se encuentra disponible, muestra error 
        print 'Error: Puerto COM'+str(port)+' no disponible' 
    else: 
        #Al conectarse se crea el thread de recepcion 
        print 'Conectado a puerto COM'+str(port) 
        rxThread = threading.Thread(target=rxThreadDef,args=(Socket,COM)) 
        rxThread.start() 
        dato = '' 
        #Mientras el thread este activo 
        while rxThread.isAlive(): 
            try: 
                #Lee del puerto serial y envia a Socket cliente 
                dato += COM.read() 
                if parserCOMToSocket(dato): 
                    Socket.send(dato) 
                    dato='' 
            except: 
                break 
        print "Puerto cerrado!" 
        #Cierra puerto Serial 
        COM.close() 
    #Cierra Socket 
    Socket.close() 
    #print "Hilo terminado" 
def rxThreadDef(Socket,COM): 
    ''' 
    Thread (Hilo) encargado de recibir la informacion del Cliente 
    y enviarla por medio del puerto serial 
    Si se genera algun error se rompe el ciclo y termina el thread 
    ''' 
    dato = '' 
    while 1: 
        try: 
            d = Socket.recv(1024) 
        except: 
            break 
        if d: 
            dato += d 
            if parserSocketToCOM(dato): 
                COM.write(dato) 
                print dato 
                dato = '' 
        else: 
            break 
 
def parserSocketToCOM(dato): 
    return True 
 
def parserCOMToSocket(dato): 
    return True 

您好,我尝试在 Python 2.7 中使用套接字在串行端口和 AIR 应用程序之间实现桥接

当 rxThread 死亡时,socketThread 将能够关闭套接字和串口,因为客户端套接字死了。但是脚本在关闭所有之前需要等待从串行端口读取。

如果我尝试使用 timeout=0,CPU 使用率会增长到 100%。如果我尝试使用 timeout=None 但使用 COM.isWaiting(),我会遇到同样的问题(100% 的 CPU)

我怎么知道套接字是否以其他方式关闭?

请您参考如下方法:

如果你需要从两个来源读取,你可以用select()愉快地完成。 .在那种情况下你不需要线程。 select 阻塞,直到一个或多个资源可用,然后返回可用资源集,因此您可以对每个资源使用react。请注意,select 与 file descriptors 一起使用你可能需要把它放在 nonblocking mode 中.