2012-11-26 3 views
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 

안녕을 사용하여, 나는 시리얼 포트와 rxThread이이는 죽을 때 파이썬 2.7에읽기 및 쓰기 소켓-하여 SerialPort 비싼 CPU를

를 소켓을 사용하여 AIR 응용 프로그램 사이에 다리를 구현하려고 socketThread은 클라이언트 소켓이 죽어서 소켓과 직렬 포트를 닫을 수 있습니다. 그러나 스크립트는 직렬 포트에서 읽기를 기다렸다가 모두 닫아야합니다.

timeout=0으로 시도하면 CPU 사용량이 100 % 증가합니다. timeout=None으로 시도했지만 COM.isWaiting()을 사용하면 동일한 문제 (100 % CPU)가 발생합니다.

소켓이 다른 방법으로 닫혀 있는지 어떻게 알 수 있습니까?

+0

두 가지 출처에서 읽으 려한다고 생각하면 잘 압니까? – jary

답변

1

두 가지 출처에서 읽어야 할 경우 select()으로 행복하게 할 수 있습니다. 이 경우 스레드가 필요하지 않습니다. select은 하나 이상의 리소스를 사용할 수있을 때까지 차단 한 다음 사용할 수있는 리소스 세트를 반환하므로 각 리소스에 대해 반응 할 수 있습니다. selectfile descriptors과 함께 작동하므로 nonblocking mode에 입력해야 할 수 있습니다.