İnteger + string ifade serialportla alma

Başlatan Bloodofvol, 31 Mart 2013, 20:26:44

Bloodofvol

Arkadaşlar pic den -0.06,-0.06 degerini rich textboxa yazdırmak istiorum , ama ifadeyi nasıl tanımlaycagımı bulamadım
Program şöyle ;

  private void button1_Click(object sender, EventArgs e)
        {
            if (!serialPort1.IsOpen)
            {
                serialPort1.Open();
            }   

           
                string veri =richTextBox1.Text;
               
                serialPort1.WriteLine(veri);
             
            }

Veri de dediğim gibi  -0.06,-0.06  diye hem rakam hemde "," ve "." ifadeleri var dolayısıyla string veri de string yerine ne yapacagımı bilemedim.

Sorum basitse kusura bakmayın c# a yeni başladım şu 1 haftada bitirme projem için çözmem gereken bir durum.

Şimdiden teşekkürler.

Gökhan BEKEN

okuma yapıp bunu richtextbox'a yazdırmak istediğinizi söylemişsiniz. Yazılımda tam tersinizi yapmaya çalışmışsınız.
picten gelen değerleri aşağıdaki gibi okumanız lazım.
richtextBox1.Text = sp.ReadExisting();

herhangi bir integer veya diğer sayısal değişkenleri string değişkene şöyle aktarabilirsiniz:
            double a=2131.5;
            string b = Convert.ToString(a);           
            MessageBox.Show(b);

Özel mesaj okumuyorum, lütfen göndermeyin.

semih

string gelen;
gelen=convert.tostring(serialport1.readexisting());
richTextBox1.Text=gelen;

Bloodofvol

Öncelikle  meftun ve semih arkadaşlara teşekkür ederim.
Su anda boarda baglı rs232 usb kablosunun lehimi gitti , yarın onu halledip söylediginiz kodları deniyecem , olmassa gene yardımınızı rica edicem

Extreme

1 hafta sonra teslim mi ediceksiniz bitirme ödevinizi ?

Bloodofvol

2 ay sonraya bitmesi gereken biritrme projesi.Ben fizik mühendisliği okuduğum için elektronik ve bilgisayar programlama becerim temel düzeyde dolayısıyla acele etmeye çalışıorum .Rs232 ile devreyi kurdum ama bilgsayarla olan baglantısını c# ile yaazacagım programa aktarmam lazzım acil , çünkü proje raporu , elektronik devreye bastırma ve diğer derslerde var.

Bloodofvol

serialport1.readexisting() koduyla veriyi almaya başardım.
Şimdi gelen veri  23.35,23.44 gibi durmadan değişen iki veri.Bu string veriyi Split('.') ile "." ya parçaladım amaverileri ayrı ayrı kutulara atmayı beceremedim.

Yani a ve b diye 2 kutu olacak ve onlara sırasıyla 23.35 ve 23.44 degerlerini atayıcam.

veri = serialPort1.ReadExisting().Split(','); şeklinde parçalıorum ama "." dan evvelini ve sonrasını nasıl ayrı ayrı kutulara atıcam bilemiyorum.Yardım edebilirseniz çok sevinirim.
Şimdiden çok teşekkürler

Gökhan BEKEN

2 ayrı label veya textbox felan işinizi görüyorsa çok basit aslında.

gece gece bir şeyler saçmaladım ezberden. Yalnışlıklar olabilir çünkü visual studioyu açmayla zaman kaybedip strees olana kadar foruma direkt yazarım.

string ana_deger="23.35";
string tam_kisim,ondalik_kisim;
int noktanin_sirasi=0;

noktanin_sirasi= okunan.IndexOf(".", 10); //. nokta karakterini bul ve sırasını ver.
//eğer sürekli 2 basamaklı sayılarla çalışıyorsanız nokta hep 3. karakter olacağından bu işlemi yapmaya gerek yok.
//fakat basamak sayısı değişiyorsa noktanın kaçıncı basamakta olduğunu bulmak için indexof'u kullanmak gerekir.

if(noktanin_sirasi!=-1) {} //eğer noktayı bulduğunda extra işlem yapmak isterseniz buraya yazınız. Ama gerek yok böyle birşeye
if(noktanin_sirasi==-1){} //eğer sayının içinde nokta olmadığı bir durumda uyarı felan verecekseniz buraya yazabilirsiniz.

