Seriportu kullanan cihaz takıldığında kullandığı portu bulma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

Seriportu kullanan cihaz takıldığında kullandığı portu bulma

Mesaj gönderen baloglurecep »

Arkadaşlar selam ve syagılar... Cport bileşeni kullarak bir seri port okuyorum. Okumada problem yok. sıkıntı şu. Cihaz takıldığında takıldığı usb portuna göre bir seri portta yerleşiyor. Bu değişken olabiliyor. aynı bilgisayarda bile değişiyor. (seri portu usb ye çeviren convertör kullanılıyor). Ben cijazla haberleşebilmem için takıldığında yerleştiği porun numarasını alıp o portu okumamam gerekiyor. Yoksa kullanıcı bir sürü işlem yapmak zorunda kalacak. bunu nasıl yapabilirim. cihaz takıldığında ben o cihazın kullandığı port numarasını alıp o portu connect yapabileyim. yada ben cihazın kontrol ettiği portu değiştirebilyeim. cihaz takıldığında 8 nolu porta yerleştiyse ben bunu 20 olarak değişebileyim. cihaz aktif olarak o portu kullansın. her iki durumda benim işmi görür.

cevaplarınız için teşekkürler...
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Re: Seriportu kullanan cihaz takıldığında kullandığı portu bulma

Mesaj gönderen ikutluay »

baloglurecep yazdı:Arkadaşlar selam ve syagılar... Cport bileşeni kullarak bir seri port okuyorum. Okumada problem yok. sıkıntı şu. Cihaz takıldığında takıldığı usb portuna göre bir seri portta yerleşiyor. Bu değişken olabiliyor. aynı bilgisayarda bile değişiyor. (seri portu usb ye çeviren convertör kullanılıyor). Ben cijazla haberleşebilmem için takıldığında yerleştiği porun numarasını alıp o portu okumamam gerekiyor. Yoksa kullanıcı bir sürü işlem yapmak zorunda kalacak. bunu nasıl yapabilirim. cihaz takıldığında ben o cihazın kullandığı port numarasını alıp o portu connect yapabileyim. yada ben cihazın kontrol ettiği portu değiştirebilyeim. cihaz takıldığında 8 nolu porta yerleştiyse ben bunu 20 olarak değişebileyim. cihaz aktif olarak o portu kullansın. her iki durumda benim işmi görür.

cevaplarınız için teşekkürler...
aynı compnentle bende yapmıştım bu işi. şöyle idi. cihazın kullandığı dll de cihaz aktifmi diye bir fonkyion vardı. bende bir döngü cihar aktif alana kadar döngüye sokup port değerini bulmuştum. sende bir döngü ile porta bir şeyler yazmayı dene yada benim kullandığım gibi bir chaz ise öyle yap (cs1504)
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

Re: Seriportu kullanan cihaz takıldığında kullandığı portu bulma

Mesaj gönderen baloglurecep »

ikutluay arkadaşım teklrar selamlar....
cihazı yapan üretici arkadaşa birde şunu yaptırdım. porta S harfi yazdırdığımda cihaz bana geri O hrfini döndürüyor. bir döngü ile tüm portlara S harfi yazdırıp ine tüm portları döngü ile okumam lazım. geri gelen veriyi aldığımda o verini geldiği port benim cihazın aktif portu olacak. döngüler kuyrmaya çalıştım. yalnız hata verdi. bu döngüyü nasıl yparım...
cozturk
Üye
Mesajlar: 484
Kayıt: 15 Haz 2005 05:22

Re: Seriportu kullanan cihaz takıldığında kullandığı portu bulma

Mesaj gönderen cozturk »

Try
döngü..
except end
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

Re: Seriportu kullanan cihaz takıldığında kullandığı portu bulma

Mesaj gönderen baloglurecep »

selamlar tekrar arkadaşlar sanırım tam anlatamadım derdimi...

bu kısım döngü ile 100 e kadar olan portları açıp (com1,com2,com3....com100) gibi porta S harfi göndermek. aynı zamanda portu da okuduğum için okunan dğer edite yazılmakta. . cihaz yapılış formatıyla ilgili olarak S geldiğinde porta O geri dönmekte. bende editte O yu gördüğümde döngüyü sonlkandırıyorum ve O harfinin geldiği portun port nosunu alıyorum.

for a:=1 to 100 do begin
try
comport1.comport:=inttostr(a);
comport1.writestring('S');
comport1.close;

if edit1.text='O' then begin
break;
buton.caption:=comport1.port;

except;
end;
end;


sanırım anlatabildim....
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Re: Seriportu kullanan cihaz takıldığında kullandığı portu bulma

Mesaj gönderen ikutluay »

baloglurecep yazdı:selamlar tekrar arkadaşlar sanırım tam anlatamadım derdimi...

bu kısım döngü ile 100 e kadar olan portları açıp (com1,com2,com3....com100) gibi porta S harfi göndermek. aynı zamanda portu da okuduğum için okunan dğer edite yazılmakta. . cihaz yapılış formatıyla ilgili olarak S geldiğinde porta O geri dönmekte. bende editte O yu gördüğümde döngüyü sonlkandırıyorum ve O harfinin geldiği portun port nosunu alıyorum.

for a:=1 to 100 do begin
try
comport1.comport:=inttostr(a);
comport1.writestring('S');
comport1.close;

if edit1.text='O' then begin
break;
buton.caption:=comport1.port;

except;
end;
end;


sanırım anlatabildim....
componnt O yu edit 1 e atacağını nerden biliyor onu anlamadım
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

Re: Seriportu kullanan cihaz takıldığında kullandığı portu bulma

Mesaj gönderen baloglurecep »

ikutluay arkadaşım selam tekrar.

butona for döngüsü için kodu yazdım. bu döngü ile porta S yi gönderiyorum. bir taraftanda portu dinliyorum. başka kodlarla orda porta veri geldiğinde edite yazıyor. bende döngüde aynı zmanda editi kontol ediyorumkli O geldiğinde döngüyü sonlandırayım.
sanırım anlatabildim.
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

Re: Seriportu kullanan cihaz takıldığında kullandığı portu bulma

Mesaj gönderen baloglurecep »

tekrar selam arkadaşlar....

kullanılan seri portları bir listboxa aktaran fonction buldum. gayet güzel çalışıyor. onda sorunum yok. belki yararı olur diye kodları ekleliyorum.

ana var bloğundan itibaren aldım




COM_SAY:INTEGER;

implementation

USES Registry;// EKLEMEYİ UNUTMAYIN

{$R *.dfm}

