Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Delphi Seri Haberleşme
#1
Arkadaşlar merhaba bir konuda yardımınıza ihtiyacım var şimdi maketi olan bir arkadaşım için teraziden gelen ağırlığı okuyacak bir windows uygulaması yazmaya çalışıyorum bağlantıda  comportlib bileşenlerini kullanıyorum comportdatapacket bileşeni ile de veriyi alıyorum istediğim şekildede düzenlenmesini yapabiliyorum. Ancak bazı zamanlarda bağlantı kopması oluyor (kablo sorunları farklı com port seçimi gibi) işte bu durumda yazmış olduğum programın uyarı vermesini istiyorum (veri okunamadı yada hata) verinin tekrar gelmesi durumunda ise otomatik ben işlem yapmadan bağlanmasını istiyorum. bunu nasıl yapabilirim.
Cevapla
#2
büyük ihtimal bileşenin Events -> onDisconnect mutlaka vardır. bağlantı koptuğunda oradan uyarı verebilirsin.

cihaz aynı port/usb üzerinden bağlı olduğu sürece comport numarası değişmez.

belirli zaman aralıkları ile bağlantı kurmayı denersin. Bağlantı kurulduğunda Events -> onConnected tetiklenir.

Bağlantı koptuğu yada bağlantı kurulup kurulmadığını kontrol edebilirsin.

Not: Eğer bileşenin otomatik bağlantı seçeneği yok ise sen bağlantı kuruncaya (connect oluncaya) kadar veri gelmeyecektir.
Cevapla
#3
(03-06-2021, Saat: 17:32)ugorkem Adlı Kullanıcıdan Alıntı: büyük ihtimal bileşenin Events -> onDisconnect mutlaka vardır. bağlantı koptuğunda oradan uyarı verebilirsin.

cihaz aynı port/usb üzerinden bağlı olduğu sürece comport numarası değişmez.

belirli zaman aralıkları ile bağlantı kurmayı denersin. Bağlantı kurulduğunda Events -> onConnected tetiklenir.

Bağlantı koptuğu yada bağlantı kurulup kurulmadığını kontrol edebilirsin.

Not: Eğer bileşenin otomatik bağlantı seçeneği yok ise sen bağlantı kuruncaya (connect oluncaya) kadar veri gelmeyecektir.
malesef kardeşim bileşenlerin event olayında bahsettiğin özellikler yok gelen bilgi string şeklinde ve aşağıdaki gibi basit bir kodla gelen bilgiyi okuyabiliyorum. Nasıl bir kod yazmalıyım ki bu bileşene gelen bilgi kesildiğinde uyarı versin veri okunamadı diye bilgi tekrar gelmeye başladığında ise otomatik ağırlık bilgisi panelde görünsün eminim çok basit bir koddur ama işte acemiler sınıfındanım malesef.

procedure Tform1.ComDataPacket1Packet(Sender:Tobject; const Str: string);
begin
Panel1.caption:=copy(str,3,5);
end;
Cevapla
#4
Bir öneri : Market'teki terazinin teknik dökümanlarından protokolü bir inceleyin.
* ping /pong tarzı status check opsiyonu vardır bir şekilde. seri port sonuçta.
* Cihaza bağlı olduğunuz sonucunu nasıl elde ediyorsanız o da olur.
* Projeniz açık olduğu müddetçe ( aralığın kaç saniye olacağına siz karar verin ) periyodik olarak sorsun cevap alırsa bağlantı sağlıklı, alamazsa uyarı versin.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#5
Ben TComPortDriver kütüphanesini kullanarak (Marco Conti'nin) RS232 haberleşmesi yapıyorum. Maalesef RS232 'de TCP/IP gibi bağlantı koptuğunda geri dönen bir event yok. mrmarman'ın dediği gibi sizin bir sorgu çalıştırıp belli zamanlarda teraziden veri alıp almadığınızı kontrol etmeniz gerekiyor.

Kullandığınız terazinin marka modeli nedir bilmiyorum ama ben BayKon markası ile haberleşmiştim. Onlarda devamlı veri gönderimi söz konusu. Bu durumda ürün teraziye girerken de çıkarken de veri gönderiyor. Yani sadece stabil olduğunda değil. Bu durumda doğru ağırlığı sizin algılamanız yada ortalamasını almanız lazım olabilir.

Kolay gelsin.
Cevapla
#6
(03-06-2021, Saat: 21:21)mrmarman Adlı Kullanıcıdan Alıntı: Bir öneri : Market'teki terazinin teknik dökümanlarından protokolü bir inceleyin.
* ping /pong tarzı status check opsiyonu vardır bir şekilde. seri port sonuçta.
* Cihaza bağlı olduğunuz sonucunu nasıl elde ediyorsanız o da olur.
* Projeniz açık olduğu müddetçe ( aralığın kaç saniye olacağına siz karar verin ) periyodik olarak sorsun cevap alırsa bağlantı sağlıklı, alamazsa uyarı versin.

Sayın Muharrem Arman hocam dediğiniz gibi ürün bilgilerini inceledim tam da benim istediğim gibi bir kod örneği var broşürde ancak c# diliyle yazılmış ve ben bunu delphiye uyarlayamadım malum acemilik ve c# dilininden hiç anlamamam kodlar aşağıdaki gibidir.

public partial class Form1 : Form
    {
       private string RxString;

       public Form1()
       {
           InitializeComponent();

           comboBoxPort.SelectedIndex = 0;
           comboBoxBaud.SelectedIndex = 3;

           yeniden_baglan();
       }

       public Form1(string[] args)
       {
           InitializeComponent();

           comboBoxPort.SelectedIndex = 0;
           comboBoxBaud.SelectedIndex = 3;

           foreach (string arg in args)
           {
               if (arg.StartsWith("-p") && (arg.Length >= 3))
               {
                   try
                   {
                       comboBoxPort.SelectedIndex = Int32.Parse(arg.Substring(2)) - 1;
                   }
                   catch
                   {
                   }
               }
               else if (arg.StartsWith("-b") && (arg.Length >= 3))
               {
                   try
                   {
                       comboBoxBaud.SelectedIndex = Int32.Parse(arg.Substring(2)) - 1;
                   }
                   catch
                   {
                   }
               }
           }

           yeniden_baglan();
       }

       private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
       {
           RxString += serialPort1.ReadExisting();

           if (RxString.Contains('\r') && (RxString.Length >= 8))
           {
               this.Invoke(new EventHandler(DisplayText));
           }
       }

       private void DisplayText(object sender, EventArgs e)
       {
           int i = RxString.LastIndexOf('\r');

           if (i >= 7)
           {
               labelAgirlik.Text = RxString.Substring(i - 6, 6);

               if (String.IsNullOrWhiteSpace(labelAgirlik.Text))
                   labelAgirlik.ForeColor = Color.Red;
               else
                   labelAgirlik.ForeColor = Color.LightGreen;

               if (RxString.Length >= (i + 2))
                   RxString = RxString.Split('\r').LastOrDefault();
               else
                   RxString = "";
           }

           timer1.Stop();
           timer1.Start();
       }

       private void serialPort1_ErrorReceived(object sender, System.IO.Ports.SerialErrorReceivedEventArgs e)
       {
           //this.Invoke(new EventHandler(DisplayHata));
       }

       private void DisplayHata(object sender, EventArgs e)
       {
           labelAgirlik.Text = " HATA ";
           labelAgirlik.ForeColor = Color.Red;
       }

       private void comboBoxPort_SelectedIndexChanged(object sender, EventArgs e)
       {
           yeniden_baglan();
       }

       private void comboBoxBaud_SelectedIndexChanged(object sender, EventArgs e)
       {
           yeniden_baglan();
       }

       private void yeniden_baglan()
       {
           timer1.Stop();

           try
           {
               try
               {
                   serialPort1.Close();
               }
               catch{
               }

               serialPort1.PortName = comboBoxPort.SelectedItem.ToString();
               serialPort1.BaudRate = Int32.Parse(comboBoxBaud.SelectedItem.ToString());

               serialPort1.Open();

               labelAgirlik.Text = "......";
               labelAgirlik.ForeColor = Color.Yellow;
           }
           catch
           {
               labelAgirlik.Text = " HATA ";
               labelAgirlik.ForeColor = Color.Red;
           }

           timer1.Start();
       }

       private void timer1_Tick(object sender, EventArgs e)
       {
           yeniden_baglan();
       }
   }
}
Cevapla
#7
Bu c# örneğinde de timer ile yeniden bağlantı kuruyor görüyorum. Yani bağlantı koptuğunu sadece yeniden bağlantı sağlanamazsa bağlantının sağlıklı olmadığını anlıyor. 

