背景:
我正在使用Motorola EMDK v2.5 for .NET从MC 919Z手持式扫描仪获取rfid扫描数据。只要用户按下设备上的按钮,我想继续获取rfid标签数据。一旦他从按钮上移开手指,我就想停止阅读RFID数据。
我正在使用的eMDK活动:
现在摩托罗拉公开了两个事件:
问题:
这两个事件似乎先发制人而不被触发。如果正在读取标签,则不会触发按钮状态更改事件。如果按钮状态更改事件触发,则不会读取标记。
所以,问题是如何确保两个事件串联起来。
答案 0 :(得分: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()
(我现在推测,因为我还没有看到您的代码)。 / p>
最后,在您的状态委托调用中,您现在可以捕获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委托; )