Picproje Elektronik Sitesi

PROGRAMLAMA DİLLERİ => C/C++ => Konuyu başlatan: sezerbulanik33 - 21 Kasım 2020, 16:59:18

Başlık: C# Serial port Veri Alma Sorunu
Gönderen: sezerbulanik33 - 21 Kasım 2020, 16:59:18
Merhaba arkadaşlar kantardan veri çekmem gerekiyor ama veriler çok farklı geliyor
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            txtAlinan.Text = txtAlinan.Text + serialPort1.ReadExisting();
            txtAlinan.Select(txtAlinan.Text.Length, 0);
        }
kodu böyle yazınca
(https://i.ibb.co/TtkG1mP/SDSDSD.png) (https://ibb.co/TtkG1mP)
Kamyon kg 38340 o değeri veriyor ama 0 ! 1 gibi değerlerde veriyor nasıl çözebilirim
Başlık: Ynt: C# Serial port Veri Alma Sorunu
Gönderen: fide - 21 Kasım 2020, 20:08:44
Data receive handler isimli bir event olması gerekir. Bu eventi bir araştırın.

Sıkıntı verinin nerde bittiğini bilmemeniz gibi görünüyor.

Xctu yada alternatif bir seri port programı ile 00000'ten sonra gelen karakterin ascii kodunu bulun.
Veri alma rutininizi bu karaktere gelene kadar veriyi al sonra bölmeyi dene şeklinde revize edin. Yada ! geldijten sonra 16 karakter al sonra böl deneyin.

Veri formatın !10 xxxxxx 00000y gibi görünüyor.
xxxxxx sizin istediğiniz veri
y ise beklemeniz gereken karakter.
Başlık: Ynt: C# Serial port Veri Alma Sorunu
Gönderen: sezerbulanik33 - 21 Kasım 2020, 20:48:09
Hocam çok teşekkür ederim baya anlatmıssınız ama seri haberleşme ile pek bilgim yok size şöyle kodları gösteriyim ordan daha net anlaşılır
  private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            txtAlinan.Text = txtAlinan.Text + serialPort1.ReadExisting() + "\r\n";
            txtAlinan.Select(txtAlinan.Text.Length, 0);
        }
    }
iş burda bitiyor galiba ama bir türlü çözemedim
Başlık: Ynt: C# Serial port Veri Alma Sorunu
Gönderen: dumansiz - 21 Kasım 2020, 22:29:24
Önerim gelen veriyi önce "logic analyzer" ile dinleyip, inceleyin. Böylece paket yapısı anlaşılır. Paket yapısı anlaşıldıktan sonra da, c# kodları tekrar düzenlenebilir.
Örneğin her paket sonunda karşı taraftan satır sonu karakteri geliyorsa,
serialPort1.ReadExisting() fonksiyonu yerine,
serialPort1.ReadLine() fonksiyonu kullanılabilir.
Önce gelen paketi analiz etmek gerekir.
Başlık: Ynt: C# Serial port Veri Alma Sorunu
Gönderen: fide - 22 Kasım 2020, 08:22:29
Alıntı yapılan: sezerbulanik33 - 21 Kasım 2020, 20:48:09Hocam çok teşekkür ederim baya anlatmıssınız ama seri haberleşme ile pek bilgim yok size şöyle kodları gösteriyim ordan daha net anlaşılır
  private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            txtAlinan.Text = txtAlinan.Text + serialPort1.ReadExisting() + "\r\n";
            txtAlinan.Select(txtAlinan.Text.Length, 0);
        }
    }
iş burda bitiyor galiba ama bir türlü çözemedim
İşin bundan sonrasında seri haberleşme ile ilgisi pek yok. Zaten verileri almaya başlamışsınız. Biraz programlama mantığı, belki 1-2 komut.. @dumansiz bahsettiği gibi.

Xctu yada seri port analiz edebileceğiniz herhangi bir program kurup hex kodlarını alıp buraya tekrar yazın, tekrar bakalım.
Başlık: Ynt: C# Serial port Veri Alma Sorunu
Gönderen: sezerbulanik33 - 22 Kasım 2020, 10:09:07
Xctu,seri port analiz edebileceğim ve hex kodunu alabileceğim bildiğiniz önerdiğiniz bir program varmı peki ?
Başlık: Ynt: C# Serial port Veri Alma Sorunu
Gönderen: fide - 22 Kasım 2020, 19:19:07
Xctu, digi / silabs firmasının rf modüller için arayüz programıdır. Yeni versiyonu daha kapsamlı ama asıl işinizi görecek olan versiyon eski versiyonu.