Ayrıca hata var kısmını devre dışı bırakmışlar, sürekli bağlantı kurmaya çalışarak başarılı olana kadar tekrarlıyor.

Bu noktada terazideki biriken bir kısım veri topluca gelebilir. Gelen kümülatif verinin en sonuncusunu parse ederek değerlendirmek isteyebilirsiniz.

Örnekte de \r ile ifade edilen enter/return karakterinin sonuncusundan geriye doğru 6 karakteri okutulmuş.

99.999 gibi bir değer okunuyor olmalı.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#8
(03-06-2021, Saat: 21:06)mstf42 Adlı Kullanıcıdan Alıntı:
(03-06-2021, Saat: 17:32)ugorkem Adlı Kullanıcıdan Alıntı: büyük ihtimal bileşenin Events -> onDisconnect mutlaka vardır. bağlantı koptuğunda oradan uyarı verebilirsin.

cihaz aynı port/usb üzerinden bağlı olduğu sürece comport numarası değişmez.

belirli zaman aralıkları ile bağlantı kurmayı denersin. Bağlantı kurulduğunda Events -> onConnected tetiklenir.

Bağlantı koptuğu yada bağlantı kurulup kurulmadığını kontrol edebilirsin.

Not: Eğer bileşenin otomatik bağlantı seçeneği yok ise sen bağlantı kuruncaya (connect oluncaya) kadar veri gelmeyecektir.
malesef kardeşim bileşenlerin event olayında bahsettiğin özellikler yok gelen bilgi string şeklinde ve aşağıdaki gibi basit bir kodla gelen bilgiyi okuyabiliyorum. Nasıl bir kod yazmalıyım ki bu bileşene gelen bilgi kesildiğinde uyarı versin veri okunamadı diye bilgi tekrar gelmeye başladığında ise otomatik ağırlık bilgisi panelde görünsün eminim çok basit bir koddur ama işte acemiler sınıfındanım malesef.

procedure Tform1.ComDataPacket1Packet(Sender:Tobject; const Str: string);
begin
Panel1.caption:=copy(str,3,5);
end;

com cihaza müdehale şansınız yoksa...
en basit şekli ile veri akışı kesintisiz devam ediyordur diye düşünüyorum.
eğer veri belli bir süre veri gelmiyorsa tekrar connect olmaya çalışabilirsin.
Bunun için thread yada timer kullanabilirsin. Bu tamamen sana ve durumun kritikliğine bağlı.

Uses
 DateUtils;

var SonDateTime:Tdatetime; //global değişken


procedure Tform1.ComDataPacket1Packet(Sender:Tobject; const Str: string);
begin
Panel1.caption:=copy(str,3,5);
SonDateTime := Now();
end;