//noktanin_sirasi değişkeni bize noktanin soldan kaçıncı karakter olduğunu belirtir. 2 basamaklı bir sayıda 3. karakter olur.

tam_kisim = ana_deger.Substring(1, 3);  // ana değer değişkeninin 1. karakterinden 2. karakterine kadar olan bölümü tam_kisim 
tam_kisim = ana_deger.Substring(1, noktanin_sirasi);  // ana değer değişkeninin 1. karakterinden noktanin_sirasi değişkeninin değerine kadar olan kısım

ondalik_kisim = ana_deger.Substring(3, 5);  // ana değer değişkeninin 2. karakterinden 5. karakterine kadar olan bölümü tam_kisim 
ondalik_kisim = ana_deger.Substring(noktanin_sirasi,noktanin_sirasi+2);  // ana değer değişkeninin . karakterinden itibaren 2 karakter sonraki kisim

label1.text=tam_kisim;
label2.text=".";
label3.text=ondalik_kisim;






Özel mesaj okumuyorum, lütfen göndermeyin.

semih

Alıntı yapılan: Bloodofvol - 01 Nisan 2013, 23:32:58
serialport1.readexisting() koduyla veriyi almaya başardım.
Şimdi gelen veri  23.35,23.44 gibi durmadan değişen veri.Bu string veriyi Split('.') ile "." ya parçaladım amaverileri ayrı ayrı kutulara atmayı beceremedim.

Yani a ve b diye 2 kutu olacak ve onlara sırasıyla 23.35 ve 23.44 degerlerini atayıcam.

veri = serialPort1.ReadExisting().Split(','); şeklinde parçalıorum ama "." dan evvelini ve sonrasını nasıl ayrı ayrı kutulara atıcam bilemiyorum.Yardım edebilirseniz çok sevinirim.
Şimdiden çok teşekkürler

23.35 ve 23.44 değerlerini ayrı ayrı yerlere atıcaksan zaten "." ya göre ayırman yanlış olur. İşlemciden veri gönderirken arada bir boşluk bırak. "23.35 23.44" gibi gönder. Daha sonra boşluk karakterine göre split ile ayırma yap ve nereye istersen oraya yazdır. Ufak bir kod yazıyım

gelen = Convert.ToString(serialPort1.ReadExisting());
label1.Text = gelen.Split(' ')[0];
if (gelen.Split(' ').Length > 1)
 label2.Text = gelen.Split(' ')[1];

Bloodofvol

Çok teşekkürler Semih hocam ve Meftun hocam.Yazdıgınız kodlar çok işe yaradı , ve programda yazdıgım a = "23.45,23.33" gibi ifadeleri "," ile bölüp kutulara atadım.

Şimdi bir problem daha oldu ama , yazdıgım serialportla ilgili komutta sadece portu açıp kapamak üzerine komutlar var , sanırım picden gelen veriyi zamanında alamıoyrum.
Veri alma butonuna ilk bastıgımda , veriyi almıor ama 2yada3 saniye sonra basınca veriyi alıyor.Aldıgım bu veride indexof komutuyla virgülün yerini bulup yazdırıorum , ama vigrüle göre bölüp richtextboxa atıyınca "Length cannot be less than zero." die hata verio.

program şöyle;
private void button1_Click_1(object sender, EventArgs e)
        {
            if (!serialPort1.IsOpen)
            {
                serialPort1.Open();
            }

            string gelen;


            gelen = Convert.ToString(serialPort1.ReadExisting());


            int sıra = 0;
            sıra = gelen.IndexOf(',');

            string sıradegeri = Convert.ToString(sıra);


           

             string ilkdeger;

            ilkdeger = gelen.Substring(0, sıra);

          string gelendeger = Convert.ToString(ilkdeger);

            richTextBox3.Text = gelendeger;
            richTextBox1.Text = sıradegeri;
            richTextBox2.Text = gelen;
        }

Normalde ifadede virgül yoksa sıradegeri ni -1 diye gösteryor.Dedigim gibi buttona programı actıktan 3 sanie sonra basınca veri alabiliorum , ama virgüle bölünce sorun oluyor.Sanırım verinin geldigi anı yakalayamıyınca -1 . karakteri akıyor program dolayısıylada böyle bir hata verior.

