实现单片机通过传感器获取信息,并且将信息通过wifi模块发送信息给PC端,并在pyqt5界面上显示(PC端部分)

Q1:PC如何接收到wifi模块发送过来的信息?
A1:可以通过python的socket模块,在某个端口建立服务器监听信息,当然发送和监听的端口号要一致。
Q2:如何将数据在界面上显示?
A2:pyqt5模块可以很好上手开发一些简单的小应用,可以将数据在上面显示,自学一天就好了。
Q3:为什么单片机发送过来的数据跟我想要的不一致?
A3:单片机发送的是字节流,想要显示还要转码decode(‘utf-8’)
Q4:如何实现服务端一边监听和pyqt5界面一直刷新显示?
A4:可以用Qthread类开启子线程,在子线程中执行服务端监听,至于刷新显示可以有两种方法,一种是使用定时器中断,另一种是由子线程直接emit()发送信号。

定义子线程监听

class WorkThread(QThread):
    def __init__(self):
        super(WorkThread,self).__init__()
    def run(self):
        ip = '192.168.2.100'
        port = 9999

        global data_list
        #创建服务端
        serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        # 绑定ip端口号
        serversocket.bind((ip, port))  # ip也可以用Host代替

        # 最大连接数
        serversocket.listen(1)

        BUFSIZ = 1024       #最大读取字节数
        print("正在监听%s:%d" % (ip,port))
        while True:
            # 建立客户端连接,被动接受TCP客户端连接,(阻塞式)等待连接的到来
            clientsocket, addr = serversocket.accept()
            print("链接的客户端:%s" % str(addr))
            while True:
                try:
                    data = clientsocket.recv(BUFSIZ)  # 读取已链接客户的发送的消息,bufsiz是字节数
                except Exception:
                    print("断开的客户端", addr)
                    break
                print(type(data))
                print("客户端发送的内容:", data.decode('utf-8'))
                if not data:
                    break
                data_list = str(data.decode('utf-8')).split("=")
                msg = time.strftime("%Y-%m-%d %X")  # 获取结构化事件戳
                msg1 = '[%s]:温度 = %s°C  湿度 = %s%% 光照强度 = %sLX ' % (msg, data_list[0], data_list[1],data_list[2])
                print(msg1)
                time.sleep(1)
            clientsocket.close()  # 关闭客户端链接
        serversocket.close()

定义pyqt5界面

self.btnStart = QPushButton('开始监测')
        self.btnEnd = QPushButton('暂停监测')

        # 把控件放置在栅格布局中
        grid = QGridLayout()

        grid.setSpacing(10)

        grid.addWidget(temp, 1, 0)
        grid.addWidget(self.tempEdit, 1, 1)

        grid.addWidget(humi, 2, 0)
        grid.addWidget(self.humiEdit, 2, 1)

        grid.addWidget(light, 3, 0)
        grid.addWidget(self.lightEdit, 3, 1)

        grid.addWidget(review, 4, 0)
        grid.addWidget(self.reviewEdit, 4, 1,5,1)

        grid.addWidget(self.btnStart,10,1)
        grid.addWidget(self.btnEnd, 10, 2)

连接与槽函数:


        # 信号与槽函数的连接
        self.btnStart.clicked.connect(self.slotStart)
        #self.btnEnd.clicked.connect(QCoreApplication.instance().quit)   #这是直接退出
        self.btnEnd.clicked.connect(self.slotPause)
        self.show()
 def Mytimer(self):
        self.timer = QTimer(self)
        # 信号与槽函数的连接
        self.timer.timeout.connect(self.update)      #过一段时间timeout触发,执行update。触发可以用这种定时器触发,也可以用emit发送
        self.timer.start(1000)                      #启动或重新启动一个超时时间间隔为毫秒的定时器。控制窗口刷新延迟,有两种方案实现刷新数据,一种是这种定时器,另一种是由子线程直接emit()发送信号
    def update(self):
        try:
            self.tempEdit.setText(data_list[0] + '°C')    #py默认unicode编码,所以不用加u
            self.humiEdit.setText(data_list[1] + "%")
            self.lightEdit.setText(data_list[2] + "LX")
            msg = time.strftime("%Y-%m-%d %X")  # 获取结构化事件戳
            self.reviewEdit.setText("今天又是充满希望的一天呢,加油! \n \n \n %s" %(msg))
        except:
            pass
    def slotStart(self):
        self.btnStart.setEnabled(False)      #点击开始后进入不可点击状态
        self.Mytimer()                       #开启定时器开始更新数据

    def slotPause(self):
        self.timer.stop()                   #关闭定时器
        self.btnStart.setEnabled(True)      #打开按键使能

        #清空信息
        self.tempEdit.setText("")
        self.humiEdit.setText("")
        self.lightEdit.setText("")
        self.reviewEdit.setText("")

实现效果![在这里插入图片描述](https://img-blog.csdnimg.cn/20200622214531620.png?x-oss-process=image/wat
源码,之前没看到的消息,希望有用:https://pan.baidu.com/s/1DOKI72v7cRPjgGvM2RPWIw
提取码:c8t5

  • 10
    点赞
  • 109
    收藏
    觉得还不错? 一键收藏
  • 24
    评论
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值