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