User interface wxgui中串行通信的集成
这是我的wxpython GUI中的一个函数,用于生成随机值。我在GUI的panel类中添加了这个函数。我放置了一个wx.Bind函数,它为它分配一个计时器值,并定期刷新它,以便定期更改值 现在GUI需要进行串行通信,因为我需要获取传感器值并将它们输入到GUI屏幕中。因此,我找到了用于串行输入值的代码:User interface wxgui中串行通信的集成,user-interface,wxpython,pyserial,wxwidgets,User Interface,Wxpython,Pyserial,Wxwidgets,这是我的wxpython GUI中的一个函数,用于生成随机值。我在GUI的panel类中添加了这个函数。我放置了一个wx.Bind函数,它为它分配一个计时器值,并定期刷新它,以便定期更改值 现在GUI需要进行串行通信,因为我需要获取传感器值并将它们输入到GUI屏幕中。因此,我找到了用于串行输入值的代码: def updateV(self, event): """""" global v v=random.uniform(1,10) print('battery
def updateV(self, event):
""""""
global v
v=random.uniform(1,10)
print('battery voltage =')
print(v)
if v>3:
self.labelOne.SetBackgroundColour('red')
self.labelOne.SetLabel('Battery Voltage : ' + str(v))
else:
self.labelOne.SetBackgroundColour('white')
self.labelOne.SetLabel('Battery Voltage : ' + str(v))
self.Refresh()
然后,我在panel类的init部分添加了以下代码:
def updateV(self, event):
""""""
global v
v=ser.readline()
print v
if v>3:
self.labelOne.SetBackgroundColour('red')
self.labelOne.SetLabel('Battery Voltage : ' + str(v))
else:
self.labelOne.SetBackgroundColour('white')
self.labelOne.SetLabel('Battery Voltage : ' + str(v))
self.Refresh()
在运行GUI时,该值不会出现,也不会在GUI上打印。我知道我在这里犯了一个大错误。不管怎么说,现在的值是通过一个连接到XBEE盾的arduino uno获得的,它通过另一个连接到XBEE盾的arduino接收1-20个值。顺便说一下,随机变量是正确生成的,并在GUI中打印出来,因此该函数没有任何问题。
我需要一种python串行读取值并将其分配给变量的方法,这样我就可以在GUI屏幕中打印得到的值。
PS:我使用了相同的串行代码在python模块的命令屏幕上正确地获得了0 1 2 3 4 5 6 7 8 9 10值
ser = serial.Serial('COM3', 9600, timeout=0)
我正在努力适应python,但这些小事阻碍了我的进步。。我是python新手,请耐心点 您的问题本质上是,在使用
ser.readline()
循环时读取中的串行接口,就像在上一个示例中一样(EDIT1:以及使用wx.Timer
事件轮询时),当GUI等待串行接口上的数据时,它会阻塞GUI。调用app.MainLoop()
将循环wxPython事件系统。但是,GUI示例将要做的唯一一件事是在ser.readline()
处阻塞。当一些数据到来时,它将在updateV
方法中继续。但是,由于下一个计时器事件已经在等待,它将运行到ser.readline()
,并再次阻止该事件并阻止任何GUI更新
您是否在pyserial包中尝试了该示例
它展示了如何旋转一个线程,该线程将读取和发送一个用户定义的SerialRxEvent
,从而使一切都是线程安全的
您还应该阅读以了解如何在wxPython中使用线程执行长时间运行/阻塞任务,并安全地与主GUI线程通信。我从未在GUI中添加while循环。我希望mainloop()可以做与while infinite循环相同的工作,但它从来没有这样做过。我可以用mainloop()在GUI中进行串行通信吗?请您阅读(并理解)我在答案中发布的示例?我已经阅读了,但需要更清晰的说明。我无法关联如何在GUI中使用它们。我想我需要更多的材料
import serial
import time
ser = serial.Serial('COM3', 9600, timeout=0)
while 1:
v=ser.readline()
print v
time.sleep(1)