C# Serial port Veri Alma Sorunu

Başlatan sezerbulanik33, 21 Kasım 2020, 16:59:18

sezerbulanik33

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

Kamyon kg 38340 o değeri veriyor ama 0 ! 1 gibi değerlerde veriyor nasıl çözebilirim

fide

#1
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.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

sezerbulanik33

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

dumansiz

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

fide

#4
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.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

sezerbulanik33

Xctu,seri port analiz edebileceğim ve hex kodunu alabileceğim bildiğiniz önerdiğiniz bir program varmı peki ?

fide

#6
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.



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

XCTU ver. 5.1.0.0 installer

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
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

sezerbulanik33

#7


kantarda araba yokken hex kodu hocam

foseydon

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.

sezerbulanik33

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

fide

Alıntı yapılan: sezerbulanik33 - 23 Kasım 2020, 15:23:11
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?
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

sezerbulanik33

Kntarın orjinal programındaki bound hızını aldım hocam

sezerbulanik33

#12
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

dumansiz

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.