Seriové rozhraní: Přenos souborů (5. díl) - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

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

  1. nejprve soubor přiřadíme k proměnné typu file (procedura AssignFile) a otevřeme ho (Reset)
  2. zjistíme velikost souboru (FileSize) a uložíme ji do proměnné
  3. 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
  4. 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)
  5. 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

  1. 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
  2. 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
  3. sem vložíme kód pro získání velikosti obsazeného prostoru (VaBuffer.BufUsed)
  4. blok dat z obsazeného prostoru přečteme a uložíme (VaComm.ReadBuf) do naší proměné typu pole
  5. zjišťujeme, jestli data v proměnné obsahují prefix (klíčové slovo, název a velikost posílaného souboru)
  6. 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
  7. pokud ne, tak zapisujeme příchozí data do souboru
  8. 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):

Tématické zařazení:

 » Rubriky  » Delphi  

 » Rubriky  » Windows  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: