Cómo escribir un programa de comunicación serie en Python
Utilizo el método "round-robin de subprocesos".
Después de abrir el puerto serie, inicie un hilo para monitorear los datos entrantes del puerto serie. Cuando haya datos, realice el procesamiento de datos (también puede enviar un evento y transportar los datos recibidos).
No utilicé nada demasiado profundo en el procesamiento del puerto serie.
No puedo darte el programa original del cliente, pero lo modificaré por ti.
Algunas de las cosas que contiene se han procesado antes de que pueda ejecutarse, es posible que deba modificarlas usted mismo y eliminar las cosas inútiles.
Ya no tengo un dispositivo de puerto serie aquí y no puedo ajustarlo. Puedes manejarlo tú mismo, pero las cosas básicas ya están ahí.
============================================ = ======================
#coding=gb18030
importar sistema, subprocesamiento, tiempo ; p >
importar serie;
importar binascii,codificaciones;
importar re
importar socket
clase ReadThread:
def __init__(self, Salida=Ninguno, Puerto=0, Registro=Ninguno, i_FirstMethod=True):
self.l_serial = Ninguno
self; vivo = Falso;
self.waitEnd = Ninguno;
self.bFirstMethod = i_FirstMethod
self.sendport = ''; p >self.log = Registro;
self.output = Salida;
self.port = Puerto
self.re_num = Ninguno; >
def esperando(self):
si no, self.waitEnd es Ninguno:
self.waitEnd.wait();
def SetStopEvent( self ):
si no, self.waitEnd es Ninguno:
self.waitEnd.set()
self.alive = False
;self.stop();
def inicio(self):
self.l_serial = serial.Serial();
self.l_serial. puerto = self.port;
self.l_serial.baudrate = 9600;
self.l_serial.timeout = 2
self.re_num = re.compilar; ( '\d');
intenta:
si no, self.output es Ninguno:
self.output.WriteText(u'Abrir puerto de comunicación\ r \n');
si no, self.log es Ninguno:
self.log.info(u'Abrir puerto de comunicación'); l_serial.open();
excepto excepción, por ejemplo:
if self.l_serial.isOpen():
self.l_serial.close();
self.l_serial = Ninguno;
si no, self.output es Ninguno:
self.output.WriteText(u'Error:\r\n % s \r\n' % ex);
si no, self.log es Ninguno:
self.log.error(u'%s' % ex
devuelve Falso;
si self.l_serial.isOpen():
si no, self.output es Ninguno:
self.output.WriteText( u'Crear una tarea de recepción\r\n');
si no, self.log es Ninguno:
self.log.info(u'Crear una tarea de recepción');
si no, self.log es Ninguno:
self.log.info(u'Crear una tarea receptora'); .waitEnd = threading.Event();
self.alive = True;
self.thread_read = Ninguno
self. target=self.FirstReader);
self.thread_read.setDaemon(1);
self.thread_read.start()
return True; p>
else:
si no, self.output es Ninguno:
self.output.WriteText(u'el puerto de comunicación no está abierto\r\ n'); /p>
si no, self.log es Ninguno:
self.log.info(u'El puerto de comunicación no está abierto');
return False ; p>
def InitHead(self):
#Otro procesamiento del puerto serie
prueba:
time.sleep(3)
; p>
si no, self.output es Ninguno:
self.output.WriteText(u'La tarea de recepción de datos comienza a conectarse a la red\r\n'); p >si no, self.log es Ninguno:
self.log.info(u'La tarea de recepción de datos comienza a conectarse a la red');
self.l_serial.flushInput(
p>self.l_serial.write('\x11');
datos1 = self.l_serial.read(1024
excepto ValueError); ,ej:
si no self.output es Ninguno:
self.output.WriteText(u'Error: \r\n %s\r\n' % ex);
si no, self.log es Ninguno:
self.log.error(u'%s' % ex
self.SetStopEvent();
return;
si no, self.output es Ninguno:
self.output.WriteText(u'comienza a recibir datos\r\n'); /p>
si no, self.log es Ninguno:
self.log.info(u'comienza a recibir datos');
self.output.WriteText(u'); ====== =============================\r\n'); EnviarDatos(self, i_msg) :
lmsg = '';
estáOK = Fa
lse;
if isinstance(i_msg, unicode):
lmsg = i_msg.encode('gb18030');
de lo contrario:
lmsg = i_msg;
intenta:
#Enviar datos al componente de procesamiento correspondiente
pasar
excepto excepción, por ejemplo:
pasar;
return isOK;
def Primer Lector(self):
datos1 = ''; isQuanJiao = Verdadero;
isFirstMethod = Verdadero;
isEnd = Verdadero
readCount = 0
saveCount = 0; p>
isEnd = True;
saveCount = 0;
p>
RepPos = 0
#leer contenido de información principal ; p>
self.InitHead();
mientras self.alive:
prueba:
datos = ''; >n = self.l_serial.inWaiting();
si n:
datos = datos + self.l_serial.read(n); binascii.b2a_hex(datos),
para l en xrange(len(datos)):
p>
if ord(datos[l])==0x8E:
isQuanJiao = Verdadero;
continuar;
if ord(data[l ])==0x8F:
isQuanJiao = Falso; /p>
continuar;
si ord(datos[l]) == 0x80 o ord(datos[l ]) == 0x00:
si len(datos1) >10:
si no self.re_num.search(data1,1) es Ninguno:
saveCount = saveCount + 1
if RepPos==0; :
RepPos = self.output.GetInsertionPoint();
self.output.Remove(RepPos ,self.output.GetLastPosition();
self); .SendData(data1);
data1 = '';
continuar;
excepto excepción, por ejemplo:
si no es uno mismo. el registro es Ninguno:
self.log.error(u'%s' % ex
self.waitEnd.set();
self. vivo = Falso;
def stop(self):
self.alive = Falso
p>
self.thread_read.join();
si self.l_serial.isOpen():
self.l_serial.close()
si no, self.output es Ninguno:
self.output.WriteText(u'Cerrar puerto de comunicación: [%d] \r\n' % self.port);
si no, self.log es Ninguno:
self.log.info(u'Cerrar puerto de comunicación: [%d]' % self.port
<); p>def printHex(self, s):s1 = binascii.b2a_hex(s);
print s1;
#Parte de prueba
if __name__ == '__main__':
rt = ReadThread()
f = open("sendport.cfg", "r")
p>
rt.sendport = f.read()
f.close()
prueba:
si rt.start() :
rt.waiting();
rt.stop();
de lo contrario:
pasar; p> excepto excepción, se:
print str(se);
if rt.alive:
rt.stop(); p> imprimir 'Fin Aceptar.';
del rt;