ODRFID (CDC Firmware)
The device appears as a virtual serial port (COM port) by implementing the USB Communications Device Class, Abstract Control Model (CDC/ACM) specification. All major operating systems, including Windows, Linux, and macOs support such devices out-of-the-box.
Differences in the device revisions are described in the Hardware Revisions section.
An AT command set is provided to query tags, read and write data, and configure the device itself.
Port settings
The device represents itself as a virtual COM port. As such, port settings, like communication speed, parity or stop bit settings will be ignored. No specific configuration is necessary and the port can be operated at any settings.
General Frame Format
- Host-to-Device data must start with an
AT
keyword and end with a carriage-return character (ASCII code 13 decimal, 0x0d hexadecimal, "\r" as C string literal) - Device-to-Host frames start and end with a carriage-return character followed by a line-feed character (ASCII codes 13,10 decimal, 0x0d,0x0a hexadecimal, "\r\n" as C string literal).
- Device-to-Host response to a Host-to-Device request consists of one or more frames, the last one being
\r\nOK\r\n
or\r\nERROR\r\n
, depending on whether the request/command has been completed successfully or failed. - Do not add any unnecessary white space characters (space, back-space, tab, carriage-return, line-feed, etc.) to the request data, they will not be removed by the command-line parser leading to the "ERROR" response.
Device modes
RFID device can be in two modes: scanning (SCAN1
) and application controlled mode (SCAN0
). The default mode (i.e. the device mode after POR) is selected via the device settings. Factory defaults set it to scanning mode (SCAN1
).
SCAN1 mode is obsolete since v 1.5. See the details below
SCAN1
- the device continuously scans whether an RFID tag is present or not (actually it queries the tag presence once every N ms - refer to the device settings) and reports it to the PC:\r\nSCAN:+<HEX DATA>\r\n
when a new tag is detected\r\nSCAN:-<HEX DATA>\r\n
when a tag is no longer present
-
SCAN0
- the device does not scan for RFID tags on its own, only when a corresponding request arrives.All commands except LED control, BUZZ control, settings related, and device reboot will fail with
ERROR
while the device is in theSCAN1
mode. -
(v. 1.3F Dec 17 2018 and above) An extra
SCAN2
mode is added. In this mode the device continuously scans for an RFID tag and, once a tag has been identified, prints the data read from it using the specified format:\r\n[formatted data]\r\n
. Unlike theSCAN1
mode when the tag is removed, no data is printed. Refer to the FMT command for the format description. All commands except LED control, BUZZ control, settings related, and device reboot will fail withERROR
while the device is in theSCAN2
mode. - (v. 1.0F Apr 3 2018 and above)
DATA
is determined by the UID and Block Number settings. IfDATA
is the UID, SAK is optionally appended based on the corresponding device setting. - (prior to v. 1.0F Apr 3 2018)
DATA
is the UID + SAK - Since v1.5 the
SCAN1
mode is effectively the same as theSCAN2
(formatted output), the1
char in the mode is kept for compatibility reasons.
Error codes
When a tag reports an error, an additional frame describing the error can be returned before the ERROR
frame. This additional frame has the following format:
+CME ERROR: <code>
where code is the last error reported by RFID IC. It is a 32bit unsigned integer in decimal format with the following bit fields:
0x00000001
- Protocol error0x00000002
- Parity error0x00000004
- Checksum error0x00000008
- Collision0x00000010
- Buffer overflow0x00000020
- Tear event0x00000040
- IC overheated0x00000080
- FIFO write error0x00000100
- Operation timed out0x00000200
- Mifare NAK0x00000400
- Authentication failure0x00000800
- Generic communication error0x00001000
- The TAG returned more data than expected (v1.5+)0x00002000
- The TAG reply integrity error (v1.5+)
Bits 16-31 are reserved for internal purposes and must be ignored.
CDC/ACM AT Command Set. API Reference.
Device Information
This command queries the product information and firmware version of the device.
Bug
please consult the p.1 of the Errata
Syntax:
Request | ATI\r |
Response | <product description> <firmware version/build date> S/N <serial number> |
Example:
Request | ATI\r |
Response | Open-Development RFID Reader (CDC-AT) 1.0F Jan 17 2018 S/N 220333635434B431500280010 OK |
Flush buffers
(from v1.6)
This command forces the device to flush the internal buffer, holding the data to be sent to the PC.
Syntax:
Request | ATH\r |
Response | OK |
LED Control
This command controls the state of the light-emitting diode (LED).
Some -e/-m/-n device revisions do not have any LEDs, therefore this command is not supported. The device will answer with an ERROR
to any AT+D....
command
- 0 = off,
- 1 = on
- 2 = blinking
If no state is specified (i.e. nil
1), the application relinquishes control to the firmware
Syntax:
Request | AT+D1=[0/1/2/nil]\r |
|
Response | OK |
Example:
Request | AT+D1=1\r |
Turn the LED on |
Response | OK |
|
Request | AT+D1=\r |
Return control to the firmware |
Response | OK |
|
Request | AT+D1?\r |
Query LED state |
Response | +D1=1 OK |
LED is on |
Buzzer Control
This command controls the state of the buzzer.
- 0 = off
- 1 = on
If no state is specified (i.e. nil
1), the application relinquishes control to the firmware.
Syntax:
Request | AT+B=[0/1/nil]\r |
|
Response | OK |
Example:
Request | AT+B=1\r |
Turn the buzzer on |
Response | OK |
|
Request | AT+B=\r |
Return control to the firmware |
Response | OK |
|
Request | AT+B?\r |
Query the buzzer state |
Response | +B=1 OK |
Buzzer is on |
RFID Mode Control
This command switches the device mode.
Syntax:
Request | AT+SCAN[0/1/2]\r |
Response | OK |
Example:
Request | AT+SCAN0\r |
|
Response | OK |
Scanning disabled |
Request | AT+SCAN?\r |
supported since v1.4F2 |
Response | +SCAN=0 |
Current mode: 0 |
OK |
Enable/Disable RF Field
This command switches on / off the RF field, generated by the IC.
Note 1
-
For the multi-protocol readers (i.e. 13.56MHz + 125kHz), the command switches both fields on / off, but only if the corresponding field is enabled (ref.
AT+h
andAT+m
respectively), the query command is not reliable and should not be used. -
For the single protocol readers (only 13.56MHz, or only 125kHz), the command switches the corresponding field on / off, the multi-protocol commands (ref.
AT+h
orAT+m
) are not available.
Note 2
The field state query command (+RF?
) is not reliable while the scanning process is running (i.e. the SCAN1
mode is active) and has been disabled while this mode is active for the 13.56MHz-enabled readers in the firmware versions 2.2
and above. For the multi-protocol readers the query command is meaningless and has been disabled in the firmware versions 2.2
and above.
Syntax:
Request | AT+RF=[0/1]\r |
1 - switch on, 0 - switch off |
Response | OK |
Example:
Request | AT+RF=0\r |
|
Response | OK |
RF field is off |
Request | AT+RF?\r |
Query the RF field state (ref. note 2 above) |
Response | +RF=0 OK |
RF field is currently off |
Inventory scan (all tags)
Requests an inventory scan. Returns a list of UIDs (may be empty) of the tags in the field range. All the discovered tags are scanned and reset after the enumeration completes.
It may take the device some time to query all the tags. Do not issue a new command before getting the reply for the previous one.
Syntax:
Request | AT+I\r |
|
Response | +UID=<HEX UID><SAK> OK |
possibly repeated or absent |
Example:
Request | AT+I\r |
Response | +UID=EC6D140708 +UID=343D7091725D8600 OK |
Inventory Scan (the first tag)
Requests an inventory scan, selects and returns the first detected tag, if any, according to the anti-collision procedure. The tag (if present) will be set as the current one and halted.
If a tag is not present, the device returns an empty success message (i.e OK
)
Syntax:
Request | AT+i\r |
|
Response | +UID=<HEX UID><SAK> OK |
possibly absent |
Example:
Request | AT+i\r |
Response | +UID=EC6D140708 OK |
Inventory Scan (select the next tag)
Halts the currently selected tag and selects the next 13.56MHz tag (if any) according to the anti-collision procedure. The new tag will be set as the current one and halted. Note, that if a tag is not present, the device returns an empty success message (i.e OK
).
The '-e' revision of the device does not support this command and returns an ERROR
.
Syntax:
Request | AT+n\r |
|
Response | +UID=<HEX UID><SAK> OK |
possibly absent |
Example:
Request | AT+n\r |
Response | +UID=343D7091725D8600 OK |
Select Tag
Select a single 13.56MHz tag by UID for further processing. The tag access commands (read/write block) address the current tag. current means either the first one according to the anti-collision procedure, or the one selected by this command. Passing an empty UID will deselect the current tag (if any).
Attention
Starting from version 1.6, current should read: 'the tag, selected by the last AT+i
, AT+n
or AT+SELECT=...
command' (not the first one selected by the anti-collision procedure)
The '-e' revision of the device does not support this command and returns an ERROR
.
Syntax:
Request | AT+SELECT=<HEX UID>\r |
|
Response | OK ERROR |
Tag selected Tag is not present |
Example:
Request | AT+SELECT=343D7091725D86\r |
|
Response | OK |
Tag selected |
Request | AT+SELECT=343D7091725D87\r |
|
Response | ERROR |
Tag is not present |
Check Tag Presence
Check whether a tag with the specified UID is currently present. Unlike the AT+SELECT=...
command this one just checks the tag presence, it does not select the tag and does not make it the current one. The tag being checked will be halted (if present).
The '-e' revision of the device does not support this command and returns an ERROR
.
Syntax:
Request | AT+C=<HEX UID>\r |
|
Response | OK ERROR |
Tag is present Tag is not present |
Example:
Request | AT+C=343D7091725D86\r |
|
Response | OK |
Tag is present The current UID has not changed! |
Request | AT+C=343D7091725D87\r |
|
Response | ERROR |
Tag is not present |
Get Current Tag Information
Request detailed information about the current tag: UID+SAK, block size, block count, type. UID and SAK are returned in hexadecimal format, BS (block size), BC (block count), T (type) in decimal format.
Recognized tag types: ref. Tag Types
Syntax:
Request | AT+S\r |
|
Response | +UID=<HEX UID><SAK>,BC=<bc>,BS=<bs>,T=<t> OK |
success |
ERROR |
tag did not respond or SCAN1 mode is enabled |
Example:
Request | AT+S\r |
Response | +UID=EC6D140708,BC=64,BS=16,T=0 OK |
Read Data Block
(only for Classic, Plus S/X (SL1), Ultralight and NTAGs)
Read data block from tag memory. The block number must be within the range supported by the tag (ref. the BC field in the AT+S\r
request), and passed in decimal format. Returns the block number, followed by the actual data in hexadecimal format. Number of bytes in the data equals the tag block size (ref. the BS field in the AT+S\r
request). A tag must be selected prior to executing this command (either by calling AT+i
, AT+n
, or AT+SELECT
)
The '-e' revision of the device does not support this command and returns an ERROR
.
Starting with firmware v3.2 the block number may be passed in the hexadecimal format: AT+R10
or AT+R0x0a
. The reply still always contains the block number in the decimal format.
Syntax:
Request | AT+R<block number>\r |
|
Response | +DATA <block number>:<hex data> OK |
success |
+CME ERROR: <code> ERROR |
the tag did not respond, reported an error or SCAN1 mode is enabled |
Example:
Request | AT+R0\r |
Response | +DATA 0:EC6D1407920804009944314230353913 OK |
Write Data Block
(only for Classic, Plus S/X (SL1), Ultralight and NTAGs)
Write data block to tag memory. The block number must be within the range supported by the tag (ref. the BC field in the AT+S\r
request), and passed in decimal format. The data must be passed in hexadecimal format. The length of the data must match the size of a data block as returned in the BS parameter (i.e. pass 2*BS hexadecimal characters).
The '-e' revision of the device does not support this command and returns an ERROR
.
Starting with firmware v3.2 the block number may be passed in the hexadecimal format: AT+W10:...
or AT+W0x0a:...
.
Syntax:
Request | AT+W<block number>:<HEX DATA> |
|
Response | OK |
|
+CME ERROR: <code> ERROR |
write or authentication error (if +CME... is reported)syntax error or SCAN1 mode is enabled (if no +CME... ) |
Example:
Request | AT+W1:000102030405060708090A0B0C0D0E0F\r |
Response | OK |
Value block
(supported since v1.6, only for Classic, Plus S/X (SL1))
Increment / decrement the value of a "value block" of a Mifare Classic or Plus S/X tag.
The '-e' revision of the device does not support this command and returns an ERROR
.
Starting with firmware v3.2 the block number may be passed in the hexadecimal format: AT+V<I/D>10:...
or AT+V<I/D>0x0a:...
.
Syntax
Request | AT+V<I/D><block number>:<value> |
|
Response | OK |
|
+CME ERROR: <code> ERROR |
RW or authentication error (if +CME... is reported)syntax error or SCAN1 mode is enabled (if no +CME... ) |
Pass I
for increment, D
for decrement, block number and value are passed as decimal values. Value must be non-negative.
Example
Request | AT+VI1:42\r |
Response | OK |
Change Tag UID
!!! warning
This function is supported starting from *v 1.5*. Not all tags have a re-writable block 0. This is a potentially dangerous operation. The best case scenario - it just won't work. The worst case - you can brick your tag. Proceed at your own risk.
The '-e' revision of the device does not support this command and returns an ERROR
.
Syntax:
Request | AT+~<HEX UID> |
(*) |
Response | OK |
Success |
* UID size must match the size of the current UID. UID size changing is not supported! All tags except Mifare Classic are not supported!
Mifare Plus specific commands
(supported since v1.6)
All the '-e' revisions and some '-m' revisions of the device do not support these commands and return an ERROR
.
Authentication
Perform Mifare Plus authentication for the specified block.
Syntax:
Request | AT+N<block> |
|
Response | OK |
Success |
+CME ERROR: <code> ERROR |
Authentication or syntax error |
<block>
must be specified as a decimal number, pass 0
to reset the authentication.
Bug
please consult the p.4 of the Errata
Starting with firmware v3.2 the block number may be passed in the hexadecimal format: AT+N10
or AT+N0x0a
.
Read Block
Read a block of a Mifare Plus tag (assumes a successful authentication procedure for the corresponding block has been performed)
Syntax:
Request | AT+M<block number>\r |
|
Response | +DATA <block number>:<hex data> OK |
|
+CME ERROR: <code> ERROR |
the tag did not respond, reported an error or SCAN1 mode is enabled |
Example:
Request | AT+M1\r |
Response | +DATA 1:EC6D1407920804009944314230353913 OK |
The block number must be in a decimal format.
Starting with firmware v3.2 the block number may be passed in the hexadecimal format: AT+M10
or AT+M0x0a
. The reply still always contains the block number in the decimal format.
Write Block
Write data block to tag memory (assumes a successful authentication procedure for the corresponding block has been performed). The block number must be within the range supported by the tag and passed in decimal format. The data must be passed in hexadecimal format. The length of the data must match the size of a data block.
Starting with firmware v3.2 the block number may be passed in the hexadecimal format: AT+W10:...
or AT+W0x0a:...
.
Syntax:
Request | AT+E<block number>:<HEX DATA> |
|
Response | OK |
success |
+CME ERROR: <code> ERROR |
write or authentication error (if +CME... is reported)syntax error or SCAN1 mode is enabled (if no +CME... ) |
Example:
Request | AT+E1:000102030405060708090A0B0C0D0E0F\r |
Response | OK |
Security Level Switch
Switch the security level of a Mifare Plus tag. The level must be passed as a decimal number.
Bug
please consult the p.2 of the Errata
Syntax
Request | AT+J<level> |
|
Response | OK |
success |
+CME ERROR: <code> ERROR |
write or authentication error (if +CME... is reported)syntax error or SCAN1 mode is enabled (if no +CME... ) |
125kHz Tags Commands
Supported by -e/-m revisions only.
Program T55x7
The device can program T55x7 (T5557/67/... and binary-compatible) tags in Em-Marine emulation mode. The tag will be identified by Em-marine compatible readers as a EM4100 tag with the specified UID.
Bi-phase encoding
The e5555-compatibility mode (default for the T5577 IC) biphase coding is reversed compared to the EM4100 standard (mid-bit transition is one, not zero.) Therefore, if the biphase encoding is used, the device will therefore try to program the T5577 in extended mode, where a compatible biphase coding is available. This may fail, therefore for compatibility reasons Manchester coding choice is preferable.
Syntax:
Request | AT+@HHHHHHHHHH\r |
HH..HH - 5 digits (10 hex characters) of the Customer ID (1 byte) + UID (4 bytes) |
Response | OK |
If an inventory scan command has been performed prior to issuing this command and an EM-Marine tag has been detected, the 10 hex characters can be omitted in order to perform a tag clone operation.
Example:
Request | AT+@4201020304\r |
|
Response | OK |
Tag write sequence has been performed |
Example 2
Request | AT+i\r |
|
Response | +UID=1011121314FF OK |
EM-Marine tag has been identified |
--- | --- | Remove the EM-Marine tag and prepare the tag to be written |
Request | AT+@\r |
|
Response | OK |
Tag write sequence has been performed |
The device will not verify by itself that the write operation succeeded (or even that a compatible tag is present). The success or failure of the write command has to be verified by a following inventory scan command.
Program T55x7 with a password
The same as the previous command, but the tag is password-protected against unauthorized access.
Syntax:
Request | AT+xPPPPPPPP,HHHHHHHHHH\r |
PP..PP - 32 bit big-endian unsigned integer. |
Response | OK |
Comma and the 10 hex digits are optional if a EM-Marine tag has been previously identified (i.e. a clone operation should be performed). Both the password and the data must be passed as hexadecimals.
Clear the password protection of a T55x7 tag
Security risk
Only the password protection bit will be lifted. The password itself will be left in the tag's memory in plain text, anyone will be able to read it.
The device has no means to verify that the password protection has been disabled, or even that the password was correct.
Syntax:
Request | AT+uPPPPPPPP\r |
PP..PP - 32 bit big-endian unsigned integer. |
Response | OK |
Device Settings
The following commands change various device settings. They are executed regardless of the device mode. Individual commands change only in-RAM settings. In order to save the current settings to ROM, execute the AT+P
command.
Enable/Disable the LED
This command enables/disables the LED. This setting only affects whether the firmware switches the LED when a tag is detected/lost. Regardless of this setting, you can switch the LED on and off using AT+D1...
command.
Syntax:
Request | AT+L[0/1/?]\r |
? - query the current value0 - do not switch LED on/off1 - switch LED on/off |
Response | OK |
Example:
Request | AT+L?\r |
|
Response | +L1 OK |
LED will be switched on/off |
Enable/Disable the Buzzer
This command enables/disables the buzzer.
This setting only affects whether the firmware will make a beep when a tag is detected or not.
Regardless of this setting, you can switch the buzzer on and off using AT+B...
command.
Syntax:
Request | AT+Z[0/1/?]\r |
? - query the current value0 - do not make a beep1 - make a beep |
Response | OK |
Example:
Request | AT+Z?\r |
|
Response | +Z1 OK |
The device will beep when a tag is detected |
RFID Receiver Gain
The receiver gain is measured in dBm. The valid range is [18;48]dBm
.
The default value is 33dBm
.
This setting is only for the 13.56MHz receiver. The 125kHz receiver is not affected.
The valid gain values are
- 18dBm
- 23dBm
- 33dBm
- 38dBm
- 43dBm
- 48dBm
If any other value is passed, it will be rounded (to the nearest available value greater than the one passed).
Syntax:
Request | AT+G=[18-48]\r |
? - query the current value+G= - revert to default (33) |
Response | OK |
Example:
Request | AT+G=24\r |
|
Response | OK |
The value will be rounded The value will not be applied immediately |
Request | AT+G?\r |
|
Response | +G=33 OK |
The value (24) has been rounded. |
Tag Presence Query Frequency
When in SCAN1
(or SCAN2
) mode, the device queries the tag presence every N ms. This command controls the query frequency (i.e. the interval N). Valid range is [100-65535] ms. Values smaller than the minimum one will be accepted and silently increased to fit in the range. Values greater then the maximum one will result in an error.
The default value is:
- prior to v1.4: 1000 ms
- starting v1.4: 200 ms.
Syntax:
Request | AT+T[?/<value>]\r |
? - query the current value |
Response | OK |
Example:
Request | AT+T?\r |
|
Response | +T1000 OK |
The current interval value is 1000ms |
Request | AT+T1500\r |
|
Response | OK |
The current interval value set to 1500ms |
Authentication Keys
Mifare Classic/Plus tags need an authentication key to be read/written.
The following command sets the key (the key type and 6 bytes long key itself), which will be used to authenticate the connected Mifare Classic tags.
The default value is FF
Danger
The keys are written / read via this protocol in plain text.
If the settings are persisted, the keys are stored in the device and will be available for later readout using this protocol.
If a custom key is set and should not be persisted, revert it to the default one before issuing the AT+P
command.
Syntax:
Request | AT+K<type><hex data>\r |
type can beA or B |
Response | OK |
Starting from v 1.5:
Set the Ultralight EV1 and NTAG's authentication password and query the current tag's PACK
Set the password:
Request | AT+KU<hex data>\r |
4 bytes (8 hex digits) |
Response | OK |
Query the PACK and perform the authentication:
Request | AT+KP\r |
|
Response | +P<hex data> OK |
2 bytes (4 hex digits) |
Starting from v 1.6:
Set the Mifare Plus key
Request | AT+KX<hex data>\r |
16 bytes (32 hex digits) |
Response | OK |
Example:
Request | AT+KA000102030405\r |
|
Response | OK |
Key set to 00..05 type A |
Request | AT+K? |
|
Response | +A000102030405\r +UFFFFFFFF +XFF..FF OK |
returns current key type and value. (from v1.5) returns the UL. password (from v1.6) returns the MF Plus key |
Virtual Keyboard Control
Attention
This section is only applicable to the 3rd generation devices (ODRFID-N/M/E with the firmware versions 3.0 and above).
The 3rd generation devices have a dual USB interface - CDC (to which the current protocol description relates) and HID (seen by the PC as a keyboard). Unlike the 1st and the 2nd generation devices, the HID interface is keyboard-only (i.e. no protocol commands via this interface).
The keyboard may be switched on (the default) and off. Please note, that even when the keyboard is switched off only from the protocol point of view. The device will always present itself as a dual interface device, the PC will always see the keyboard, but no data will be "printed" when the keyboard is switched off.
When the keyboard is switched on, the SCAN2
mode "prints" the data to the keyboard according to the format string. The data is not duplicated to the CDC interface.
When the keyboard is switched off, the SCAN2
mode sends the data via the CDC interface according to the format string.
Note
When printing on the virtual keyboard if, for example the D
symbol needs to be sent, it will be as if the D
key on the keyboard has been pressed. Whether D
or something other (ex. a symbol from the other locale) will be printed and where it will be sent is entirely up to the operating system. The device has no control over it whatsoever.
Syntax:
Request | AT+H[0/1/?]\r |
? - query the current value0 - disable the keyboard1 - enable the keyboard |
Response | OK |
Example:
Request | AT+H?\r |
|
Response | +H1 OK |
The keyboard is enabled |
Request | AT+H0\r |
|
Response | OK |
The keyboard is now disabled |
13.56MHz frequency transceiver control
(for the "-M" revision only) Enable/Disable the high-frequency (13.56MHz) transceiver. Default: enabled.
Note
The 125kHz tags are always scanned first unless the low-frequency transceiver is disabled.
Bug
please consult the p.3 of the Errata
Syntax:
Request | AT+h[0/1/?]\r |
? - query the current value0 - disable1 - enable |
Response | OK |
Example:
Request | AT+h?\r |
|
Response | +h1 OK |
13.56 transceiver is enabled |
125kHz frequency transceiver control
(for the "-M" revision only) Enable/Disable the low-frequency (125kHz) transceiver. Default: enabled.
Note
The 125kHz tags are always scanned first unless the low-frequency transceiver is disabled.
Syntax:
Request | AT+m[0/1/?]\r |
? - query the current value0 - disable1 - enable |
Response | OK |
Example:
Request | AT+m?\r |
|
Response | +m1 OK |
125 transceiver is disabled |
125kHz Tag Mode Control
(for the "-M/-E" revisions only). This parameter defines how the T55x7 tags will be programmed (i.e. the coding (Manchester/BiPhase) and the speed (32 or 64 transitions per bit))
Syntax:
Request | AT+c[0/1],[0/1]\r |
? - query the coding (0 - Manchester, 1 - BiPhase) and the speed (0 - 64tpb, 1 - 32tpb) |
Response | OK |
Example:
Request | AT+c?\r |
Query the current state |
Response | +c0,1 OK |
Manchester coding with 32 transitions per bit is selected |
SAK
(for version 1.0F Apr 3 2018 and above, not supported since 1.5F)
By default Mifare SAK (Select Acknowledge Code) is appended to the UID in the scanning mode. This can be disabled/enabled using the +A
command.
Syntax:
Request | AT+A[0/1/?]\r |
? - query the current value0 - do not append SAK1 - append SAK |
Response | OK |
Example:
Request | AT+A?\r |
|
Response | +A=1 OK |
SAK will be appended |
Data selection (scanning mode)
(for version 1.0F Apr 3 2018 and above, not supported since 1.5F)
This setting controls data (UID or block) printed when a new tag is detected. 1
- UID, 0
- block, determined by the Block Number setting
Syntax:
Request | AT+U[0/1/?]\r |
? - query the current value0 - print block1 - print UID (the default) |
Response | OK |
Example:
Request | AT+U?\r |
|
Response | +U=1 OK |
UID will be printed |
Block number selection (scanning mode)
(for version 1.0F Apr 3 2018 and above, not supported since 1.5F)
In scanning mode the device continuously scans whether an RFID tag is present and prints UID or the selected block. This setting controls the block number being printed:
If the block does not exist or cannot be read (ex. due to an authorization failure) nothing is printed.
Syntax:
Request | AT+b[?/<value>]\r |
? - query the current value |
Response | OK |
Example:
Request | AT+b?\r |
|
Response | +b=0 OK |
Block 0 contents will be printed |
Request | AT+b1\r |
|
Response | OK |
Block 1 contents will be printed |
SCAN2 mode output format
(for version 1.3F Dec 17 2018 and above)
The format string syntax is the same for CDC and HID versions. Refer to the format description for the details. The default format is HU*\n
. The default mode (i.e. before the first occurrence of a
, d
, h
, or H
switch) is the upper-case hexadecimal.
Attention
All occurrences of the "\r" and "\n" sequences (i.e. 2 characters: '\' and 'r' or 'n') will be accepted and printed by the AT+F=...
and AT+F?
commands respectively, however, all occurrences of \r
and \n
symbols in the output string during tag scanning will be silently removed due to conflict with the general frame format.
The ';' character is reserved for the multi-command separator and if present in the format input will lead to an error or undefined behavior.
(starting from v3.2) When setting the format string &#HH
occurrences will be converted to a symbol with the ASCII code 0xHH
. For example instead of forbidden ;
symbol pass B
.
Syntax:
Request | AT+F[?/=<format>]\r |
? - query the current format string |
Response | OK |
Example:
Request | AT+F?\r |
|
Response | +F=HU*\n OK |
UID will be printed as upper-case hexadecimal symbols |
Request | AT+F=hB1%*\r |
|
Response | OK |
Block 1 contents will be printed as lower-case hexadecimal symbols |
Write settings to ROM
This command saves the current in-RAM setting to ROM, i.e. makes them permanent
Syntax:
Request | AT+P\r |
Response | OK |
Device Control
The following commands manage the RFID reader device itself:
Device Reboot
Reboot the device
Syntax:
Request | AT+Q\r |
Response | OK |
Firmware Update
Reboot the device and start the bootloader (this command may not be supported by some devices. If not supported, acts as AT+Q\r
).
Syntax:
Request | AT+X\r |
Response | OK |
Errata
P.1 Device Information
Firmware versions affected | up to and including v3.1 |
Action | Reading the reply to the 'ATI' command |
Expected data | 3 frames the 'product description' frame the 'serial number' frame the 'OK' frame |
Data received | 2 frames the 'product description' + 'serial number' frame, the 'OK' frame there is only one \r\n between the product description and the serial number instead of two |
Workaround | 1. Do not issue the 'ATI' command. 2. Configure the parser to divide frames by \r\n skipping the empty data between the two consecutive \r\n -s (i.e. the end of the previous frame and the start of the next frame) - currently all the devices have other means of data integrity control (USB, RS-485), there should not be extra characters between frames 3. Configure the parser to look for \r\nS/N bytes and amend them to \r\n\r\nS/N |
P.2 Security Level Switch
Firmware versions affected | from v3.0 to v3.1 |
Action | Switching level 1 to level 3 with the 'AT+J3' command |
Expected result | The tag is switched from level 1 to level 3 |
Actual result | The tag is left in level 1, the reader becomes unresponsive until rebooted |
Workaround | None. Please upgrade the firmware to the latest version available |
The switch from level 0 to level 1 works as expected.
P.3 Enable/Disable the 13.56MHz transceiver
Firmware versions affected | from 2.0 to 2.1 |
Action | Enable/Disable the 13.56MHz transceiver |
Expected result | The action has been performed |
Actual results | The action may have not been performed |
Workaround | Check the transceiver state (AT+h? ) and issue the enable/disable command the second time if the first one did not work |
P.4 Mifare Plus Authentication
Firmware versions affected | up to v3.1 (inclusive) |
Action | Reseting the authentication (AT+N0 ) |
Expected result | The action has been performed, authentication has been reset |
Actual result | The authentication has not been reset, ERROR received |
Workaround | None. Please upgrade the firmware to the latest version available |