2012-11-26 65 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 

您好,我試圖實現一個串口和使用套接字在Python 2.7讀寫編程的SerialPort使用昂貴的CPU

rxThread死了,一個AIR應用程序之間的橋樑socketThread將能夠關閉套接字和串行端口,因爲客戶端套接字已死亡。但是在關閉所有腳本之前,腳本需要等待從串口讀取數據。

如果我嘗試使用timeout=0,CPU使用率會增加到100%。如果我嘗試使用timeout=None但使用COM.isWaiting(),我將得到相同的問題(100%的CPU)

如何知道套接字是否以其他方式關閉?

+0

如果我認爲您想從兩個來源讀取,我是否理解得很好? – jary

回答

1

如果你需要從兩個來源閱讀,你可以愉快地與select()做。在這種情況下你不需要線程。 select阻塞,直到有一個或多個資源可用,然後返回可用資源集,以便每個資源都可以作出反應。請注意,selectfile descriptors一起使用,您可能需要將其放入nonblocking mode