32.python3用串口在两个进程中同时读写(案例二)
程序代码如下:
import serial,threading,time class SerThread(): def __init__(self,portx): # 初始化串口 self.my_serial=serial.Serial() self.my_serial.port=portx self.my_serial.baudrate=9600 self.my_serial.timeout=1 fname=time.strftime('%Y%m%d') # blog名称为当前时间 self.rfname='r'+fname # 接收blog名称 self.sfname='s'+fname # 发送blog名称 self.waitEnd=None # 设置线程事件变量 self.alive=False # 设置条件变量 def start(self): # 打开串口并创建blog文件 self.my_serial.open() # 打开串口 self.rfile=open(self.rfname,'w') # 创建接收文件 self.sfile=open(self.sfname,'w') # 创建发送文件 if self.my_serial.isOpen(): self.waitEnd=threading.Event() # 将线程事件赋值给变量 self.alive=True # 改变条件变量值 self.thread_read=threading.Thread(target=self.Reader) # 创建一个读取串口数据的线程 self.thread_read.setDaemon(True) # 调用线程同时结束的函数 self.thread_send=threading.Thread(target=self.Sender) # 创建一个发送串口数据的线程 self.thread_send.setDaemon(True) # 调用线程同时结束的函数 self.thread_read.start() # 启动读数据线程 self.thread_send.start() # 启动写数据线程 return True # 如果串口打开了,就返回True else: return False #如果串口未打开,就返回False def Reader(self): while self.alive: # 当条件变量为True时执行 try: time.sleep(0.01) # 此处最好设置一个暂停时间,为了上串口发过来的数据缓存到接收缓存区 n=self.my_serial.inWaiting() # 将接收缓存区数据字节数保存在变量n中 data='' if n: data=self.my_serial.read(n).decode('gbk') # 读取接收缓存区的数据并解码 print('recv'+' '+time.strftime('%Y-%m-%d %X')+' '+data.strip()) # 将接收到的数据打印出来 print(time.strftime('%Y-%m-%d %X:')+data.strip(),file=self.rfile) # 将打印的内容写入到文件中 if len(data)==1 and ord(data[len(data)-1])==113: # 根据输入的'q'来退出程序 break except Exception as ex: print(ex) self.waitEnd.set() # 改变线程事件状态为True,即唤醒后面的程序 self.alive=False # 改变条件量为False def Sender(self): while self.alive: try: snddata=input('输入数据:\n') self.my_serial.write(snddata.encode('gbk')) print('sent'+' '+time.strftime('%Y-%m-%d %X')) print(snddata,file=self.sfile) except Exception as ex: print(ex) # 此两行代码是不用写的,因为前面我们用了self.thread_send.setDaemon(True)代码, # 其只要一个线程结束,另的线程也会结束 # self.waitEnd.set() # self.alive=False def waiting(self): # 等待event停止标志 if not self.waitEnd is None: self.waitEnd.wait() # 改变线程事件状态为False,使线程阻止后续程序执行 # 关闭串口、保存文件 def stop(self): self.alive=False if self.my_serial.isOpen(): self.my_serial.close() self.rfile.close() self.sfile.close() if __name__ == '__main__': ser=SerThread('com1') try: if ser.start(): ser.waiting() ser.stop() else: pass except Exception as ex: print(ex) if ser.alive: ser.stop() print('End OK.') del ser
完成以上代码之后运行,然后打开串口助手com2
以下就是该安全的操作。
如有问题,可关注微信公众号进行咨询!