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

 

 以下就是该安全的操作。

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

posted @ 2020-01-10 10:44  Ubuntu1804  阅读(2145)  评论(0编辑  收藏  举报