(https://www-burakozkan-net.cdn.ampproject.org/i/www.burakozkan.net/wp-content/uploads/2013/01/X-CTU-Terminal2.png)

Programın versiyonunu hatırlayamadım ama bulabilşrsem linkini eklerim.

XCTU ver. 5.1.0.0 installer (http://xctu%20ver.%205.1.0.0%20installer)

Link çalışmazsa digi'nin sayfasına bak. 5.1.0 versiyonu. Sayfa altında
https://www.digi.com/products/embedded-systems/digi-xbee/digi-xbee-tools/xctu#productsupport-utilities (https://www.digi.com/products/embedded-systems/digi-xbee/digi-xbee-tools/xctu#productsupport-utilities)
Başlık: Ynt: C# Serial port Veri Alma Sorunu
Gönderen: sezerbulanik33 - 23 Kasım 2020, 15:23:11

(https://i.ibb.co/gzDswy3/Ads-z.png) (https://ibb.co/gzDswy3)
kantarda araba yokken hex kodu hocam
Başlık: Ynt: C# Serial port Veri Alma Sorunu
Gönderen: foseydon - 23 Kasım 2020, 19:41:38
veriyi düzgün olarak alıyorsunuz. logic analyzer vs. gerek yok. @fide nin dediği gibi veri formatınız "!10 xxxxxx yyyyyy" şeklinde. burada veri başlangıcı "!10" sonra gelen data sizin okumanız. yapacağınız şey gelen bütün veriyi bir yerde(array gibi) toplayıp içinde "!10" ibaresini aramak. Bundan sonra gelen 6 uzunluktaki kısmın sizin istediğiniz veri olduğunu biliyorsunuz. burayı alıp kullanacaksınız. en sonda kullandığınız kısmı temizleyeceksiniz.

sanırım asıl mesele sizin elinizde protokol yok.
Başlık: Ynt: C# Serial port Veri Alma Sorunu
Gönderen: sezerbulanik33 - 23 Kasım 2020, 19:51:54
Hocam çok teşekkür ediyorum ilginizden dolayı ama dediğim gibi pek bilgim yok size zahmet olmazsa bir örnek ile yazabilirmisiniz ama mantığını anladım teşekkür ederim
Başlık: Ynt: C# Serial port Veri Alma Sorunu
Gönderen: fide - 23 Kasım 2020, 21:10:34
Alıntı yapılan: sezerbulanik33 - 23 Kasım 2020, 15:23:11(https://i.ibb.co/gzDswy3/Ads-z.png) (https://ibb.co/gzDswy3)
kantarda araba yokken hex kodu hocam

Bu hex önceki veri ile tutmuyor. Baudrate doğru mu? Emin misiniz?

!10 ve boşluklar hiç yok mesela burda. Baud hızını kontrol edip mümkünse boş + yüklü hex çıktısını alabilir misiniz?
Başlık: Ynt: C# Serial port Veri Alma Sorunu
Gönderen: sezerbulanik33 - 23 Kasım 2020, 21:35:18
Kntarın orjinal programındaki bound hızını aldım hocam
Başlık: Ynt: C# Serial port Veri Alma Sorunu
Gönderen: sezerbulanik33 - 24 Kasım 2020, 17:17:36
private void timer1_Tick(object sender, EventArgs e)
        {
            try
            {
                string ReceivedString = "";
                if (serialPort1.BytesToRead > 0)
                {
                    byte[] ret = new byte[serialPort1.BytesToRead];
                    serialPort1.Read(ret, 0, ret.Length);
                    ReceivedString = Encoding.ASCII.GetString(ret);
                }
                if (ReceivedString.Length >= 6)
                    ReceivedString = ReceivedString.Substring(6,6);
                richTextBox1.Text = ReceivedString;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                timer1.Stop();
            }
        }
Şöyle bir kod denedim kantarda araba varken (23000 örnek) 23000 gösteriyor ardından bazen 01 000 gibi değer geliyor sonra yine kg gösteriyor
Başlık: Ynt: C# Serial port Veri Alma Sorunu
Gönderen: dumansiz - 25 Kasım 2020, 11:36:15
Paketi analiz etmeden programda değişiklik yapmanız, sağlıklı bir çözüm olmaz.
Kantarda yük varken ayrı paket, yük yokken ayrı paket geliyor olabilir.

Eldeki verilere göre şöyle bir analiz yapılabilir:

Yük yokken paket başlangıcı:
0x02 0x4A 0x26 0x13 0xF9 (hex olarak)

Yük varken paket başlangıcı:
"!10" (String olarak)

Paket başlangıcından sonraki ilk 6 hane kilogram, sonraki 6 hane gram.
Ancak bu sağlıklı bir analiz değil. Daha fazla örnekle, ve hex dinleme ile desteklemelisiniz.
Paket içerisinde yanlış bytelar da olabilir.
Örneğin yük yokken 6 tane 0x30 byte'ı gelmesi gerekirken arada 0x98 verisi gelmiş.
Bunlarında gözlemlenmesi gerekir.