function ValidateComPort(ComPort : PChar) : boolean;
var PortHandle : THandle;
begin
PortHandle := CreateFile(ComPort,GENERIC_READ OR GENERIC_WRITE,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if (PortHandle = INVALID_HANDLE_VALUE) then begin
result := false;
end else begin
result := true;
CloseHandle(PortHandle);
end;
end;

procedure GetComPortList(AList : TStrings; AOnlyAvail : boolean = false);
var AReg : TRegistry;
ADeviceList : TStrings;
lp0 : integer;
AAddPort : boolean;
ACurrPort : string;
begin
if Assigned(AList) then begin
AReg := TRegistry.Create;
try
AReg.RootKey := HKEY_LOCAL_MACHINE;
AReg.OpenKeyReadOnly('hardware\devicemap\serialcomm');
ADeviceList := TStringList.Create;
try
AReg.GetValueNames(ADeviceList);
AList.Clear;
for lp0 := 0 to ADeviceList.Count-1 do begin
ACurrPort := AReg.ReadString(ADeviceList.Strings[lp0]);
if AOnlyAvail then begin
AAddPort := ValidateComPort(PChar(ACurrPort));
end else AAddPort := true;
if AAddPort then AList.Add(ACurrPort);
end;
finally
ADeviceList.Free;
end;
AReg.CloseKey;
finally
AReg.free;
end;
end;
end;


YUKARDAKİ KODLARLA BİR LİST BOXA KULLANILAN PORTLAR LİSTELENİYOR.
ÖRNEĞİN ;
GetComPortList(Listbox1.Items,false);// LİST BOXA AKTİF PORTLARI LİSTELE;

ben list boxta listelenen portları sırayla döngüye sokup her porta "s" harfi gönderiyorum. döngü bir sonraki porta giderek onada "s" harfi gönderiyor. bu işlem olurken comport bileşenin onrxchar eventende portu okuyorum. bana s harfine karşılık o harfi gelmesi gerek. o harfini hangi portta yakalarsam o port benim cihazın kullandığı aktif port olacak. yalnız döngünün iklkinde hemen hata veriyor işlem sonlanıyor. sanıyorum ki kullanılan başka porta s harfi yazamıyor ondan oluyor. try except boluğuyyla hata denetimi yaptım o da olmadı. bu konuda bir uzman yardımına ihtiyacım var. şimdiden herkese teşekkür ederim
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Seriportu kullanan cihaz takıldığında kullandığı portu bulma

Mesaj gönderen mrmarman »

Merhaba.

Kullandığın ComPort bileşeni Sourceforge'deki cport bileşeni ise, örnek verdiğin kodda Connected := true; şeklinde bir ifade göremiyorum.

Ben de indirip kurdum ve aşağıdaki şekilde bir kurgu hazırladım sorunsuz işlem yapıyor. :idea:

Örnekte formda bir tane TListBox var. GetComPortList fonksiyonu Com listesini döküyor. Sonra da sırayla bunları dolaşıp "S" gönderiyor, dönen değer yanına işleniyor.

Resim

Kod: Tümünü seç

Procedure TForm1.Button1Click(Sender: TObject);
Var
  i : Integer;
begin
  GetComPortList( ListBox1.Items, False );
  Application.ProcessMessages;

  for i := 0 to ListBox1.Items.Count - 1 do begin
    ListBox1.ItemIndex := i;
    With ComPort1 do begin
      Connected   := False;
      Port        := ListBox1.Items[i];
      Try
        Connected := True;
        WriteStr('S');
      Except
        ListBox1.Items[ListBox1.ItemIndex] := ListBox1.Items[ListBox1.ItemIndex] + ' - HATA!!!';
      End;
    end;
  end;
end;

Kod: Tümünü seç

procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
  Deger: String;
begin
  Deger := '';
  ComPort1.ReadStr(Deger, Count);
  ListBox1.Items[ListBox1.ItemIndex] := ListBox1.Items[ListBox1.ItemIndex] + ' - ' + Deger;
  Application.ProcessMessages;
end;
Resim
Resim ....Resim
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

Re: Seriportu kullanan cihaz takıldığında kullandığı portu bulma

Mesaj gönderen baloglurecep »

selamlar mrmarman bey ... bende şuan pc başında hala kodlarla boğuşup duryordum. her şey bir tecrübe ile oluşuyorya... cihazın driverleri kurulu pc de her usb ye cihazı takıp portları listelediğimde cihazın kullandığı port listenin en altına yerleştiğini farkettim. bende onu kullanarak işleme tabii tuttum. ancak port aktif kullanmda iken cihaz çıkarılırsa hata veriyor. yalnız sizin yöntem daha güzel ve sağlıklı. hata denetimni iyice yapmam lazım ki hatasız program olsun. kullanıcılar biliyorsunuz çok dikkat etmezler.

sizin kodları denedim gayet güzel çalışıyor. yalnız döngü sonlanmıyor. O harfini gördüğünde döngüden çıkarsa birde cihazı kullanıcı portu kapatmadan çıkarırsa hata denetimi nasıl yapabilirim. port açıkken cihaz çıkartıldığında hata veriyor. ancak trl+alt+ddlete kısmından kapatılabliyor program. bu sorunlar da çözürlüse süper olacak hocam emeklerinize sağlık.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Seriportu kullanan cihaz takıldığında kullandığı portu bulma

Mesaj gönderen mrmarman »

Değeri bulduğunda döngüden çıkması için OnRxChar olayında gelen veri/deger'in 'O' olması durumunda tetiklenecek GLOBAL bir BOOLEAN değişken ekleyin. Örneğin Global Değişken ( formun en başında FORM tipinin tanımının hemen altında ) : xBulundu : Boolean = false; şeklinde tanımlı olsun.

Kod: Tümünü seç

var
  Form1: TForm1;
  xBulundu : Boolean = False;

implementation
Koddaki son durum şöyle oldu. FOR döngüsünün yerine WHILE kurdum. BREAK ile çıkmayı sevmiyorum ama tercih senin...

Özetle OnRxChareventinde xBulundu global değişkeni TRUE değeri aldığında, sorgunun yapıldığı WHILE döngüsü de otomatikman kendiliğinden sona erecektir.

Kod: Tümünü seç

Procedure TForm1.Button1Click(Sender: TObject);
Var
  i : Integer;
begin
  GetComPortList( ListBox1.Items, False );
  Application.ProcessMessages;
  i := 0;
  xBulundu := False;
  while (i < ListBox1.Items.Count) AND (NOT xBulundu) do begin
    ListBox1.ItemIndex := i;
    With ComPort1 do begin
      Connected   := False;
      SyncMethod  := smThreadSync; // Uses CPortTypes ekli olmalı.
      Port        := ListBox1.Items[i];
      Try
        Connected := True;
        WriteStr('S');
      Except
        ListBox1.Items[ListBox1.ItemIndex] := ListBox1.Items[ListBox1.ItemIndex] + ' - HATA!!!';
      End;
    end;
    inc(i);
  end;
  if xBulundu
    then ShowMessage('COM Port Bulundu :' + ListBox1.Items[ListBox1.ItemIndex] );
end;

Kod: Tümünü seç

procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
  Deger: String;
begin
  Deger := '';
  ComPort1.ReadStr(Deger, Count);
  // eklediğimiz satır ile boolean tetikleyicimizi degerliyoruz
  xBulundu := trim(Deger) = 'O';
  ListBox1.Items[ListBox1.ItemIndex] := ListBox1.Items[ListBox1.ItemIndex] + ' - ' + Deger;
  Application.ProcessMessages;
end;
Resim
Resim ....Resim
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

Re: Seriportu kullanan cihaz takıldığında kullandığı portu bulma

Mesaj gönderen baloglurecep »

mrmarman bey ilginize çok teşekkür ederim. sanırım az bi işi kaldı. döngüden hala çıkmıyor. aslında bunu kullanabiliriz.eğer hata veriyorsa yani porta S yazıp geri bildirim O gelmiyorsa cihaz takılı değildir. bir mesaj verdirebilirz cihaz takılı değil diye. birde cihaz çalışırken porttan çıkarıldığında port kapanmadan hata kontrolü nasıl yapabiliriz.

tekrar çok teşekkür ederimmmm
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Seriportu kullanan cihaz takıldığında kullandığı portu bulma

Mesaj gönderen mrmarman »

Kodu yazarsanız daha kolay anlarız.

http://rapidshare.com/files/172478836/C ... Gonder.rar

linkindeki gönderdiğim kaynak kod ve programı birebir dener misin ? Döngüden çıkmaması için sebep yok çünkü.

Port kapanmadan cihaz çekilirseyi anlamanın tek yolu, peryodik olarak aynı porta 'S' gönderip 'O' dönecek miyi sorgulamaktır. Bu peryod çok sık olmamakla birlikte 5000 interval ( 5 saniye ) de bir olabilir. Bir Timer ile bu sorgu yapılabilir.
Resim
Resim ....Resim
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

Re: Seriportu kullanan cihaz takıldığında kullandığı portu bulma

Mesaj gönderen baloglurecep »

tekrar selamlar hocam.... mrmarman bey kodları derledim toparladım. gayet iyi çalışıyor. tek sıkıntı hata kontrolü. bu konuda bana yardımcı olabilirseniz çok sevinirim. size derli toplu halde kodları gönderiyorum. timere kod ekledim(sonradan kaldırdım) timerde kod çalışıyor fakat cihaz çıktığı an hemen hata veriyor peş peşe...

www.balogluyazilim.com/MRMARMAN.rar
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Seriportu kullanan cihaz takıldığında kullandığı portu bulma

Mesaj gönderen mrmarman »

Hocam cihaz çıktığı anda nerede hata yakalıyorsan oraya Try Except koyacaksın ki hatayı dizginleyeceksin. Bir başlığa daha mesaj yazmıştım. Oradaki şekilde timer ile iç içe hata kontrolü yapabilirsin. bkz. viewtopic.php?f=2&t=24741&start=3
Resim
Resim ....Resim
Cevapla