Kısacası sorum ; pic den gelen veriyi programda buttona basar basmaz nasıl alabilirim ve bu sorundan nasıl kurtulabilirim.

Şimdiden teşekkürler.

semih

Forma timer ekle. Buton_click fonksiyonuna yazdığın kodları timer_tick fonksiyonuna yaz. Yani timer_tick fonksiyonu ile gelen verileri oku.

muhittin_kaplan

#11
Yanlış Gidiyorsunuz.

Serial Port timer a bağlanmaz. Eğer timer a bağlarsanız timer ın tick olayının dışında gelen veriyi  kaçırırsınız.
Bunun için başka bir treadh oluşturmanız gerekir.
Siz gelen veriyi bölmeye çalışırken oluşturduğunuz bu tread seri portu dinlesin.seri porttan veri geldiğinde doğru alasınız.

gelen veriyi bölme işlemide yanlış gidiyor. MCU dan gönderilen bilginin sprintf gibi bir fonksiyonla "Formatlanmış" olması gerekir ki nereden neyi ne kadar alacağınızı bilin.

örnek mcu dan gönderdiğim string katarı

char Deger[48];
	sprintf (Deger,"P%2.2fB%2.2f\n",PV,Bat);
	USART_puts(USART3,Deger);


buda bilgisayarda alıp böldüğüm fonksiyonlardan birkaçı

            textStartAdress = (InStr(Me.TextBox1.Text, "P")) + 1
            textStopAdress = InStr(Me.TextBox1.Text, "B")
            TextLeght = textStopAdress - textStartAdress

            If textStartAdress > 0 And textStopAdress > textStartAdress Then
                PvVoltage = (Mid(TextBox1.Text, textStartAdress, TextLeght)) / 100
                Me.Label3.Text = PvVoltage
            End If

            textStartAdress = (InStr(Me.TextBox1.Text, "B")) + 1
            textStopAdress = InStr(Me.TextBox1.Text, "C")
            TextLeght = textStopAdress - textStartAdress

            If textStartAdress > 0 And textStopAdress > textStartAdress Then
                BatVoltage = (Mid(TextBox1.Text, textStartAdress, TextLeght)) / 100
                Me.Label5.Text = BatVoltage
            End If


yukardaki kodun çalışmasını anlatayım.

MCU dan gelen bilgiden önce "P" nin -ki bunu bilerek değerin önüne ben koydum- satır içerisindeki yerini buluyorum. Sonrasında Gelen bilginin içerisindeki "B" nin yerinide buluyor aradaki değeri kesip alıyorum. Böylelikle değer değişiminden kaynaklı olan fazla bilgi alma yada az bilgi alma ve bunları yanlış yerlere label yada textbox gibi atma durumunun önüne geçmiş oluyorum.

belki kodlar işinize yaramayacak ama en azından bir yol çizer.

semih

muhittin_kaplan dediğiniz belirli verileri göndermek için mi? Ben sürekli değişken veriler ile çalıştığım için verileri bu şekilde bilgisayara aktarıyorum.

muhittin_kaplan

Yok hocam istediğiniz veri olsun. Timer a bağlarsanız bir yerlerde hatalı almaya başlarsınız.
ben genelde PC de VB.net kullanıyorum. C# da çevirirsiniz.

Dim WithEvents mySerialPort As SerialPort = New System.IO.Ports.SerialPort
    Delegate Sub SetTextCallback(ByVal [text] As String)


ile seriport oluşturulup delegate oluşturuluyor.

seri portun event ine settext e yönlediriyor.

    Private Sub mySerialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles mySerialPort.DataReceived

        SetText(mySerialPort.ReadLine)

    End Sub


aşağıdaki fonksiyon ilede bilgiyi alıyorum.

  Private Sub SetText(ByVal [text] As String)
        Try
            If Me.TextBox1.InvokeRequired Then
                Dim d As New SetTextCallback(AddressOf SetText)
                Me.Invoke(d, New Object() {[text]})


            End If
            TextBox1.Text = [text]
..
..
..
..

Bloodofvol

Teşekkür ederim yardımlarınız için ama hala sorunu çözemedim.Bu receivebuffer tarzı bişey c# da nasıl kullanılır.Gelen veriyi geçici hafızya ekleyip buyyona basınca yazdırmayı düşünüyorum.