Autor Téma: COM port do delphi XE3  (Přečteno 9272 krát)

Hugo

  • Host
COM port do delphi XE3
« kdy: 26-11-2013, 19:09:27 »
Zdravím, potřeboval bych po letech provést změny v jednom moc starém prográmku co komunikuje po sériové lince. Mám nyní delphi XE3 a komponenta COM portu z dob delphi 7 mi nejde do XE3 nainstalovat. Nemáte někdo zkušenost s nějakou COM port komponentou nejlépe free pro použití v aplikacích. Díky Moc.

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 577
  • Karma: 25
Re:COM port do delphi XE3
« Odpověď #1 kdy: 26-11-2013, 19:29:24 »
Třeba synaser nejde? Jinak můžeš zkusit něco z http://www.4itdevelopers.net/rs232_aneb_seriovy_port_v_delphi.aspx, třeba něco z toho půjde i v XE3

Hugo

  • Host
Re:COM port do delphi XE3
« Odpověď #2 kdy: 26-11-2013, 22:17:26 »
Dík sice mě trochu polekal hned první nefunkční odkaz na té stránce, pak jsem zkusil něco dole a zas nefunkční, ale pak se to pohnulo tím správným směrem.

Zítra to zkusím nainstalovat do delphi (na noťasu bez doku nemám COM vůbec)

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 577
  • Karma: 25
Re:COM port do delphi XE3
« Odpověď #3 kdy: 26-11-2013, 22:40:02 »
Dík sice mě trochu polekal hned první nefunkční odkaz na té stránce, pak jsem zkusil něco dole a zas nefunkční

Za to můžeš poděkovat blbounům, kteří teď provozují builder.cz. Dřív tam byla celkem slušná diskuze, po posledním upgradu to totálně rozes....li, takže to nemá snad ani jednu základní věc, kterou by člověk od fóra pro programátory čekal (třeba notifikace o tom, že přišla odpověď na otázku). Jinak máš minimálně dvě možnosti - url zkopírovat a dát do googlu, pokud to url najde, tak klikni na šipku a nech si zobrazit archiv. Druhá možnost je url vložit do archive.org a vybrat nějaký datum, kdy ten web ještě běžel. Minimálně tenhle odkaz to najde, pravděpodobně bude fungovat většina - https://web.archive.org/web/20100824234732/http://forum.builder.cz/read.php?12,1525150,1525150


Offline TLama

  • Guru
  • *****
  • Příspěvků: 597
  • Karma: 31
    • Verze Delphi: 7, 2009, XE3
Re:COM port do delphi XE3
« Odpověď #4 kdy: 26-11-2013, 22:43:51 »
Tak archiv builder.cz z let 2005 až 2012 je zkopírovaný i tady.

Offline Sender

  • Plnoletý
  • ***
  • Příspěvků: 184
  • Karma: 5
    • Verze Delphi: Delphi 7 Prof.
Re:COM port do delphi XE3
« Odpověď #5 kdy: 26-11-2013, 22:57:30 »
...
Zítra to zkusím nainstalovat do delphi (na noťasu bez doku nemám COM vůbec)
Synaser je součástí balíku knihoven SYNAPSE,které se neinstalují -pouze se přidají do Uses programu.
I já mám s knihovnou synaser pouze dobré zkušenosti.

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 577
  • Karma: 25
Re:COM port do delphi XE3
« Odpověď #6 kdy: 26-11-2013, 22:57:38 »
Tak archiv builder.cz z let 2005 až 2012 je zkopírovaný i tady.

taky možnost, akorát to asi není jak spárovat s těmi původními odkazy.

Offline Daniel_Andrascik

  • Guru
  • *****
  • Příspěvků: 575
  • Karma: 20
    • Verze Delphi: D2007, D10.4
Re:COM port do delphi XE3
« Odpověď #7 kdy: 30-11-2013, 09:02:20 »
...
Zítra to zkusím nainstalovat do delphi (na noťasu bez doku nemám COM vůbec)
Synaser je součástí balíku knihoven SYNAPSE,které se neinstalují -pouze se přidají do Uses programu.
I já mám s knihovnou synaser pouze dobré zkušenosti.

