Autor Téma: čtečka datamatrixu  (Přečteno 310 krát)

rustymattock

  • Host
čtečka datamatrixu
« kdy: 13-11-2017, 20:51:15 »
Dobrý den,

pro ty kteří znají průmyslové čtečky barkodů, které emulují ASCII, jako posloupnost znaků (NE jako jeden ucelený string):
Potřebuji z datamatrixu izolovat data které mě zajímají a pak celý řetězec zahodit, aby byl Edit připraved na čtení dalšího datamatrixu.
Data jsem odchytil, problém je zahodit celý načtený datamatrix, jelikož neumím zjistit, kdy už čtečka ukončila přenos/zapsala poslední znak.
Třeba někdo z vás už něco podobné řešil.


pro ty, kteří se čtečkou nepracovali:
problém lze popsat jako pole ASCII znaků, o předem neznámé velikosti, které se po jednom znaku připisují do Editu( to jest po každém znaku je spuštěna událost onChange).
Do procesu zapisovaní znaků nelze vstoupit (alespoň o tom nevím).
Potřebuji zjistit (ač se to jeví absurdně), kdy už zapsalo poslední znak :-)  ...ať můžu napsat  Edit.text:='';

P.S:
Dle specifikace/standardu (třeba zde, strana 12: http://www.nexteer.com/wp-content/uploads/Label-Requirements-Standards-DELJIT-Rev-18Feb2015.pdf ),
je úkol triviální záležitost, ale prax je žalostná. Datamatrixy (PDF417) jsou v cca 80% opatřeny pouze 2x Record separátorem (ASCII #30) ve zbytku ničím.
V těch 80% dávám zavděk i tomu málo, ale zbytek prozatím řeší dodatečný Button vedle Editu a tak nějak si to obsluha musí stiskem vymazat manuálně, až je přenos ukončen.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 1764
  • Karma: 72
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:čtečka datamatrixu
« Odpověď #1 kdy: 13-11-2017, 21:38:49 »
No a měřit kdy přišel poslední znak, a po takové sekundě to prohlásit za hotovo?
Embarcadero MVP - Czech republic

rustymattock

  • Host
Re:čtečka datamatrixu
« Odpověď #2 kdy: 13-11-2017, 21:58:59 »
občane, to nezní špatně.
Jelikož ale není žádná událost, která by stopla poslední časový interval (abych věděl, že je hotovo), musím spustit hned na začátku Timer.
Jestli někdo nepřijde s něčím elegantnějším, tak se toho chytnu.

Offline Martin Holík

  • Nováček
  • *
  • Příspěvků: 9
  • Karma: 0
    • Verze Delphi: 2009, XE, XE3, XE7, Lazarus
Re:čtečka datamatrixu
« Odpověď #3 kdy: 13-11-2017, 21:59:44 »
Neumí čtečka poslat sufix char - třeba TAB, nebo ENTER. Nebo se někdy využívá nějaký znak, který není tak často používán.

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 702
  • Karma: 40
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:čtečka datamatrixu
« Odpověď #4 kdy: 13-11-2017, 22:00:21 »
moje čtečky na konec posílaly line break
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

rustymattock

  • Host
Re:čtečka datamatrixu
« Odpověď #5 kdy: 13-11-2017, 22:19:09 »
království za ENTER
Dle té specifikace, kterou jsem přiložil mají datamatrixy posílat několik různých separátorů, se kterými uděláš cokoliv. Jen ta prax je poněkud jiná.

Ještě mě napadlo jít na to obráceně. První 3 znaky tvoří unikátní řetězec (nejspíš aby aplikace, kterých se to týká věděli, že jde o data specifického formátu). Tak vyčistím Edit vždy, když je zaznamenám, čili hned na začátku.
...což ale ve výsledku bude stejně pro obsluhu vizuálně docela nehezké.

Offline Martin Holík

  • Nováček
  • *
  • Příspěvků: 9
  • Karma: 0
    • Verze Delphi: 2009, XE, XE3, XE7, Lazarus
Re:čtečka datamatrixu
« Odpověď #6 kdy: 13-11-2017, 22:34:52 »
Království za ENTER :)
Ono někdy i za jakýkoliv speciální znak, který je zasílám jako suffix

Nicméně ta dokumentace popisuje formát čárového kódu, respektive jeho obsah, ale já jsem mířil na konkrétní HW čtečky čárových kódů do které se dá z pravidla nastavit co má poslat po úspěšném načtení čárového kódu (suffix char). Zatím se to dalo nastavit ve všech čtečkách, které jsem měl v ruce.

Jaký HW (čtečka) bude použit pro čtení tohoto kódu?

Offline PaJi

  • Nováček
  • *
  • Příspěvků: 1
  • Karma: 1
    • Verze Delphi: 5, XE7, Tokyo
Re: čtečka datamatrixu
« Odpověď #7 kdy: 14-11-2017, 01:44:59 »
Great
Rated 1 time
rustymattock: Trochu jsem se v tom kdysi hrabal také (dnes už to jen oprašuju), ale jediná spolehlivá cesta je skutečně jen přes ten suffix a popř. prefix. Vše ostatní co je závislé na nějakých časových prodlevách apod. je cesta do pekel obzvláště u Windows. Přes ty timeouty cesta opravdu nevede.

Martin Holík: Kdysi jsem pracoval právě s průmyslových scannerem, který byl schopen na konec přidat jen nul, naštěstí dvojitý, tzn Chr($00)+Chr($00). Musel jsem kvůli tomu trochu poladit načítací knihovnu - naštěstí to tehdá dávali i se zdrojáky (ale to už je opravdu hodně dávno).

Dnes už by téměř každý scanner měl umět přidat TAB, CR, LN, CRLN, <STX>, <ETX> To jsou ty nejběžnější.

Pak je ještě jedna cesta, pokud si tisknete i čárové kódy (tzn. že máte vnitřní uzavřený systém), tak ten suffix si dáte přímo do toho čárového kódu a vše pak testujete jako stream na výskyt znaku. Dělal jsem to tak, že jsem dal oddělovač, pak kontrolní číslici a jiný znak coby koncový suffix. Měli jsme i variabilní délku barkódu. V  tomto provedení to bylo velmi spolehlivé.
Pokud to máte jako celkový label (viz Váš odkaz), přidejte si jednu sekci na konec a tu považujte za ten suffix. Ale takhle od stolu je to jen teorie, jde spíše o nasměrování.

Držím palce.

Offline Jirka Ondricek

  • Mladík
  • **
  • Příspěvků: 56
  • Karma: 4
    • Verze Delphi: 10.1 Berlin
Re:čtečka datamatrixu
« Odpověď #8 kdy: 14-11-2017, 08:10:00 »
Excellent
Rated 1 time
Používáme v zaměstnání stovky čteček od mnoha výrobců. Zatím naprosto všechny umožňovaly nastavení a to buď sw od výrobce a nebo pomocí speciálních čárových kódů.

Také jsme ale narazili i na nutnost nechat čtečku tak jak je a pak jsme si většinou poradili pomocí obsahu kódu. Tzn. vždy jsme "věděli" co načítáme. Znali jsme např. délku kódu nebo nějaké znaky na definovaném místě., takže se dalo vytvořit nějaké pravidlo.

Každopádně souhlasím s tím, že využít časovou závislost povede jen k problémům teď nebo později.
Pokud ale opravdu je zadání číst naprosto libovolný kód bez nějaké definice, tak mne také jiné řešení nenapadá. :(

PS: ještě mne napadla jedna možnost, vytisknout si speciální label, který bude znamenat konec, tzn. zákazník načte ten hlavní a hned za ním tento ukončovací. Je mi samozřejmě jasné, že je to krkolomné a ještě to přidává práci.
« Poslední změna: 14-11-2017, 08:13:38 od Jirka Ondricek »

Offline raul

  • Plnoletý
  • ***
  • Příspěvků: 175
  • Karma: 10
    • Verze Delphi: FPC :D
Re:čtečka datamatrixu
« Odpověď #9 kdy: 14-11-2017, 11:03:07 »
Nektere ctecky se daly naprogramovat, ze posilali preffix a suffix, takze si na konec mohl dat svou sekvenci. Treba od symbologic (ci jak se menujou) jsem si nastavil oboje a slapalo to paradne.
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux

rustymattock

  • Host
Re:čtečka datamatrixu
« Odpověď #10 kdy: 14-11-2017, 19:40:18 »
Děkuji kluci za nápady.
 Řešení bylo tak moc na očích, až jsem ho neviděl.

Zejména Martin mě nasměroval správně, jelikož samozřejmě, že čtečka nespoléhá na jakoukoliv specifikaci formátu, ale má vlastní "tečku" na HW úrovni.
A samozřejmě, že je to Enter :-)    (zkoušel jsem všechny dostupné čtečky, které se mi dnes dostali do ruky).
Tam je ten problém, jelikož Edit, do kterého se datamatrix čte, ve své události onChange, zcela ignoruje ASCII #13.

Jestli má vlákno v budoucnu někomu pomoct, tak Memo pro záznam z čtečky ANO, Edit NE :-)

