2
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()同じ問題が発生します(CPUの100%)

ソケットが他の方法で閉じられているかどうかをどのように知ることができますか?

4

1 に答える 1

1

2 つのソースから読み取る必要がある場合は、 で問題なく実行できますselect()。その場合、スレッドは必要ありません。select1 つ以上のリソースが利用可能になるまでブロックし、利用可能なリソースのセットを返すので、それぞれに対応できます。はファイル記述子selectで動作し、ノンブロッキング モードにする必要がある場合があることに注意してください。

于 2013-01-06T10:49:27.387 に答える