PYTHON:串行读取冻结GUI

时间:2017-07-28 12:48:52

标签: python pyqt5

我正在使用PyQt5和PyCharm IDE为我的一个系统实现GUI,它通过串行接口进行通信。当我发送适当的命令时,系统启动数据流,其数据包定义如下:

| 0x01 | 0x00 | 0x00 | 0x02 | [...32 bytes...] | 0x03 |

第一个,第四个和最后一个字节只是标记,第二个和第三个是控制字节,剩下的32个字节是信息。

当我启动流时,系统会收到命令,但GUI会冻结。所以我开始调试监视存储传入值的变量。

简化代码是

def main():
app = QtGui.QApplication(sys.argv)

main = MainWindow()
main.show()
# app.connect(notifier, SIGNAL('activated(int)'), Update)

timer = QtCore.QTimer()
timer.timeout.connect(main.Update)
timer.start(2)

app.exec_()

def Update(self):
    if self.read == True:
        self.datain = self.SerPort.Take()
        # if self.datain == None:
        #     pass
        # else:
        self.dataList = list(self.datain)
        self.disp_chan_1.setText('%f' % (self.dataList[0] * 0.000535434481))
        self.disp_chan_2.setText('%f' % (self.dataList[1] * 0.000535694653))
        self.disp_chan_3.setText('%f' % (self.dataList[2] * 0.000537407175))
        self.disp_chan_4.setText('%f' % (self.dataList[3] * 0.000534853598))
        self.disp_chan_5.setText('%f' % (self.dataList[4] * 0.000536425262))
        self.disp_chan_6.setText('%f' % (self.dataList[5] * 0.000536408834))
        self.disp_chan_7.setText('%f' % (self.dataList[6] * 0.000536337893))
        self.disp_chan_8.setText('%f' % (self.dataList[7] * 0.000536237792))
    else:
        pass

def Take(self):
    rxtemp1 = self.ser.read(4)
    rxData = self.ser.read(32)
    rxtemp2 = self.ser.read(1)
    value = struct.unpack('f'*4, rxData)
    return value

并且这些变量的调试器输出为

rxData = {bytes}b'\xf2\xa4\xe7=\xc0Y\xc4=\xdc\x15\xdc=\xae\xf2\xed=\x9ai;>\xff\xc3\xfe=\xab\x0e\x13>\xebd:A'
rxtemp1 = {bytes}b'\x01\x00\x00\x02'
rxtemp2 = {bytes}b'\x03'

它显示rxtemp1rxtemp2变量是正确的(它们收集标记和控制字节),因此收集信息的rxData变量似乎是正确的。< / p>

但是GUI会立即冻结,我必须终止这个过程。

导致此错误的原因是什么?

1 个答案:

答案 0 :(得分:1)

我找到了解决方案。应用程序冻结,因为这一行

value = struct.unpack('f'*4, rxData)

在rxData中有32个字节,但上面的unpack命令需要4个4字节组,总共16个字节。 正确的命令是

value = struct.unpack('f'*8, rxData)

我没有看到输出消息错误,因为我的PyCharm设置错误。