Неблокирующая функция в приведенном ниже коде Python активирует обратный вызов.
Не могли бы вы помочь мне реализовать обратный вызов?
Код: Выделить всё
#!/usr/bin/env python
# start_reading.py
import time
import mercury
def found(tag):
print(tag.epc.decode()) # Check check
# print(tags[1].epc.decode())
reader = mercury.Reader("tmr:///dev/ttyUSB0")
reader.start_reading(found, on_time=250, off_time=0)
time.sleep(0.5)
reader.stop_reading()
Код: Выделить всё
b'001853000000000000000012'
b'34155CACB400000000000125'
b'34155CACB400000000000125'
b'34155CACB400000000000125'
b'001853000000000000000012'
b'34155CACB400000000000125'
b'001853000000000000000012'
b'34155CACB400000000000125'
b'34155CACB400000000000125'
Из документации:
reader.start_reading(callback, on_time=250, off_time=0)
Запускает асинхронное чтение. Он немедленно возвращается и начинает последовательность операций чтения или непрерывное чтение. Результаты передаются обратному вызову. Чтения повторяются до тех пор, пока не будет вызван метод reader.stop_reading().
- callback(TagReadData) будет вызываться для каждого обнаруженного тега.
- on_time устанавливает продолжительность в миллисекундах для активного запроса считывателя.
- off_time продолжительность в миллисекундах для читатель должен молчать во время запроса
Код: Выделить всё
#!/usr/bin/env python
# read.py
import mercury
reader = mercury.Reader("tmr:///dev/ttyUSB0")
data = reader.read()
print(data)
print(f"type: {type(data)}")
Код: Выделить всё
[EPC(b'34155CACB400000000000125'), EPC(b'001853000000000000000012')]
type:
Код: Выделить всё
#!/usr/bin/env ruby
# read.rb
require 'pycall/import'
include PyCall::Import
pyimport :mercury
reader = mercury.Reader.new("tmr:///dev/ttyUSB0")
python_data = reader.read()
puts "python_data: #{python_data}"
puts "python class: #{python_data.class}"
puts ""
ruby_data = python_data.to_ary
puts "ruby_data: #{ruby_data}"
puts "ruby class: #{ruby_data.class}"
Код: Выделить всё
python_data: [EPC(b'34155CACB400000000000125'), EPC(b'001853000000000000000012')]
python class:
ruby_data: [EPC(b'34155CACB400000000000125'), EPC(b'001853000000000000000012')]
ruby class: Array
Решением для обратного вызова должно быть улучшение следующего кода.
Код: Выделить всё
#!/usr/bin/env ruby
# start_reading.rb
require 'pycall/import'
include PyCall::Import
pyimport :mercury
def found(tag)
puts tag.epc
end
reader = mercury.Reader.new("tmr:///dev/ttyUSB0")
reader.start_reading(found, on_time=250, off_time=0) # What should I do here?
sleep(0.5)
reader.stop_reading()
Код: Выделить всё
start_reading.rb:7:in `found': wrong number of arguments (given 0, expected 1) (ArgumentError)
from start_reading.rb:14:in `'
Я думаю, что read.start_reading() должен получить что-то, что понимает Python, сейчас он получает код Ruby.
Следовательно, «найденную» функцию (или лямбда) и переменные необходимо перевести из Ruby (Ru) в Python (Py) с помощью PyCall.
Я показал, что могу использовать PyCall для вызова Py Reader из Ru и перевести вывод из списка в массив. Итак, первый и последний шаг сделаны, отлично. Но каждое промежуточное взаимодействие также должно быть связано с PyCall (т. е. «найденной» функцией от Ru до Py).
В этом, я думаю, и заключается проблема.
Подробнее здесь: https://stackoverflow.com/questions/798 ... ing-pycall
Мобильная версия