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'
它表明rxtemp1
和rxtemp2
變量是正確的(它們收集的標誌和控制字節),因此收集信息的rxData
變量似乎是正確的。
但是,GUI立即凍結,我必須殺死這個過程。
什麼是造成此錯誤?
複製並越過調試器輸出。屏幕截圖是不可取的,但肯定比屏幕上的圖片更好。 –
在IDE /調試器(即在控制檯或命令窗口中)運行代碼*外*時是否發生同樣的問題? – ekhumoro
@JonathonReinhart我用代碼 – thoraz