Delphi ile Seri Haberleşme (comport)

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
mstf42
Üye
Mesajlar: 2
Kayıt: 04 Haz 2021 03:33

Delphi ile Seri Haberleşme (comport)

Mesaj gönderen mstf42 »

Arkadaşlar merhaba bir tane terazi için windows uygulaması yazıyorum ancak teraziden gelen bilgileri okuyamıyorum aslında elimde bu teraziye ait bilgileri okuyabileceğim terazi test kodları mevcut ancak c# diliyle yazılmış ben bu dille alakalı hiç bir bilgiye sahip değilim aceba bu dili delphiye uyarlayabilecek arkadaşlar varmıdır. Yardımlarınız için şimdiden teşekkür ederim. kodlar aşağıdaki gibidir.

Kod: Tümünü seç


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();
       }
   }

ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Delphi ile Seri Haberleşme (comport)

Mesaj gönderen ertank »

Merhaba,

Bazı teraziler sürekli ağırlık bilgisi gönderir. Hiç durmadan peş peşe. Bazı teraziler ise önce istekte bulunulup (bana ağırlığı gönder anlamında) ardından yanıt bekleyerek bilgi iletirler. Bazıları da her iki modu da destekler.

Sizin paylaştığınız kod anladığım kadarıyla sürekli ağırlık bilgisi gönderiyor şekilde tasarlanmış. Yapılması gereken sadece;
1- Gelen veri 8 karakter veya büyük mü
2- Gelen veri içinde enter karakteri (#13) var mı

şeklinde kontrol etmek. Koşulların ikiside sağlanıyor ise ilk 6 hanelik kısım string cinsinden ('1250' gibi) ağırlığı gösteriyor olacak.

Eğer gelen 6 karakterlik ağırlık bilgi komple boşluk karakteri ise bu durumda terazide ağırlık yok anlamına geliyor.

Yukarıdaki açıklamalara istinaden alışık olduğunuz bir com port bileşeni kullanarak ağırlık okuyabilrsiniz.

Bağlantı için terazi standardını (baud rate, stop bit, parity, flow control vb) bilmeniz gerekli. Bunu .NET uygulamasını çalıştırarak tespit edebilirsiniz.
mstf42
Üye
Mesajlar: 2
Kayıt: 04 Haz 2021 03:33

Re: Delphi ile Seri Haberleşme (comport)

Mesaj gönderen mstf42 »

Sayın Ertan Hocam biraz araştırmayla sonunda ağırlık bilgisini okuyabildim şöyleki; evet ağırlık bilgisi sürekli geliyor ağırlık yokken sürekli sıfır rakamı string olarak geliyor bende comportlib bileşenleri mevcut comdatapacket (label1.caption:=copy(str,3,5)) ile ağırlığı okuyabildim ancak programı çalıştırdığımda bazen kablo sorunu bazen yanlış port seçimi durumunda kontrol sağlayamıyorum ve neden bilgi gelmediğini bilemiyorum ben bu bileşenlerle programı çalıştırdığımda önce port kontrolü sonra veri geliyormu delphi kodlarıyla nasıl kontrol edebilirim eğerki yanlış portsa (hatalı port seçimi ve bilgi gelmiyorsa veri okunamadı uyarılarını almak istiyorum) bunu yapabilmem mümkün müdür mümkünse yardımlarınızı bekliyorum.
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Delphi ile Seri Haberleşme (comport)

Mesaj gönderen ertank »

Bilgisayarda olmayan bir com port kullanmaya kalkar iseniz hata alırsınız. Bunu try..except..end bloğu kullanarak kontrol edebilirsiniz. Bu tür hatalar ilk port açma sırasında oluşacaktır.

Bilgisayarda mevcut olan ama terazi bağlantısı olmayan bir port kullanır iseniz ek kontrollere ihtiyacınız var. Misal 1dk içinde halen hiç okuma bilgisi alınmadı ise terazi iletişim sorunu olduğunu kullanıcıya mesaj olarak iletebilirsiniz. Bunu basitçe form genelinde bir değişken kullanarak (her başarılı okuma yaptığınızda değişken değerini bir arttırarak) ve basit bir timer bileşeni kullanarak yapabilirsiniz. Timer bileşeni tasarım zamanında kapalı tutulur (Enabled = False) com port başarılı bir şekilde hata almadan açıldıktan sonra kod içinden çalıştırılır (Timer1.Enabled := True). Kontrol süresi geldiğinde de kod içinden kapatılır ve tekrar çalıştırılmaz. Kontrol zamanında kaç adet okuma yapıldığı form genelindeki değişken kontrol edilerek incelenir. Hiç okuma yok ise kullanıcıya mesaj verilebilir.

Bunun dışında, veri gelmeme sebebi çoğunlukla iki tarafın farklı iletişim parametreleri ile com port bağlantısı sağlıyor olmasıdır. Örneğin terazi 9600 baud rate ile çalışır iken siz 115200 baud rate ile port iletişimi başlatır iseniz veri gelmez veya okunamaz veri geliyor olur. Bu sebeple ki ilk mesajımda son paragrafta özellikle .NET uygulamasını inceleyerek terazi com port iletişim parametrelerini tespit etmenizi önermiştim.
Cevapla