Offline Delfin

  • Hrdina
  • ****
  • Příspěvků: 363
  • Karma: 15
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
    • Ibi Yoyo :)
Re:čtečka datamatrixu
« Odpověď #11 kdy: 14-11-2017, 19:53:04 »
Tam je ten problém, jelikož Edit, do kterého se datamatrix čte, ve své události onChange, zcela ignoruje ASCII #13.

Jestli má vlákno v budoucnu někomu pomoct, tak Memo pro záznam z čtečky ANO, Edit NE :-)

Tomu nejak nerozumim ::) Jak TEdit ignoruje v OnChange znak CR? A co ma vlastne spolecneho vizualni komponenta s ctenim dat z portu?
« Poslední změna: 14-11-2017, 19:54:56 od Delfin »
A co chudinky ovce? Koupíš jim snad plovací vesty? Nebo jim nasadíš chůdy? Ještě lepší, kdybys je zkřížil s delfíny na ovce hopkavé!

rustymattock

  • Host
Re:čtečka datamatrixu
« Odpověď #12 kdy: 14-11-2017, 20:10:55 »
Delfín:
Čtečka přečte z datamatrixu tohle:
[)>0612S00011PERJ8ENF1741VPA2C5301432031PERJ8ENF1741V20P00036637352PE  Q500016K0V87018803SSFRJF769B009D    20T010115D090620189DD201706091T76996503660ZN 1ZPANASONIC ORIGINJP9108502

