• 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('输入数据:
    ')
                    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

     以下就是该安全的操作。

    如有问题,可关注微信公众号进行咨询!

  • 相关阅读:
    森田疗法
    “不支持一个STA线程上针对多个句柄的WaitAll。”的解决方案
    烽火HG226信息
    祝贺小牛队得NBA总冠军
    .net4调用非托管代码出现:PInvoke调用导致堆栈不对称
    大怪路子逻辑
    C#内存复制与比较
    【收藏】UDP广播和多播
    Objectivec NSString
    Objectivec NSDictionary(NSMutableDictionary)
  • 原文地址:https://www.cnblogs.com/ubuntu1987/p/12174994.html
Copyright © 2020-2023  润新知