Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
User interface wxgui中串行通信的集成_User Interface_Wxpython_Pyserial_Wxwidgets - Fatal编程技术网

User interface wxgui中串行通信的集成

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

这是我的wxpython GUI中的一个函数,用于生成随机值。我在GUI的panel类中添加了这个函数。我放置了一个wx.Bind函数,它为它分配一个计时器值,并定期刷新它,以便定期更改值

现在GUI需要进行串行通信,因为我需要获取传感器值并将它们输入到GUI屏幕中。因此,我找到了用于串行输入值的代码:

  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)