2017-07-28 51 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設置錯了。