为了使用python操作串口,首先需要下载相关模块: 1. pyserial http://pyserial.wiki.sourceforge.net/pySerial) 2. pywin32 (http://sourceforge.net/projects/pywin32/)
#coding=gb18030 import sys,threading,time import serial import binascii,encodings import re import socket from struct import * class ComThread: def __init__(self, Port=0): self.l_serial = None self.alive = False self.waitEnd = None self.port = Port def waiting(self): if not self.waitEnd is None: self.waitEnd.wait() def SetStopEvent(self): if not self.waitEnd is None: self.waitEnd.set() self.alive = False self.stop() def start(self): self.l_serial = serial.Serial(); self.l_serial.port = self.port self.l_serial.baudrate = 9600 self.l_serial.timeout = 2 self.l_serial.open() if self.l_serial.isOpen(): self.waitEnd = threading.Event() self.alive = True self.thread_read = None self.thread_read = threading.Thread(target=self.FirstReader) self.thread_read.setDaemon(1) self.thread_read.start() return True else: return False def FirstReader(self): while self.alive: # 接收间隔 time.sleep(0.1) try: data = '' n = self.l_serial.inWaiting() if n: data = data + self.l_serial.read(n) for l in xrange(len(data)): print '%02X' % ord(data[l]), # 发送数据 snddata = '' snddata += chr(97) tt = 0x12345678 snddata += pack('i', tt) snddata += chr(0x64) self.l_serial.write(snddata) # 判断结束 if len(data) > 0 and ord(data[len(data)-1])==0x45: #pass break except Exception, ex: print str(ex) self.waitEnd.set(); self.alive = False def stop(self): self.alive = False self.thread_read.join() if self.l_serial.isOpen(): self.l_serial.close() #测试用部分 if __name__ == '__main__': rt = ComThread() try: if rt.start(): rt.waiting() rt.stop() else: pass; except Exception,se: print str(se) if rt.alive: rt.stop() print '' print 'End OK .' del rt