pak emuluje klávesnici a po jednom znaku to posílá do jakékoliv aplikace, která čte ASCII a má fokus (když v polovině řetězce přepneš fokus z Wordu, do poznámkového bloku, tak bude pokračovat v poznámkovém bloku)
No a Já to četl do Editu. Přečetl všechny ASCII (i ty dva #30 znaky co tam vidíš), ale nikoliv #13. Z čeho jsem usoudil, že konec mi čtečka nijak neohlásí

Offline Delfin

  • Hrdina
  • ****
  • Příspěvků: 363
  • Karma: 15
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
    • Ibi Yoyo :)
Re:čtečka datamatrixu
« Odpověď #13 kdy: 14-11-2017, 20:52:49 »
pak emuluje klávesnici a po jednom znaku to posílá do jakékoliv aplikace, která čte ASCII a má fokus (když v polovině řetězce přepneš fokus z Wordu, do poznámkového bloku, tak bude pokračovat v poznámkovém bloku)

Jo tak ::) Driver k te ctecce musel vymyslet nekdo s IQ prasku do peciva :) Nicmene, pro tento typ ctecky by Ti melo stacit obslouzit OnKeyDown prip. OnKeyPress komponenty:

Kód: Delphi [Vybrat]
  1. procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  2. begin
  3.   if Key = VK_RETURN then
  4.     ShowMessage('Code scanned!');
  5. end;
  6.  
  7. procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
  8. begin
  9.   if Key = #13 then
  10.     ShowMessage('Code scanned!');
  11. end;
A co chudinky ovce? Koupíš jim snad plovací vesty? Nebo jim nasadíš chůdy? Ještě lepší, kdybys je zkřížil s delfíny na ovce hopkavé!

rustymattock

  • Host
Re:čtečka datamatrixu
« Odpověď #14 kdy: 14-11-2017, 21:35:01 »
jo jasně. Já sám jsem zkoušel zda reaguje ENTER alespoň na KeyUp :-)
Ovšem nevím (byť jsem to nezkoušel), jestli tok znaků z čtečky vyvolá některou z událostí KeyDown, nebo KeyUp.  Spíš ne (stejně, jako když pošleš jakýkoliv znak do Editu z proměnné).

Vyměnit Edit za Memo bude nejrychlejší

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 702
  • Karma: 40
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:čtečka datamatrixu
« Odpověď #15 kdy: 14-11-2017, 22:21:32 »
Vyměnit Edit za Memo bude nejrychlejší

jo to je vono
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

Offline Delfin

  • Hrdina
  • ****
  • Příspěvků: 363
  • Karma: 15
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
    • Ibi Yoyo :)
Re:čtečka datamatrixu
« Odpověď #16 kdy: 14-11-2017, 22:23:51 »
jo jasně. Já sám jsem zkoušel zda reaguje ENTER alespoň na KeyUp :-)
Ovšem nevím (byť jsem to nezkoušel), jestli tok znaků z čtečky vyvolá některou z událostí KeyDown, nebo KeyUp.  Spíš ne (stejně, jako když pošleš jakýkoliv znak do Editu z proměnné).

Vyměnit Edit za Memo bude nejrychlejší

Zase nechapu proc. Psal jsi ze ta ctecka simuluje klavesnici a ze potrebujes zjistit kdy dorazil posledni znak. Proc teda nechces cekat na ten znak v udalosti stisku klavesy? Jak se "posila znak do Editu z promenne" bohuzel netusim :-[ :)

Ty radeji vymenis edit za memo a budes hledat na konci carriage return znak abys detekoval konec prenosu skenovaneho kodu? Nebo neco sofistikovanejsiho :)?
« Poslední změna: 14-11-2017, 22:27:04 od Delfin »
A co chudinky ovce? Koupíš jim snad plovací vesty? Nebo jim nasadíš chůdy? Ještě lepší, kdybys je zkřížil s delfíny na ovce hopkavé!

rustymattock

  • Host
Re:čtečka datamatrixu
« Odpověď #17 kdy: 15-11-2017, 00:07:38 »
Ano. budu čekat na #13, který do memo určitě dorazí.
Já vlastně žádný zázrak nechci. Pouze: Jestli došel ENTER, vymaž text.

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Jméno: E-mail:
Ověření:
Křestní jméno zpěváka Gotta: