Length cannot be less than zero. Parameter name: length hatası

Başlatan Bloodofvol, 04 Mayıs 2013, 15:40:54

Bloodofvol

Arkadaşlar ben 3 pic den bir master pice veri gönderip masterdan rs232 iletişimi ile bilgisayara veri gönderiorum. veri "a33.33,55.55,66.66,45.45,24.24,36.45$" şeklinde
Bu veriyi alıp virgülüne bölüp a ile virgül arası degeri kutucuga atıcam. a kutusu =33.33 yazcak gibi .Ama malesef Length cannot be less than zero.
Parameter name: length diye bir hata alıorum.Sanırım virgülün yerini bulamıor -1 olarak göroüor yada başka bir durum var.Bur durumu nasıl çözerim.

Programım


private void Gelenveri0a(picdengelen0)
               {ısı0.Text = a0;}
.
.
.
 private void comPort_VeriAlımı(object sender, SerialDataReceivedEventArgs e)
         {
             Thread.Sleep(1000);
               string picdengelen0 = comPort.ReadExisting();
               int ilkadres = picdengelen0.IndexOf('a');                                      //  ilk slavein basında gelen a harfinin sırası
               int a0sayı = picdengelen0.IndexOf(',');                                //  picdengelen0 daki ilk virgülün sırasını a0sayıya ata
               string a0 = picdengelen0.Substring(ilkadres,a0sayı);                          //  a ,ile ilk virgül arasındaki veriyi a0 a ata
               this.BeginInvoke(new Picveri(Gelenveri0a), new object[] { picdengelen0 });
}


Şimdiden çok teşekkürler.

Kabil ATICI

tek virgül ile gönderdiği zaman bulabiliyor mu? Deneme şansın varmı?
ambar7

Bloodofvol

denemedim ama benimher picden geliyi ayırmam lazım her pic den 4 ayrı veri gelior.ve illa 5 haneli deil 4 hanelide olabilirler.34.45 yerine 4.45 gbi

Kabil ATICI

demek istediğini anladım.
Sadece sesli düşünüyorum, sen burada birinci virgülü bulmasını istiyorsun, peki program birden fazla virgül geldiği zaman virgüllerin yerin nasıl bulacak...
Çünkü virgül için ayardığın index sadece bir tane.
Onun için bir tane virgülün yerini bulabiliyorsa, tanımlamada bir hata olabilir..

"int a0sayı = picdengelen0.IndexOf(',');" ??
bir tane bulur ya ikincisi??

mesaj birleştirme:: 04 Mayıs 2013, 16:36:57

her pic'den gelen veriyi ayrı ayrı işaretle.
Örnek
1. a, 2. b,... gibi böylece her pic'in verisi kolayca ayırırsın...
ambar7

Bloodofvol

onu şöle hallediorum ilk virgülü buluorum sonra ilk virgülün oldugu terimle son terim arasındaki yeni ifadeyi baska bir kutuya atıp ondan işlem yapıorum.

ama 2. vürgülden sonraki ifadede hep hata alıorum

Kabil ATICI

Başka yere bakıyormuşuz:

ayırma işlemini gösten geçir...

örneğin
for next döngüsünü kullanarak virgül yerlerini işaretle.
sonra hepsini bir kerede al.  virgülü en azından if ifadesi ile bulabilirsin. (virgül yeri için dizi kullanabilirsin)
Nasıl olsa gelen veri string uzunluğunu biliyorsun;
anladığım kadarı ile veri "a" ile "$" arasında...
ambar7

Bloodofvol

Gelen veriyi dizi yapamıorum, dedigini tek satırda nasıl yapıcam diziye çeviremeden ?

Kabil ATICI

örnek olarak 3 tane gelen veri virgül ile ayrılmış metin  textBox2, textBox3, textBox4 üzerinde görüntüleniyor

         string metin;
            int [] say = new int[5];
            int sayac;
            metin = "10.12,10.23,45.23";
            sayac=0;
            for (int i = 0; i < metin.Length; i++)
            {
                if (metin.Substring (i,1)==",")
                {
                    say[sayac]=i;
                    sayac=sayac+1;
                }
                   
            }
            textBox2.Text = metin .Substring (0,say[0]);
            textBox3.Text = metin .Substring (say[0]+1,((say[1])-(say[0]+1)));
            textBox4.Text = metin.Substring(say[1] + 1, (metin.Length - (say[1]+1)));
        }
ambar7

Bloodofvol

Hocam çok teşekkürler , ama  if (metin.Substring (i,1)==",") kısmında i ve 1i n karşılaştırılmasını anlayamadım tam olara.

Kabil ATICI

metin içinde string taranıyor her seferinde 1 karakter. i tarama (for için) .. 1 ise sadece 1 karakteri virgül ile karşılaştırıyor...


if (metin.Substring (i,1)==",")  şeklindeki ifadeyi
if (metin.Substring (başlangıç karakter,karakter sayısı)==",") şeklinde açabiliriz...

Belki başka yoluda vardır..
ambar7

Bloodofvol

Anladım , çok teşekkür ederiö yardımınız için , suanda 3 pic den veri alıorum ve bölüorum ama malesef 4. yada5. kere veri gelince aynı hatayı alıorum

Bloodofvol

Program çalışıor ama 4 5 kere 3 picden veri alınca tekrar  Length cannot be less than zero. Parameter name: length hatası alıorum

Kabil ATICI

55.24 ...şeklindeki veri   
55- "." -24...

şeklinde mi yoksa
0x35 -0x35-"."- 0x32 -0x34  ...
şeklinde mi geliyor...

İlk şekilde geliyorsa bir sorun vardır... a'dan sonra $ karşılığı sayı gelirse bu veri sonu olarak algılanabilir. o zaman 99'dan büyük bir sayıdaki karakteri kullanma gerekir. hatta a bile uygun değil. Hatta virgül ve nokta bile...
$-> 36
a ->97 
.->46
,->44 olur...

ikinci şekilde gönderiyorsan  programını biraz daha incelemen gerekir.
ambar7