Takisto pouzivam a odporucam synaser. Spolahlive a priamocare riesenie, ziadna prihriata vcl komponenta, proste len pridas do projektu par unit a niede si vytvoris a inicializujes premenu typu TBlockSerial a jedeeees...

Offline geby

  • Plnoletý
  • ***
  • Příspěvků: 245
  • Karma: 17
    • Verze Delphi: 7, 2007, XE2, 10.2
    • Synapse
Re:COM port do delphi XE3
« Odpověď #8 kdy: 30-11-2013, 09:59:17 »
Rozhodne bych doporucil pouzit Synaser ze SVN snapshotu. Je tam par oprav.

Hugo

  • Host
Re:COM port do delphi XE3
« Odpověď #9 kdy: 09-12-2013, 09:44:49 »
Ahoj díky, jo ten COM něco odesílá, jak ho ale nastavit aby automaticky i přijímal data. Potřeboval bych nějak zjistit že přišla data a provést něco jako DataRead?

Hugo

  • Host
Re:COM port do delphi XE3
« Odpověď #10 kdy: 09-12-2013, 11:16:06 »
Na internetu nacházím jen řešení s Timerem (volání n krát za s) a to mi připadá dost .... našel jsem i řešení se samotným vláknem, jenže to je furt to samé jen místo timeru se to pořád honí ve vlákně, tak to nezatěžuje program. Posílám data do měniče a on mi odpoví jestli je zaslaná zpráva OK to by tím Timerem šlo, odpoví hned, ale pak jednou za čas hodí nějakou chybu a na tu bych chtěl zareagovat obsluhou nějaké události, jen nevím které a jak. Díky

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 577
  • Karma: 25
Re:COM port do delphi XE3
« Odpověď #11 kdy: 09-12-2013, 17:42:08 »
Na internetu nacházím jen řešení s Timerem (volání n krát za s) a to mi připadá dost .... našel jsem i řešení se samotným vláknem, jenže to je furt to samé jen místo timeru se to pořád honí ve vlákně, tak to nezatěžuje program. Posílám data do měniče a on mi odpoví jestli je zaslaná zpráva OK to by tím Timerem šlo, odpoví hned, ale pak jednou za čas hodí nějakou chybu a na tu bych chtěl zareagovat obsluhou nějaké události, jen nevím které a jak. Díky

normální mi přijde někde ve vlákně číst z portu s nastavením rozumného timeoutu, abys mohl reagovat třeba na požadavek na ukončení aplikace. Takže ti to bude většinu času viset ve čtení z portu.

Offline Daniel_Andrascik

  • Guru
  • *****
  • Příspěvků: 575
  • Karma: 20
    • Verze Delphi: D2007, D10.4
Re:COM port do delphi XE3
« Odpověď #12 kdy: 09-12-2013, 18:53:14 »
Na internetu nacházím jen řešení s Timerem (volání n krát za s) a to mi připadá dost .... našel jsem i řešení se samotným vláknem, jenže to je furt to samé jen místo timeru se to pořád honí ve vlákně, tak to nezatěžuje program. Posílám data do měniče a on mi odpoví jestli je zaslaná zpráva OK to by tím Timerem šlo, odpoví hned, ale pak jednou za čas hodí nějakou chybu a na tu bych chtěl zareagovat obsluhou nějaké události, jen nevím které a jak. Díky

co ja viem tak od win2000/XP vyssie sa to tak riesi vsade. V nizsich windowsoch bolo mozne reagovat na nejake nizkourovnove prerusenie a fakt sa to spravalo ako udalost. Ale v novsich windowsoch je to vsetko zaobalene uz v api funkciach windowsu vyssej urovne a ja som este ine riesenie nevidel. Ono aj vcl komponenty pre pracu s COMom maju udalost OnRecieve alebo nieco podobne, ale ak sa im pozries do utrob tak zistis ze komponenta ma vlakno ktore sa toci dookola a v pripade uspesneho precitania znakov na seriovom porte to vlakno vygeneruje udalost. Ale je to stale o tom istom. Ja som svojho casu robil jednoduchy terminal, ktory bud posielal znaky co som tukal do okna a zaroven vypisoval vsetko co sa vracalo. Riesil som to cez vlakno a execute metoda vyzerala nejako takto:

