Dekódování znaků

No to nemáš vůbec zač :wink: Pokud můžu doporučit: EM4100 používá pro ID 32 bitů (+ 4 paritní) - využívej to všechno. Měli jsme v praxi případy, že si klienti (což byly firmy, které buď dodávaly nebo si samy nainstalovaly přístupáky) vybrali jen několik bajtů z toho ID, a pak se strašně divili když si po čase dokoupili další karty odjinud, že “zničehonic” nemají unikátní ID a mají víc “stejných” karet. Dokonce jsme měli jeden “príma” případ, kdy si z toho ID počítali hash a až ten vyhodnocovali, ale počítali ho špatným algoritmem, takže opět byl výsledek neunikátní. Sranda k popukání (obzvlášť když máš jako technik dohledávat “proč to nefunguje”).

Dál se zeptám: Kam to teda posíláš, když říkáš že přes UART ti to běhá také?

Jinak teda počítej se mnou (pro ten PIC, dejme tomu že si budu myslet, že tvoříš offline terminál, kdyby nebylo spojení s nadřazeným systémem): třeba 56 klientů (ať je nějaká rezerva) * 8 bajtů + “\n” (nebo něco podobného, prostě ať víš, kdy je konec řetězce a neprohledáváš donekonečna; C používá \0 ) = 560B ve flash jenom tabulka, takže vzhledem k tomu, že pomocí ADDWF PCL,F můžeš skákat jen o 127 adres bude už trochu pakárna (+ případně ještě zohlednit stránkování flash paměti). Píšeš to aspoň v C?

Další nevýhoda je, že jakákoliv aktualizace užavetelských data = přeprogramování PICu pokud budou ve flash, a nebo použít externí EEPROM a mít v programu funkce, které to budou umět updatovat skrze ten UART. Máš tam aspoň tu EEPROM?

K tomu porovnávání: V paměti máš pole znaků, záznamy v něm jsou pokaždé zakončené tím “\n”, a v RAM máš někde uložené číslo, které jsi právě vyčetl z nějaké karty. Pak se bude dít to, že vezmeš první záznam z flash, a jeho první bajt porovnáš s prvním bajtem vyčteného. Pokud se budou shodovat, vezmeš druhý bajt z obojího a opět porovnáš, pokud se budou shodovat tak… toto pořád dokolečka, dokud buď a) dojde k neshodě - v takovém případě nemusíš záznam už dál porovnávat, není to on, a můžeš vzít další záznam, na kterém začneš provádět to samé zase od začátku - nebo b) dokud nenarazíš na “/n”. Pokud jsi došel až k \n, tak víš že onen záznam je ten, který hledáš, další záznamy už nemusíš prověřovat. Po záznamech v tabulce skáčeš tak, že před ADDWF PCL,F přičteš ještě index záznamu, což bude pořadí záznamu * 10 (velikost záznamu) - a samozřejmě dáváš pozor na přetečení a podobné srandy.

Přiřazení jména by šlo udělat třeba tak, že tam budeš mít ještě jednu tabulku, ve které budou ona jména, a podle (předchozího získaného) indexu záznamu jen přiřadíš jméno. Nebo to třeba nemusí být další tabulka, může to být po sobě v té jedné a v případě shody záznamu jen pokračuješ dál - struktura dat uložených v paměti je jen na tobě, aby se ti to dobře zpracovávalo i programovalo.

Je to trochu srozumitelné?