我正在使用Raspberry Pi 3b通过SPI从时间数字转换器(TDC-GPX2)收集数据。 TDC实质上标记何时看到事件(比如说电脉冲的上升沿),并将其定时信息发送给我的Pi。我的目标是尽可能快地收集数据而不会暂停(因为丢失的脉冲会增加数据中的错误机会),直到触发器被关闭为止。
注意:我们正在FPGA上开发LVDS通讯驱动程序,以便从TDC更快地获取数据,但这将有助于快速测试和其他项目。我们将spidev用于SPI 另外:我知道要求所有4个站点的信息都没有效率,但我可以稍后进行调整
我将Kivy用作该软件的GUI解决方案,下面将显示重要的代码片段。我正在使用带有gui的主代码和带有TDC的TDC库。我以前从未在这里发布过,所以我不确定代码中要包含什么内容,如果需要更多内容,我将其发布!我确实尝试了“线程”库,但它似乎反应迟钝,大大降低了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并打印结果以进行调试。
我曾希望这可以像“按一下名为Read TDC的ToggleButton,并且循环一直运行到再次按下切换开关一样”,但是它只是集中循环,直到我按ctrl + C退出。
答案 0 :(得分:0)
我最终弄清楚了这一点,这就是我如何使它工作的(再次可能不是最佳代码,但是已经过测试)。同样,这是在我的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(可编程增益放大器)库公开后,以某种方式将它们公开(也许是Git?)。和工作。
答案 1 :(得分:-1)
我正在做类似的事情,但是使用线程,并且我希望摆脱它。因此,虽然我无法直接为您提供帮助,但也许我可以引导您阅读一些文档,我也将很快对其进行研究.....
https://docs.python.org/release/3.1.3/library/multiprocessing.html