我正在使用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'
它显示rxtemp1
和rxtemp2
变量是正确的(它们收集标记和控制字节),因此收集信息的rxData
变量似乎是正确的。< / p>
但是GUI会立即冻结,我必须终止这个过程。
导致此错误的原因是什么?
答案 0 :(得分:1)
我找到了解决方案。应用程序冻结,因为这一行
value = struct.unpack('f'*4, rxData)
在rxData中有32个字节,但上面的unpack命令需要4个4字节组,总共16个字节。 正确的命令是
value = struct.unpack('f'*8, rxData)
我没有看到输出消息错误,因为我的PyCharm设置错误。