procedure TForm2.Timer1Timer(Sender: TObject);
var ZamanFarki:int64;
begin
               //MilliSecondsBetween milisaniye cinsinden
  ZamanFarki := SecondsBetween(SonDateTime, Now()); //saniye cinsinden zaman farkı
   if ZamanFarki > 2 then
      Com.connect();
end;


Cevapla
#9
(07-06-2021, Saat: 00:14)ugorkem Adlı Kullanıcıdan Alıntı:
(03-06-2021, Saat: 21:06)mstf42 Adlı Kullanıcıdan Alıntı: malesef kardeşim bileşenlerin event olayında bahsettiğin özellikler yok gelen bilgi string şeklinde ve aşağıdaki gibi basit bir kodla gelen bilgiyi okuyabiliyorum. Nasıl bir kod yazmalıyım ki bu bileşene gelen bilgi kesildiğinde uyarı versin veri okunamadı diye bilgi tekrar gelmeye başladığında ise otomatik ağırlık bilgisi panelde görünsün eminim çok basit bir koddur ama işte acemiler sınıfındanım malesef.

procedure Tform1.ComDataPacket1Packet(Sender:Tobject; const Str: string);
begin
Panel1.caption:=copy(str,3,5);
end;

Sayın UGörkem hocam öncelikle konuyla ilgilendiğiniz için teşekkür ederim. Sizin vermiş olduğunuz kod çalışıyor sıkıntı yok ama benim isteğimi karşılamıyor. Çünkü comport1 bileşeni veri gelse de gelmesede bağlı kalıyor o yüzden kontrolü onun üzerinden sağlayamayız. bize yardımcı olacak olan comdatapacket bileşeni veri akışı bu bileşende sağlanıyor aslında basit bir if else yapısıyla çözülebilir ancak ben comdatapacketin veri akışının kesildiğini yada geldiğini  belirten hangi özelliği olduğunu bilmiyorum acemilikten dolayı. söylediklerimi kod ile anlatacak olursam kodlar aşağıdaki gibir.

Not:Belkide comdatapacketin böyle bir özelliğide mevcut değildir bu ihtimalde söz konusu. 


procedure Tform1.ComDataPacket1Packet(Sender:Tobject; const Str: string);
begin
if datacompacket1.verigeliyorsaözelliği then
panel1.caption:=copy(str,3,5)
else
panel1.caption:='Veri Okunamadı';
end;
Cevapla
#10
üstadım bir timer içerisine aşağıdaki gibi bir kod yazarsan senin işin çözülecektir.

bileşenin Connected özelliği varmış. ve bu bağlı olup olmadığını tutuyor.

procedure TForm2.Timer1Timer(Sender: TObject);
begin
if not ComPort.Connected then
 begin 
    Memo1.lines.add('Bağlantı Yok');
    Memo1.lines.add('Bağlantı Kurmaya çalışılıyor....');
    ComPort.Open;
 end;
end;

//formun OnClose events a bu kodu ekle. kapatırken bağlantı kurmaya çalışmasın;
Timer1.enabled:=False;
ComPort.Close;
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Delphi 7 Unrar mcuyan 12 462 19-03-2024, Saat: 10:30
Son Yorum: frmman
Lightbulb Delphi 7zip Password lü Dosya Sıkıştırma ve Açma + Bonus RAR5 Desteği frmman 6 262 16-03-2024, Saat: 17:55
Son Yorum: delphi.developer
  delphi 12 ile TFileStream çalışmıyor aegean 5 420 05-03-2024, Saat: 22:23
Son Yorum: aegean
  Delphi ile geliştirdiğiniz uygulamalar neler? - İki Ödüllü Mr.Developer 20 12.672 01-01-2024, Saat: 22:46
Son Yorum: aegean
  Delphi 7 ye göre MB Döviz kurları nasıl alırız maydin60 7 962 31-12-2023, Saat: 02:18
Son Yorum: maydin60



Konuyu Okuyanlar: 1 Ziyaretçi