我需要一个循环运行,直到拨动按钮被再次按下不暂停

问题描述 投票:0回答:2

我使用的是树莓裨3B从一个时间 - 数字转换器(TDC-GPX2)收集通过SPI数据。在看到当一个事件(电脉冲的上升沿让我们说),并发送其定时信息到我的皮的TDC基本标志。我为这个目标是收集数据,而暂停(如错过脉冲增加错误机会摆在我的数据),尽可能快,直到触发翻转关闭。

注意:我们在我们从TDC更快的数据采集FPGA开发LVDS通讯驱动程序,但是这将与快速测试等项目提供帮助。我们使用spidev为SPI另外:我知道,要求所有4个站的信息是没有效率的,但后来我可以调整

我使用Kivy作为这个软件的GUI解决方案,我会表现出下面的代码中的重要片段。我使用了GUI主代码和贸发局与它里面的循环库。之前,所以我不知道该怎么在代码中包括,如果需要更多的我会后我从来没有张贴在这里!我也尝试了“线程”库,但它似乎是真的没有反应,并显着放缓的GUI。

def press_callback(obj):
    global tdcinit, f
    print("Button pressed,",obj.text)

    if obj.text == 'Read TDC':
        if obj.state=="down":
            f.write("New Trial \r\n")
            TDC.ReadTDC(f,obj.state)
        else:
            TDC.ReadTDC(f,obj.state)
            TDC.Reset()
            print('Done Recording, plz save before close')

按钮定义低下去是:

Class MyApp(App):
    def build(self):
        layout=GridLayout(cols=5)
        Window.clearcolor(0.2,0.2,0.2,1)
        TDCRead = ToggleButton(text='Read TDC')
        TDCRead.bind(on_press=press_callback)
        layout.add_widget(TDCRead)

        return layout

在我的TDC库中的函数被调用为:

def ReadTDC(self,f,state):
    while state=='down':
        GPIO.output(29,0) #this is just for SPI
        i=8
        j=1
        self.__transfer(0x68)
        while i<32:
            byteback = self.__transfer(0x00)
            if j<4:
                f.write("Ref: %02X\r\n" % (byteback))
                j=j+1
            elif j>=4 and j<6:
                f.write("Res: %02X\r\n" % (byteback))
            else:
                f.write("Res: %02X\r\n" % (byteback))
                j=1
            i=i+1
        GPIO.output(29,1)
    return f

该__transfer功能其实只是用xfer2并打印调试的结果。

我希望这会工作为“按切换按钮命名读TDC和循环运行,直到我再次按下切换”,但它只是专注的循环,直到我按Ctrl + C'D我的出路。

python kivy raspberry-pi3
2个回答
0
投票

我做了最终搞清楚了这一点,在这里就是我得到了它的工作(同样可能不是最优化的代码,但它已经过测试)。再次,这是对我的树莓派使用Kivy和Python 3。我说这我的初始化:

import multiprocessing
from multiprocessing import Process, Queue

q = Queue()

我不得不添加此定义中使用的多库(我写一个文件,你可以选择忽略这个,如果你不需要):

def readprocess(qstate):
    f = open("TDCData.txt","a+")
    f.write("New Trial \r\n")
    print('reading process began')
    run = True
    while run:
        while not qstate.empty():
            if qstate.get() == "stop":
                run = False
        TDC.ReadTDC(f)
    f.close()

然后我定义一个变量p这样我就可以在全球使用它(不知道这是需要的,我只是做了它是安全的),接下来是Kivy实现部分:

p=0
def press_callback(obj)
    global tdcinit, q, p
    print("Button pressed,", obj.text)
    if obj.text == 'ReadTDC':
        if obj.state =="down":
            p = Process(target = readprocess, args=(q,))
            p.start()
        else:
            q.put("stop")
            p.join()
            TDC.Reset()
            print("Done Recording")

我TDC.Reset()函数只是调用它的力量在它的文档中列出复位指令(停止测量和重新初始化)。在TDC库ReadTDC更新的功能是:

def ReadTDC(self,f):
    GPIO.output(29,0)
    i=8
    j=1
    self.__transfer(0x68)
    while i<32:
        byteback=self.__transfer(0x00)
        if j<4:
            f.write("Ref: %02X\r\n" % (byteback))
            j=j+1
        elif j>=4 and j<6:
            f.write("Res: %02X\r\n" % (byteback))
            j=j+1
        else:
            f.write("Res: %02X\r\n" % (byteback))
            j=1
        i=i+1
    f.write("\r\n")
    GPIO.output(29,1)
    return f

希望这可以帮助任何人搜索这个,我打算让我们的TDC-GPX2,AD5592R(DAC / ADC组合),和LMH6401(可编程增益放大器)库公共莫名其妙地(也许Git的?)我们催促他们充实和工作。


-1
投票

我在做类似的事情,但与线程,和我期待摆脱它。所以,虽然我不能直接帮助你,也许我可以引导你到一些文件我也真会挖掘到即将.....

https://docs.python.org/release/3.1.3/library/multiprocessing.html

© www.soinside.com 2019 - 2024. All rights reserved.