Fórum témák

» Több friss téma
Fórum » Soros port kezelése Delphi ben
 
Témaindító: Thowra, idő: Ápr 19, 2009
Témakörök:
Lapozás: OK   2 / 3
(#) Hp41C válasza miki144 hozzászólására (») Feb 20, 2013 /
 
Szia!

Most nincs előtten a kód... Annyira emlékszen, hogy minden beállítás egy neki megfelelő felsorolásos típusbeli értékkel állítható. Nézd meg a TComPort property -eit a beállító ablakban. A soros paraméterek beállítására van a csomagban egy ablak is, ha a felhasználó által kiválasztandó beállítás a cél, akkor érdemes azt az ablakot megjeleníteni.
D7 -tel voltak problémáim az újrafordítással, de pár perc alatt leküzdhetők voltak.
(#) michael67 válasza miki144 hozzászólására (») Feb 20, 2013 /
 
Szia. A tcomport-ban nem vagyok otthon, de mellékelek egy delphi7-s alap progit, amit összedobtam. Remélem ez is segítség. Talán segít. Próbáltam rendesen felkommentezni. Szerintem szög egyszerű és rövid kód. Azt elfelejtettem, hogy ehhez nem kell komponens,
API-val megy. Úgyhogy a komponens macera elmarad.
A hozzászólás módosítva: Feb 20, 2013
(#) Istvanpisti válasza miki144 hozzászólására (») Feb 20, 2013 /
 
Szia !

Az Object Inspector-ban nézd meg a properties fülön található adatokat.
pl. a BaudRate-nek br1200-at adhatsz meg így ComPort1.BaudRate:=br1200.
De ahogy Hp41C is írta egyszerűbb a ComPort1.ShowSetupDialog; eljárást meghívni ekkor egy ablakban ki lehet mindent választani, amit akarsz.
A ComPort Library mellett vannak példák, ezeket érdemes átnézni, mert innen könnyebb megérteni a működést..

Itt egy kis kód is :
  1. procedure TForm1.Button_SettingsClick(Sender: TObject);
  2. begin
  3.   ComPort1.ShowSetupDialog;  //Itt lehet meghívni a ComPort beállítására szolgáló eljárást.
  4. end;
  5.  
  6.  
  7. procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
  8. var
  9.   Str: String;
  10. begin  // itt veszi a karaktereket a kiválasztott portról és kiírja a Memo-ba
  11.   ComPort1.ReadStr(Str, Count);
  12.   Memo.Text := Memo.Text + Str;
  13. end;
  14.  
  15.  
  16.  
  17. procedure TForm1.GREEN_PLUSClick(Sender: TObject);
  18. begin
  19.   ComPort1.WriteStr('1');  //a gomb megnyomásakor elküldi a kiválasztott portra az 1-et.
  20. end;
A hozzászólás módosítva: Feb 20, 2013

comport_1.jpg
    
(#) zenetom válasza michael67 hozzászólására (») Feb 20, 2013 /
 
Szia!
Bár még nem próbáltam ki élesben, de jól néz ki ez a program!
Főleg hogy alapból megy, komponens nélkül, direkt az oprendszert használva. Bár gondolom ha komponenst használok, fordítás után gondolom az is az oprendszert használja, nem kerüli meg 86ezer DLL-el, de majd megnézem.
(#) michael67 válasza zenetom hozzászólására (») Feb 20, 2013 /
 
Jól látod. Annak idején én is próbálgattam a comport komponenst de nem vált be.
Inkább neki ültem, és utána jártam ennek (itt és itt). Elég egyszer megírni és utána copy-paste
aztán annyi. Valóban fordítás után nyugodtan elengedheted a programod 'kezét', mert nem
kell dll és semmi más. Az is lényeges, hogy nem függsz annyira attól, hogy melyik Delphi verziót használod és melyik windows-t. Ez tényleg csak egy egyszerű port kezelés. Rajtad áll, hogy milyen komolyan akarod kezelni a portot. Ez szerintem feladat függő. Amit leírtál ahhoz ez szerintem majdnem elég.
(#) zenetom válasza michael67 hozzászólására (») Feb 20, 2013 /
 
Köszi a linkeket!
Most gyorsan belenézve az általam használt komponensbe, úgy néz ki, ez is az oprendszert használja, kb. ugyanazzal az eléréssel, mint a linken leírt módszer, szóval nem kell neki külön dll, vagy bármi más. A "DLL Export Viewer" program sem lát semmilyen extra dll-t, amit meghívna a Delphis program (tudom ajánlani ezt a viewer programot, hasznos tud lenni )
Viszont ez megnyugtató, mert akkor a komponens nem bonyolítja meg a port elérést.
Ennek ellenére ha lesz időm, beleásom magam az alapokba. Végülis régóta foglalkozok már ilyennel, csak abba még nem ástam bele magam, hogy az operációs rendszer hogy kezeli le.
(#) michael67 válasza zenetom hozzászólására (») Feb 20, 2013 /
 
Szívesen. A komponens ugyanezeket használja, valóban. Az ajánlott progit én is ismerem köszi.
Sok sikert
(#) miki144 hozzászólása Feb 21, 2013 /
 
Sziasztok.

Köszönöm a segitséget, hozzászólásokat.
Mindegyikből tanultam, valamit.

Elkezdtem összerakni egy kis programot, de hibaüzenetet kaptam.

De miért????( Button1)
Más megirt példaprogram-ban tökéletesen münködik.
Csak ebben nem.( Count -érték)
Valami kis hiba lehet csak.
De még nem találtam meg, hogy mi lehet az.


A progi tömören.

1. port megnyitása
1/1 port meglétének ellenőrzése---- ezt késöbb beleirom
2. adatküldés a port-ra
3. adatok fogadása----------a hiba innentől kezdve
3/1 amig adatforgalom van, nem megy tovább a progi----------ezt késöbb beleirom
4. port bezárása




Hali
(#) miki144 hozzászólása Feb 22, 2013 /
 
Sziasztok.

Igy néz ki, hibaüzenet nélkül.

--------------------------------------------------------------------------------------------

procedure TForm1.Read1Click(Sender: TObject );
var
Str: String;
Count: Integer;

Begin
ComPort1.Open;
sleep(2);
ComPort1.WriteStr('1'); // Elküldi az 1-es helyére beirt karajtersorozet-ot
sleep(2);
begin
Memo1.Clear;
ComPort1.ReadStr(Str,Count);
Memo1.Text := Memo1.Text + Str;
end;

ComPort1.Close;

end;

-------------------------------------------------------------------------------------------


máshogyan nem tudtam megoldani.

Hali
(#) michael67 válasza miki144 hozzászólására (») Feb 22, 2013 /
 
Igen. Ez így jó. Te szerintem összekeverted ezt :
Idézet:
„TForm1.ComPortRxChar(Sender: TObject; Count: Integer);”

ezzel
Idézet:
„TForm1.Button1Click(Sender: TObject; Count: Integer);”
<- itt az a baj, hogy hozzáírtad a Count:Integert-t
A kettő nem ugyanaz
(#) Hp41C válasza miki144 hozzászólására (») Feb 22, 2013 / 1
 
Szia!
Az adás és a vétel kezelésére írj különálló eljárásokat, ne tedd a két funkciót egy kiszolgálóba. Ekkor a sleep -eket ki lehet venni a programból.
Az adási és a vételi oldalra is tegyél egy memo -t a küldendő táviratok átmeneti tárolásához.
(#) michael67 válasza miki144 hozzászólására (») Feb 22, 2013 / 1
 
Átnézegettem a progidat és egy 'kicsit' belenyúltam. Írtam hozzá megjegyzéseket.
Valóban célszerűbb úgy csinálni, ahogy Hp41C kolléga mondja. Így fejlesztgetés során
könnyebb követni a dolgokat. Pláne , ha az egészet még csak tanulgatod.
Bár magam részéről egy pár kisebb progit már írtam Delphiben, gyakran csinálok egy
plusz ablakot ahol loggolom a programomat. Pl adott lépéseknél kiíírom egy ablakba, hogy
a port megnyitása meg volt vagy konverzió elkezdve utána pedig befejezve .
Ajánlok még egy port loggert ahol követni tudod, hogy a programod mit is csinál. Pl:ezt
(#) miki144 válasza michael67 hozzászólására (») Feb 23, 2013 /
 
Sziasztok.(Hp41C és michael67)


WriteStr és ReadStr funkciót egy időben kell használnom.


Tesz alany egy beltéri.

A régi szofver-e úgy münködik, amit házilag irtak meg hozzá VB6-ban hogy.

Read funkció alatt.(csak tömören)

Port megnyitás
Adatküldés (121212121)
Amire a beltéri válasza egy adathalmaz.( pl: beltéri szoft verzió )
Port bezárása.

A forrását nem kaptam meg, de az utasitásokat igen. ( gyakorolni jó lesz.)
és a végén a progit se.


A kis példaprogramok-ban a végén szoktam beleirni a memoárokat, ha már münködik a szoftver, vagy ha már túl nagy.
E nélkül pár hét múlva nem emlékeznék rá hogy mit milyen funkció-val láttam el stb.
Egy nagy szoftver, kisebb példaprogramokból szoktam megirni és összerakni.
Ebben az esetben csak szigorúan a sorosport kezelés a leg első lépés.

Tehát visszatérve az elejére READ funkció alatt egy idő-ben kell üzemelnie sorrendben a WriteStr és ReadStr utasitásnak.

A módósitott példaprogramot köszönöm.
Ahogyan átnéztem sokat tudok belőle megint tanulni.
A sorosporti részhez mostanra jutottam el.
Ez számomra a következő szint.
Ez a programot meg én követtem el, több ember kérésére.
Bővebben: Saját megirt progi LAZARUS alatt



Kérdésem hogy ezt a procedúr-át hogyan tetted bele a szoftverbe.
Ez nem tiszta csak számomra.



type
{{{ procedure ComPort1RxChar(Sender: TObject; Count: Integer); }}}

-----------------------------------------------------------------------------------
És a hozzá tartozó
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
inStr : string; {Adatok fogadására használt változó}
inCount : integer; {Adatok számlálásához használt változó}
begin
ComPort1.ReadStr(inStr,inCount); {Beolvassuk az adatokat}
Memo2.Lines.Add(inStr); {A beolvasott adatokat kiírjuk memo2-be}
end;


-------------------------------------------------------------------------------------------


Hali
(#) michael67 válasza miki144 hozzászólására (») Feb 23, 2013 / 1
 
Szia. Félre ne érts, pusztán csak segítségként írjuk, amit írunk. Részemről pusztán jó tanácsok. A megjegyzéseket pedig azért írtam, hogy éthetőbb legyen a dolog. Részemről az esetek többségében nem adatott meg a lehetőség, hogy rendelkezzem a kommunikáció adataival Ezeket nekem kellett kibogozni , ezért írtam, hogy segítség egy ilyen kis ön loggolás. Mellesleg szívesen segítek , mert így karban tartom az ez irányú tudást. Éppen egy soros porti programot stoppolgatok én is gyakorlásképpen. (Mostanság elég sok időm van ilyesmit csinálni sajna )
A kérdésedre pedig a válaszok:
- nem tettem bele sehogy. A komponensben benne van
Az object inspector események fülére kattintva megtalálod. (kép melléklet)
- Az egyidejű kezelés így valósul meg lényegében, mivel ez egy beérkező karakterre
bekövetkező esemény (procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer).
Igazából amit módosítottam program nem tökéletes még így sem csak alap , útmutató. Mint mondtam nem használom ezt a komponenst jobban szeretem külön megírni.
(csak a segítség miatt tettem fel)
Néhány jó tanács (ismétlem jó tanács. Írtam hasonló programokat abból merítve):
- Én szálkezeléssel oldanám meg a problémát.
- A fejlesztés alatt amíg írtam a progit, összekötöttem az Rx és Tx-et és így figyeltem, hogy milyen gyorsan és pontosan tud a program reagálni a vételi oldalon.
- Az msdn szerint a Timeoutokat minden programhoz magadnak kell belőni.
'Röviden' ennyi De, ha gondolod írj privátba és segítek, ha tudok.
A hozzászólás módosítva: Feb 23, 2013

komponens.jpg
    
(#) miki144 hozzászólása Feb 23, 2013 /
 
Üdv michael67.


A példaprogramokat én is tanulásra használom fel.
Irányitásra pedig szükség van.
Alap útmutatónak nagyon jó a példaprogramod.
Nagyon sok mindent fel tudok használni a programom-hoz belőle.

Hali.
(#) kiborg hozzászólása Jan 1, 2014 /
 
Sziasztok!

Elkezdtem én is ismerkedni Delphivel és ezzel a sorosport kezeléssel.
Felhasználtam bizonyos részeit a mintaprogramoknak és ezzel kapcsolatban lenne kérdésem.
Ha elküldök terminálból 5-6 karakterből álló szót, akkor az 9600 vagy nagyobb sebességen egyben megérkezik, viszont ha 4800 vagy alá csökkentem a sebességet, akkor tördelve jelenik meg a vételi oldalon? (egyelőre csak vételképes a programom, adás nincs tesztelve)
600as baud raten már karakterenként tördeli.
Vélemény?
Kiborg
(#) michael67 válasza kiborg hozzászólására (») Jan 5, 2014 /
 
Szia! Nem tördelve jelenik meg szerintem (9600 alatt nem nagyon használtam soros portot) . Elviekben te folyamatosnak fogod érzékelni, 5-6 karakter esetén.
(#) hg5cfj hozzászólása Aug 10, 2014 /
 
Üdv Mindenkinek

Olvastam a hozzászólásokat, sokat segített a comport programozásban. Viszont van egy problémám:
A fenti példaprogramok alapján készítettem egy próba programot - egy adó vevő - vezérléséhez. A probléma az, hogy az elküldött parancsra kapott választ nem írja ki a progi. Ellenőriztem a rádió elküldi a választ mégsem kerül kiírásra.
Példa a kommunikációra: comport.WriteStr ('ID;'); vagyis elküldöm a rádiónak az ID; parancsot, amire a rádió az ID0310; karaktereket küldi válaszként.
Mellékletként csatolom a próba programot is

A másik kérdésem hogy lehet ellenőrizni a com port foglaltságát, még a csatlakozás előtt.

thx
Samu

FT-950.ZIP
    
(#) zenetom válasza hg5cfj hozzászólására (») Aug 10, 2014 /
 
Szia,
Mivel a programkód csak be lett írva (vagy másolva), a fogadáshoz tartozó rész gyakorlatilag sose hajtódik végre, mert nem a ComPort eventhez lett írva. Ezt egyszerűen meg lehet oldani, a csatolt kép szerint a Comport eventnél az onrxchar-nál válaszd ki a legördülő menüből az eljárást.
Szerk.: most nézem, ez pár hsz-el följebb is van egy ilyen kép.
A hozzászólás módosítva: Aug 10, 2014

Névtelen.png
    
(#) hg5cfj válasza zenetom hozzászólására (») Aug 10, 2014 /
 
Igen azt észre vettem, ennek ellenére olyan mintha nem hajtódna végre, pedig a terminál ablakban látszik hogy érkezik szöveg. Csak mintha feldolgozásra nem kerülne.

delphi.jpg
    
(#) zenetom válasza hg5cfj hozzászólására (») Aug 10, 2014 /
 
Közben belenéztem a kódba is, van benne egy kis hiba.
Javítsd ki erre:

  1. procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
  2. var
  3.   instr:string;
  4. begin
  5.   Comport.ReadStr(instr, count);
  6.   AnsEdit.Text:=AnsEdit.Text+instr;
  7. end;
(#) hg5cfj válasza zenetom hozzászólására (») Aug 11, 2014 /
 
Köszi.
Bár ez csak annyit tesz, hogy az "Ansedit.text" meglévő értékéhez adja hozzá az "instr" értékét. Ahogy én írtam az minden esetben felülírja az előző értéket. Az lehet, hogy Win7-el van a probléma.
Samu
A hozzászólás módosítva: Aug 11, 2014
(#) zenetom válasza hg5cfj hozzászólására (») Aug 11, 2014 /
 
Nálam viszont jól működik. Win7 alatt. Végrehajtódik egyáltalán a "ComPortRxChar" esemény? (Rakj bele pl. egy showmessage-t, hogy lásd.)
(#) hg5cfj válasza zenetom hozzászólására (») Aug 11, 2014 /
 
Köszi az ötletet, ki is derült. Nem fut le az OnRxChar esemény. Ezzel kiderült, nem a delphivel és a programkóddal van a probléma.
Köszönöm mindenkinek az ötleteket.
Samu
(#) Lamprologus hozzászólása Feb 2, 2016 /
 
PIC-el küldök egy stringet a PC-nek, az alábbi eljárással. Látszólag jól működik, (bár az "entert" nem látja), de amikor a stringet akarom tovább variláni akkor kiderül, hogy a küldött karakter sorozatot két részletben olvassa be, először csak az elő karakter kerül a stringbe, majd a küldött karakterlánc többi része. Tehát kétszer fut le a procedure. Ennek mi lehet az oka?
(Ha a terminalablakban nézem az érkezett adatokat akkor azt látom amit küldtem. )
  1. procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
  2. var
  3.   Str: String;
  4. begin  
  5.   ComPort1.ReadStr(Str, Count);
  6.   Memo.Text := Memo.Text + Str;   // Ezt a sor kihagynám és az Str stringet dolgoznám fel...
  7. end;
A hozzászólás módosítva: Feb 2, 2016
(#) zenetom válasza Lamprologus hozzászólására (») Feb 2, 2016 /
 
Ez nálam is így működött. Valószínűleg azért, mert ilyenkor egy bufferből olvasunk, és lehet az érkezett adat "nem fér" bele mind a bufferbe, ezért két (vagy több) részletben olvassuk ki (azaz többször veszi elő az oprendszer a buffert).
Bár ez csak tipp, de szerintem valami hasonló dolog lehet a háttérben.
A hozzászólás módosítva: Feb 2, 2016
(#) Lamprologus válasza zenetom hozzászólására (») Feb 2, 2016 /
 
Mindegy mennyi karaktert küldök (5-25 között próbálgattam), első körben egyet olvas be, utána a többit ...
(#) zenetom válasza Lamprologus hozzászólására (») Feb 2, 2016 /
 
Ez esetben viszont lehet az adó oldalon van valami.. Nem lehet, hogy van egy kis szünet az 1. byte után?
(#) Lamprologus válasza zenetom hozzászólására (») Feb 2, 2016 /
 
Nem hinném...
  1. printf(usb_cdc_putc,"567%u:%u 12345678901234567890\n\r",cim,adat);

Kizárt, hogy ebből a fordító olyant generáljon aminél az első 5-ös után van egy szünet!

Nekem inkább az kezd gyanús lenni, nem-e a ComPort komponensben van a hiba.
4.11-est telepítettem de ha jól látom van már 4,14-es verzió is, csak azt még nem tudtam eltölteni sehonnan sem.
A hozzászólás módosítva: Feb 2, 2016
(#) zenetom válasza Lamprologus hozzászólására (») Feb 2, 2016 /
 
Na nekem valahol van valami komponens nélküli kódom, mindjárt előkaparom. Bár az azt hiszem teljesen máshogy működik...
A hozzászólás módosítva: Feb 3, 2016
Következő: »»   2 / 3
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem