The GS character: setting up a scanner for GS1 and DataMatrix product codes
A GS1 DataMatrix with a lot and expiry date — and a track-and-trace product code — consists of several fields. Between the fields there is an invisible control character GS (Group Separator, code 29). If the scanner drops it, the fields stick together: the lot "eats" the following fields and the expiry date isn't recognised. On the phone handheld you set this up once.
What GS is and why it gets lost#
| Where it occurs | What happens without GS |
|---|---|
| GS1 DataMatrix and GS1-128 with a lot (AI 10) and expiry (AI 17) | the lot swallows the next fields, the expiry isn't read |
| Track-and-trace DataMatrix product codes | the code fails verification |
| An ordinary EAN/UPC barcode | there is no GS — nothing to set up |
The phone camera and the built-in scanner of an Android handheld usually pass GS through as is. It is most often lost by a scanner in keyboard (HID) mode: a keyboard has no key for character 29, so by default the scanner simply skips it.
What you need to start#
| What | Why |
|---|---|
| A 2D scanner (imager) | a 1D laser scanner can't read DataMatrix at all |
| The programming sheet of your model — a PDF on the vendor's site | the service barcodes that change the scanner's mode |
| A test GS1 DataMatrix code | to check the result with the wizard |
Step 1. Turn on GS output in the scanner#
In the programming sheet, find the section about GS / FNC1 / Group Separator (sometimes "non-printable character replacement" or "function key mapping"). The scanner should send, instead of the invisible character, a key the app understands:
| What the scanner sends | Understood by the app |
|---|---|
| F8 | yes |
| Ctrl+] | yes |
| Tab | yes |
| the character with code 0x1D ("as is") | yes |
Also check the Enter suffix after the code — without it the phone can't tell the scan has ended (a scanner without a suffix works too, but is distinguished from typing more slowly).
Step 2. Check with the wizard#
On Android, open "Scanner check" on the handheld home screen and scan a test code. The wizard reports one of three results:
| Result | Meaning |
|---|---|
| OK | the code arrived whole, GS is in place |
| Incomplete code | GS is lost — go back to step 1, the wizard suggests how to turn it on |
| OK with a warning | GS was lost, but the app restored it by the code template — better to set up the scanner anyway |
The wizard also shows the input speed (for a keyboard scanner). On iPhone there is no wizard — check the scanner with your first receiving: the app marks an incomplete code.
Built-in scanner of an Android handheld#
The built-in scanner passes the code to the app directly (broadcast), and GS usually arrives as is. If not, in the handheld's scanner settings (DataWedge on Zebra, "Scanner settings" on others) turn on GS1/FNC1 output and the DataMatrix and GS1 DataMatrix decoders. On Zebra the app's profile is created automatically with the right decoders.
Camera#
The phone camera reads DataMatrix together with GS — nothing to set up. If the code is small, move closer, turn on the torch or zoom.
Limitations#
- Restoring GS by template works only for track-and-trace codes; for GS1 with a lot and expiry the scanner has to be set up.
- The "Scanner check" wizard exists only on Android.
- We describe scanner settings from the vendors' documentation.
Troubleshooting#
| Symptom | What to check |
|---|---|
| The wizard says "Incomplete code" | GS isn't on, or is replaced by a key the app doesn't understand (not F8, Ctrl+], Tab, 0x1D) |
| The expiry from the barcode wasn't filled in | GS lost in the GS1 code — step 1 |
Extra ]C1, ]d2 characters after a scan |
the scanner sends the symbology identifier (AIM ID) — the app understands it, but for other programs it's better off |
FAQ#
Do I need GS if I don't work with track-and-trace codes?#
Only if your GS1 barcodes carry a lot and expiry and you want the phone to fill them in. For ordinary EAN codes — no.