Kód: Delphi [Vybrat]
  1. procedure TTerThread.Execute;
  2. var
  3.   bTmp: Boolean;
  4. begin
  5.  
  6.   FRcvdString := '';
  7.   while not Terminated do
  8.   begin
  9.     try
  10.       if FSer.CanReadEx(10) then
  11.       begin
  12.         FRcvdString := FSer.RecvBufferStr(FSer.WaitingDataEx,0);
  13.         Nieco;
  14.       end;
  15.     except
  16.       Reaguj, loguj, ignoruj...
  17.     end;
  18.   end;
  19. end;
  20.  
  21.  


Obdobne by som riesil aj poslanie dat a cakanie na odpoved. Ziaden timer, proste by to bola nejaka postupnost prikazov SendBuffer, CanReadEx(1000) ak pride odpoved tak ReadBuffer a ak nic nepride tak nejake hlasenie o neuspesnosti vykonaneho prikazu alebo nieco podobne.
Tak ako povedal Mi.Chal je dobre zvolit vhodny timeout podla poziadaviek na rychlost reakcie atd.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3527
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:COM port do delphi XE3
« Odpověď #13 kdy: 09-12-2013, 19:55:31 »
co ja viem tak od win2000/XP vyssie sa to tak riesi vsade. V nizsich windowsoch bolo mozne reagovat na nejake nizkourovnove prerusenie a fakt sa to spravalo ako udalost. Ale v novsich windowsoch je to vsetko zaobalene uz v api funkciach windowsu vyssej urovne a ja som este ine riesenie nevidel.
Mam dojem, ze DOS vcetne grafickych nadstaveb Windows 3.x a 9x seriove porty nepodporoval vubec (pouze seznam portu) a programovalo se to na urovni HW. Pocinaje NT jsou k dispozici OVERLAPPED I/O, kterym se vytvori a preda synchronizacni objekt, ktery windows nastavuji do stavu signaled. Nejbezneji se to obsluhuje  podruznym  threadem, ktery ceka na udalosti pomoci WaitForMultipleObjects. Z pohledu stroje a inzenyrskeho pristupu je to nejlepsi reseni, ale IMHO ma smysl jen v komunikacnim SW a predpoklada dostatek znalosti v oblasti OS.

Z pohledu aplikaciho programatora je jednoduzsi pouzit synchronni knihovnu jako je Synser a obsluhu, jak ji naznacujes. Podruznemu threadu se stejne nevyhne, bude jen otazka, jak moc ho zprasi a bude zbytecne konzumovat strojovy cas...

Jinak obecne reseni to samozrejme nema, protoze krome TTY jsou znaky vetsinou formovany do nejakych packetu/vet. Udalost se generuje az po prijmu takoveho paketu popr. pri chybe prijmu.  Takze ten ovladac si nekde pro konkretni protokol musi takovy packet poskladat, musi resit jeho blokovou synchronizaci aj.

Offline geby

  • Plnoletý
  • ***
  • Příspěvků: 245
  • Karma: 17
    • Verze Delphi: 7, 2007, XE2, 10.2
    • Synapse
Re:COM port do delphi XE3
« Odpověď #14 kdy: 09-12-2013, 20:18:20 »
Dulezite je vedet, jaky je potreba komunikacni protokol. Tedy jak vypada to, co posilas ven a jak vypada odpoved. A je treba myslet primocare.

Co chces udelat? Poslat prikaz zarizeni a precist si odpoved! Jak vypada odpoved? Treba "CR" a odradkovani? Pak jednim radkem odeslu data, a hned na dalsim radku volam RecvString. Zadne cekani na data, zadne zjistovani, jestli uz neco prislo, nebo ne. Chci precist textovy radek s odpovedi, tak je proste prectu. Nic vic neni treba delat! Zadne eventy, nebo tak neco.

Od toho je to synchronni knihovna, tedy obsluzny program je synchronizovan s logikou veci. Kdyz chci z portu cist data, a ona jeste vsechna neprisla, program pekne pocka, dokud to vsechno neprijde. A protoze se muze stat, ze nejakou chybou to neprijde nikdy, definuje se u tech ctecich funkci timeout.

vzdycky kdyz v programech se Synapsi nebo Synaserem vidim timer, jezi se mi vlasy hruzou. Tak se to opravdu nema pouzivat.