Я использую Raspberry Pi 3b для сбора данных по SPI из цифрового преобразователя времени (TDC-GPX2).По сути, TDC отмечает, когда in видит событие (скажем, передний фронт электрического импульса), и отправляет информацию о синхронизации моему Pi.Моей целью для этого было бы собрать данные без паузы (так как пропущенные импульсы увеличивают вероятность ошибок в моих данных), как можно быстрее, пока не будет выключено переключение.
Примечание. Мы разрабатываем драйверы связи LVDS на нашей FPGA для более быстрого сбора данных от TDC, но это поможет в быстрых тестах и других проектах.Мы также используем spidev для SPI: я понимаю, что запрашивать информацию обо всех 4 остановках неэффективно, но я могу изменить это позже
Я использую Kivy в качестве графического решения для этого программного обеспечения.показать важные фрагменты кода ниже.Я использую основной код с графическим интерфейсом и библиотеку для TDC с циклом внутри него.Я никогда не публиковал здесь раньше, поэтому я не уверен, что включить в код, если потребуется больше, я опубликую это!Я попробовал библиотеку «thread», но она, похоже, действительно не отвечала и резко замедлила работу графического интерфейса.
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 с именем Read"ВМТ и цикл запускается до тех пор, пока я снова не нажму на тумблер, «но он просто фокусировал цикл, пока я не нажал Ctrl + C»