Motorola EMDK: как остановить сканирование данных при изменении статуса?
Фон:
Я использую Motorola EMDK v2.5 для.NET, чтобы получить данные сканирования RFID с портативного сканера MC 919Z. Я хочу продолжать получать данные метки rfid, пока пользователь нажимает кнопку на устройстве. Как только он уберет палец с кнопки, я хочу прекратить чтение данных RFID.
События eMDK, которые я использую:
Теперь Motorola выставила два события:
- StatusNotify: Событие, которое срабатывает при изменении состояния кнопки (нажата или нет).
- ReadNotify: событие, которое запускается для чтения тегов RFID.
Проблема:
Эти два события, кажется, препятствуют тому, чтобы друг друга инициировали. Если теги читаются, событие изменения статуса кнопки не срабатывает. Если происходит событие изменения состояния кнопки, теги не читаются.
Итак, вопрос в том, как я могу гарантировать, что оба события будут запущены в тандеме.
1 ответ
Вам нужно будет сделать несколько вещей (извините за код VB, но это должно быть тривиально для преобразования в C#):
Используете ли вы
Actions.Inventory.Perform()
или жеActions.TagAccess.OperationSequence.PerformSequence()
вам понадобитсяTriggerInfo
определены и переданы этим методам вместо обычного вызова без аргументов. Эта структура содержит фактические события триггера.Imports Symbol Imports Symbol.RFID3 Imports Symbol.RFID3.Events Imports Symbol.RFID3.TagAccess Private Sub DoRead() triggernfo = New TriggerInfo() triggernfo.TagReportTrigger = 1 triggernfo.StartTrigger.Type = START_TRIGGER_TYPE.START_TRIGGER_TYPE_HANDHELD triggernfo.StartTrigger.Handheld.HandheldEvent = HANDHELD_TRIGGER_EVENT_TYPE.HANDHELD_TRIGGER_PRESSED triggernfo.StopTrigger.Type = STOP_TRIGGER_TYPE.STOP_TRIGGER_TYPE_HANDHELD_WITH_TIMEOUT triggernfo.StopTrigger.Handheld.HandheldEvent = HANDHELD_TRIGGER_EVENT_TYPE.HANDHELD_TRIGGER_RELEASED triggernfo.StopTrigger.Handheld.Timeout = 0 'Default handheld timeout value 'Then you need to pass it to the Perform() OR PerformSequence() call: _Reader.Actions.TagAccess.OperationSequence.PerformSequence(Nothing, triggernfo, Nothing) 'OR _Reader.Actions.Inventory.Perform(Nothing, triggernfo, Nothing) End Sub
Суть в том, что вам не нужно звонить Perform()
или же PerformSequence()
чтобы начать чтение каждый раз, вы можете просто определить процедуру после Form.Load
который подключается к ридеру и вызывает Perform()
с триггером в нем, и он будет автоматически активироваться только при использовании триггера. В зависимости от того, как вы закодировали, я думаю, что вы можете использовать ваши текущие обратные вызовы делегатов, как они есть, если один из делегатов Read использует GetReadTags()
(Я размышляю сейчас, потому что я не видел ваш код).
Наконец, в своем вызове делегата статуса вы можете поймать Symbol.RFID3.Events.STATUS_EVENT_TYPE.HANDHELD_TRIGGER_EVENT
как EventData. Если вы копаете дальше, у вас есть внутри eventData.HandheldTriggerEventData.HandheldTriggerEvent
это может быть HANDHELD_TRIGGER_EVENT_TYPE.HANDHELD_TRIGGER_PRESSED
или же HANDHELD_TRIGGER_EVENT_TYPE.HANDHELD_TRIGGER_RELEASED
, Ничего не стоит, что вам не нужно ничего делать с этим событием, чтобы фактически прочитать теги, триггер и чтение произойдут в любом случае, даже если вы ничего не сделаете здесь.
На самом деле, путаница с Событием (например, остановка или запуск чтения) может привести к ошибкам броска триггера, поэтому, если у вас нет острой необходимости (как у меня было сегодня), переходите к объекту TriggerInfo и оставляйте делегат Status в покое;)