Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
Delphi
Seriové rozhraní: Přenos souborů (5. díl)
seriovy port
16. ledna 2002, 00.00 | Přenos datových souborů přes sériový port - to je téma dnešního článku.
V minulých 2 dílech jsme se podívali na mobilní telefon a komunikaci s ním. Dnes to bude přenos souborů přes sériový port.
Někdy je potřeba přenést mezi 2 počítači přenést menší objem dat. Tento problém můžeme řešit různě: "natáhnout" provizorně síť, vypálit data na CD nebo "zkomprimovat" na více disket nebo použít sériové rozhraní. Posledně navrhované řešení se jeví jako nejlevnější a v mnohých případech i nejrychlejší. Stačí 2 konektory na COM porty ("samičí" Canon 9 nebo Canon 25), 3 vodiče požadované délky (nebo čtyřžilový telefonní kabel, kde využijeme 3 vodiče) a jednoduchý prográmek.
Výroba kabelu
K ověření funkčnosti programu použijeme univerzální přípravek popisovaný v 2. díle - na jednom "samičím" konektor Canon 9 (se zdířkami) spojte drátkem (nejlépe spájejte) vývody 2 (RxD) a 3 (TxD) - jsou na konektoru popsané. Cena konektoru se pohybuje okolo 10 Kč. Tím vytvoříme testovací smyčku - co pošleme se nám vrátí.
Kabel k propojení 2 počítačů ztohovíme tak, že spojíme vývod 5 (GND) na jednom konektoru a vývod 5 (GND) na druhém konektoru, vývod 2 (RxD) na jednom konektoru s vývodem 3 (TxD) na druhém konektoru a vývod 3 (TxD) na jednom konektoru s vývodem 2 (RxD) na druhém konektoru.
Ovládací program
Doufám, že jste se s těch konektorů nezbláznili a můžeme se pustit do psaní vlastního programu.
Pokud bychom chtěli přenášet čisté ASCII textové soubory, můžeme použít pro zápis funkci VaComm1.WriteText a pro čtení VaComm1.ReadText. Při přenášení většího množství dat je lepší pracovat s buffery a komponentou VaBuffer, kterou naleznete ve stejném balíčku komponent jako komoponentu VaComm - v VarianAsync32.
Program (projekt v Delphi), který zapisuje data ze souboru, čte ze sériového portu a ukládá do souboru naleznete zde. Využívá testovací smyčku - tedy 1 konektor. Pokud propojíte 2 počítače, budete potřebovat 1 program na každém počítači. Důležité je také nastavení čísla portu na každém z nich.
V následujích odstavcích popíši pouze postup řešení - doporučuji sledovat přiložený zdrojový text.
Zápis dat ze souboru
- nejprve soubor přiřadíme k proměnné typu file (procedura AssignFile) a otevřeme ho (Reset)
- zjistíme velikost souboru (FileSize) a uložíme ji do proměnné
- pošleme příjmacímu programu prefix, který bude obsahovat název a velikost souboru - pro příjmací program je důležitá velikost souboru (musí vědět, kdy má soubor uložit), viz níže
- načteme bloky dat (do bufferu) ze souboru (BlockRead) a posíláme je přes sériový port (VaComm.WriteBuf) tak dlouho, dokud se velikost poslaných dat nebude rovnat velikosti souboru (cyklus repeat until)
- zavřeme soubor (CloseFile)
Od přenosové rychlosti nastavené v komponentě VaComm Baudrate se odvíjí velikost bufferu zapisovaných dat. V příkladu jsem použil přenosovou rychlost 115200 b/s, tzn. maximálně 14 400 bajtů - velikost bloku dat jsem po pokusech zvolil 2048 bajtů. Ovšem nesmíme zapomenout na velikost bufferu zápisu komponenty VaComm Buffers.WriteSize. Doporučuji vyzkoušet (v programu má velikost 4096) - když je buffer moc malý, tak se "ztrácejí" data (program zapíše třeba 2x za sekundu 2048 bajtů a pokud je nastavena velikost např. 2048 bajtů, tak "nestíhá"), když je moc velký, tak zabírá paměť.
V přiloženém programu jsem ještě přidal ukazatel zápisu v procentech, informace o názvu a velikosti souboru a čas přenosu. Můžete také doplnit ukazatel přenosové rychlosti, předpokládanou dobu přenosu atd. nebo přidat funkci komprimace. To nechám na vás.
Čtení dat z portu
- do Formu vložíme komponentu VaBuffer, kterou svážeme s VaComm (položka Comm), aktivujeme ji (položka Active) a nastavíme velikost (položka Size) - tato komponenta vytvoří "překladiště dat" požadované velikosti
- nyní můžeme pracovat s událostí VaComm.OnRxBuf - tato událost se vyvolá tehdy, když přijdou na port data a uloží se do bufferu VaBuffer
- sem vložíme kód pro získání velikosti obsazeného prostoru (VaBuffer.BufUsed)
- blok dat z obsazeného prostoru přečteme a uložíme (VaComm.ReadBuf) do naší proměné typu pole
- zjišťujeme, jestli data v proměnné obsahují prefix (klíčové slovo, název a velikost posílaného souboru)
- pokud ano, tak čteme tyto informace a vytvoříme soubor pro zápis dalších dat a velikost posílaného souboru uložíme do proměnné, zbytek zapíšeme do nově vytvořeného souboru
- pokud ne, tak zapisujeme příchozí data do souboru
- uložíme velikost příchozích dat do proměnné a porovnáváme ji s velikostí souboru načtenou z prefixu, pokud se rovnají - přečetli a uložili jsem celý soubor a můžeme ho zavřít
Opět se od přenosové rychlosti se odvíjí velikost bufferu (VaBuffer) a bloku přečtených dat. Opět doporučuji vyzkoušet (v programu má velikost 4096 B) - když je buffer nebo blok dat malý, tak se "ztrácejí" data, když je moc velký, tak zabírá paměť.
V programu jsem přidal ukazatel čtení v procentech, informace o názvu a velikosti souboru a využití bufferu (VaBuffer) v procentech. Jako u zápisu můžete doplnit další ukazatele apod.
A co příště ? Podíváme se na něco jiného než je přenos dat (ať už do mobilu, periferie či počítače). Nechte se překvapit.
Obsah seriálu (více o seriálu):
- Sériové rozhraní v Delphi (1. díl)
- Sériové rozhraní v Delphi (2. díl)
- Sériové rozhraní a mobil (3. díl)
- Sériové rozhraní a mobil II (4. díl)
- Seriové rozhraní: Přenos souborů (5. díl)
- Sériové rozhraní: Vstupy a výstupy (6. díl)
- Ovládejte spotřebiče přes sériový port (7. díl)
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007