2017-07-28 59 views
0

我正在用PyQt5和PyCharm IDE实现一个GUI,用于通过串行接口进行通信的其中一个系统。当我发送适当的命令时,系统开始象以下定义的数据包的数据流:PYTHON:串行读取冻结图形用户界面

| 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变量似乎是正确的。

但是,GUI立即冻结,我必须杀死这个过程。

什么是造成此错误?

+0

复制并越过调试器输出。屏幕截图是不可取的,但肯定比屏幕上的图片更好。 –

+0

在IDE /调试器(即在控制台或命令窗口中)运行代码*外*时是否发生同样的问题? – ekhumoro

+0

@JonathonReinhart我用代码 – thoraz

回答

1

我找到了解决方案。应用冻结因为该行

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

在RXDATA有32个字节,但上面的unpack命令想要4组的4个字节,在所有16个。 正确的命令是

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

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