在wx GUI中集成串行通信

时间:2015-05-30 18:17:18

标签: user-interface wxpython pyserial wxwidgets

  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()

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

现在GUI需要进行串行通信,因为我需要获取传感器值并在GUI屏幕中输入它们。所以我发现这个代码用于连续输入值:

 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()

然后我去了面板类的 init 部分并添加了这段代码:

ser = serial.Serial('COM3', 9600, timeout=0)

在运行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值。

import serial
import time
ser = serial.Serial('COM3', 9600, timeout=0)

while 1:
    v=ser.readline()
    print v
    time.sleep(1)

我正在尝试习惯python,但是这些小事阻碍了我的进步..我是python的新手,请耐心等待我!

1 个答案:

答案 0 :(得分:0)

您的问题主要是在#1054 - Unknown column 't.workday_start_time' in 'field list'循环中使用while读取串行接口,如上例所示( EDIT1 :以及使用{{1进行轮询时)在等待串行接口上​​的数据时,将阻止GUI。 调用 ser.readline() 将循环wxPython事件系统。但是,GUI示例唯一要做的就是阻止wx.Timer。一旦数据出现,它将继续app.MainLoop()方法。但是因为下一个计时器事件已经在等待,它将运行到ser.readline()并再次阻止它并阻止任何GUI更新。

您是否尝试过pyserial包中的wxTerminal示例?

它展示了如何旋转一个将执行读取并发送用户定义的updateV的线程,以便一切都是线程安全的。

您还应该阅读LongRunningTasks in the wxPython wiki以了解如何在wxPython中使用线程进行长时间运行/阻塞任务,并安全地与主GUI线程进行通信。