Seriportu kullanan cihaz takıldığında kullandığı portu bulma
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
-
- Üye
- Mesajlar: 261
- Kayıt: 21 Tem 2006 04:59
- İletişim:
Seriportu kullanan cihaz takıldığında kullandığı portu bulma
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...
cevaplarınız için teşekkürler...
Re: Seriportu kullanan cihaz takıldığında kullandığı portu bulma
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)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...
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
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
-
- Üye
- Mesajlar: 261
- Kayıt: 21 Tem 2006 04:59
- İletişim:
Re: Seriportu kullanan cihaz takıldığında kullandığı portu bulma
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...
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...
Re: Seriportu kullanan cihaz takıldığında kullandığı portu bulma
Try
döngü..
except end
-
- Üye
- Mesajlar: 261
- Kayıt: 21 Tem 2006 04:59
- İletişim:
Re: Seriportu kullanan cihaz takıldığında kullandığı portu bulma
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....
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....
Re: Seriportu kullanan cihaz takıldığında kullandığı portu bulma
componnt O yu edit 1 e atacağını nerden biliyor onu anlamadımbaloglurecep 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....
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
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
-
- Üye
- Mesajlar: 261
- Kayıt: 21 Tem 2006 04:59
- İletişim:
Re: Seriportu kullanan cihaz takıldığında kullandığı portu bulma
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.
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.
-
- Üye
- Mesajlar: 261
- Kayıt: 21 Tem 2006 04:59
- İletişim:
Re: Seriportu kullanan cihaz takıldığında kullandığı portu bulma
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ı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
Re: Seriportu kullanan cihaz takıldığında kullandığı portu bulma
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.
Ö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.

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.

Ö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.

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;
-
- Üye
- Mesajlar: 261
- Kayıt: 21 Tem 2006 04:59
- İletişim:
Re: Seriportu kullanan cihaz takıldığında kullandığı portu bulma
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.
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.
Re: Seriportu kullanan cihaz takıldığında kullandığı portu bulma
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.
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ç
var
Form1: TForm1;
xBulundu : Boolean = False;
implementation
Ö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;
-
- Üye
- Mesajlar: 261
- Kayıt: 21 Tem 2006 04:59
- İletişim:
Re: Seriportu kullanan cihaz takıldığında kullandığı portu bulma
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
tekrar çok teşekkür ederimmmm
Re: Seriportu kullanan cihaz takıldığında kullandığı portu bulma
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.
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.
-
- Üye
- Mesajlar: 261
- Kayıt: 21 Tem 2006 04:59
- İletişim:
Re: Seriportu kullanan cihaz takıldığında kullandığı portu bulma
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
www.balogluyazilim.com/MRMARMAN.rar
Re: Seriportu kullanan cihaz takıldığında kullandığı portu bulma
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