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 中.
