我使用的是树莓裨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我的出路。
我做了最终搞清楚了这一点,在这里就是我得到了它的工作(同样可能不是最优化的代码,但它已经过测试)。再次,这是对我的树莓派使用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的?)我们催促他们充实和工作。
我在做类似的事情,但与线程,和我期待摆脱它。所以,虽然我不能直接帮助你,也许我可以引导你到一些文件我也真会挖掘到即将.....
https://docs.python.org/release/3.1.3/library/multiprocessing.html