我需要循环到 运行 直到再次按下切换按钮而不暂停

I need a loop to run until toggle button is pressed again without pausing

我正在使用 Raspberry Pi 3b 通过 SPI 从时间数字转换器 (TDC-GPX2) 收集数据。 TDC 本质上标记何时看到事件(比方说电脉冲的上升沿)并将其计时信息发送到我的 Pi。我的目标是尽可能快地不停地收集数据(因为错过的脉冲会增加我数据中的错误机会),直到关闭切换。

注意:我们正在 FPGA 上开发 LVDS 通信驱动程序,以便更快地从 TDC 获取数据,但这将有助于快速测试和其他项目。我们为 SPI 使用 spidev 另外:我意识到请求所有 4 个站点的信息效率不高,但我可以稍后进行调整

我使用 Kivy 作为该软件的图形用户界面解决方案,我将在下面展示重要的代码片段。我正在使用带有 gui 的主代码和带有循环的 TDC 库。我以前从未 post 编辑过这里,所以我不确定要在代码中包含什么,如果需要更多,我会 post 它!我确实尝试了 "thread" 库,但它似乎真的没有响应,并且显着降低了 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 并打印结果以进行调试。

我曾希望这会像 "Press ToggleButton named Read TDC and the loop runs until I press the toggle again," 一样工作,但它只是聚焦循环,直到我按 ctrl+C 退出。

我正在做类似的事情,但使用线程,我希望摆脱它。因此,虽然我无法直接帮助您,但也许我可以引导您阅读一些我也将很快深入研究的文档......

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

我确实最终弄明白了这一点,下面是我是如何让它工作的(同样可能不是最佳代码,但它已经过测试)。同样,这是在我的 Raspberry pi 上使用 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(可编程增益放大器)库 public(也许 Git?) 在我们充实它们并开始工作之后。