Picproje Elektronik Sitesi

PROGRAMLAMA DİLLERİ => Visual C# => Konuyu başlatan: Bloodofvol - 31 Mart 2013, 20:26:44

Başlık: İnteger + string ifade serialportla alma
Gönderen: Bloodofvol - 31 Mart 2013, 20:26:44
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.
Başlık: Ynt: İnteger + string ifade serialportla alma
Gönderen: Gökhan BEKEN - 31 Mart 2013, 22:35:27
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);

Başlık: Ynt: İnteger + string ifade serialportla alma
Gönderen: semih - 31 Mart 2013, 23:02:08
string gelen;
gelen=convert.tostring(serialport1.readexisting());
richTextBox1.Text=gelen;
Başlık: Ynt: İnteger + string ifade serialportla alma
Gönderen: Bloodofvol - 31 Mart 2013, 23:24:43
Ö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
Başlık: Ynt: İnteger + string ifade serialportla alma
Gönderen: Extreme - 01 Nisan 2013, 02:43:17
1 hafta sonra teslim mi ediceksiniz bitirme ödevinizi ?
Başlık: Ynt: İnteger + string ifade serialportla alma
Gönderen: Bloodofvol - 01 Nisan 2013, 19:08:38
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.
Başlık: Ynt: İnteger + string ifade serialportla alma
Gönderen: 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 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
Başlık: Ynt: İnteger + string ifade serialportla alma
Gönderen: Gökhan BEKEN - 02 Nisan 2013, 01:28:45
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;






Başlık: Ynt: İnteger + string ifade serialportla alma
Gönderen: semih - 02 Nisan 2013, 11:49:09
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];
Başlık: Ynt: İnteger + string ifade serialportla alma
Gönderen: Bloodofvol - 04 Nisan 2013, 22:12:54
Ç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.
Başlık: Ynt: İnteger + string ifade serialportla alma
Gönderen: semih - 05 Nisan 2013, 09:48:29
Forma timer ekle. Buton_click fonksiyonuna yazdığın kodları timer_tick fonksiyonuna yaz. Yani timer_tick fonksiyonu ile gelen verileri oku.
Başlık: Ynt: İnteger + string ifade serialportla alma
Gönderen: muhittin_kaplan - 05 Nisan 2013, 10:20:03
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.
Başlık: Ynt: İnteger + string ifade serialportla alma
Gönderen: semih - 05 Nisan 2013, 10:26:38
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.
Başlık: Ynt: İnteger + string ifade serialportla alma
Gönderen: muhittin_kaplan - 05 Nisan 2013, 10:35:17
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]
..
..
..
..
Başlık: Ynt: İnteger + string ifade serialportla alma
Gönderen: Bloodofvol - 07 Nisan 2013, 19:12:24
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.
Başlık: Ynt: İnteger + string ifade serialportla alma
Gönderen: Bloodofvol - 09 Nisan 2013, 11:34:57
Arkadaşlar son bir sorum olacaktı.
herhangi bir şekilde dizi kullanmadan "23.44,22.34,45.23....." gibi veriler alıorum.
split komutuyla yada visual basicde ki mid komutu tarzı bir komutla ilk virgülden sonrasını nasıl yazdırabilirim.
Yani verim "23.44,22.34,45.23" ise ben , gülden sonrasını yazdırmak istiorum herhangi bir şekilde dizi kullanmadan.

"22.34,45.23" gibi.
şimdiden teşekkürler.
Başlık: Ynt: İnteger + string ifade serialportla alma
Gönderen: muhittin_kaplan - 09 Nisan 2013, 12:16:47
instr komutunu kullanırım genelde ben. aradığın karanterin string içerisindeki yerini verir.
dim yer as integer
yer=instr(aramayapılacakString, ",")
dersensoldan sağa dolgu ilk virgül ün yerini verir.

sonrasında
textbox=mid(bölünecekString,yer,(bölünecekstring.leght-yer))
dersen bölünecek string i "yer" den başlayarak bölünecekstrin in uzunluğu kadar dan yer in çıkarılarak kalanı bulunur ve okadar alınır.

bölünecekstring="23.44,22.34,45.23"
yer=6 olur (instr den dönen değer)
bölünecekstring.leght=17
bölünecekstring.leght-yer=11

yani
textbox=mid(bölünecekString,yer,(bölünecekstring.leght-yer))
ile 6 dan başlayarak 11 karakteri textbox a atar.

.net de substring gibi fonksiyonlarda var. ben alışkanlıktan dolayı bunlarıda kullanabiliyorum..
Başlık: Ynt: İnteger + string ifade serialportla alma
Gönderen: Bloodofvol - 09 Nisan 2013, 12:30:57
Ama bunlar visual basic comutu deilmi.Bende bu şekilde kullandım visual basicde ama seri port kodlarında ssorun çıktı veriyi alamadım ve c# a geçtim oyuzden.Mid gibi bir komut bulamadım c# da  mid(string , 2) deyip stringde 2. haneden sonrasını yazdırsın yada baktıklarımı yanlış anlıyorum.
Başlık: Ynt: İnteger + string ifade serialportla alma
Gönderen: muhittin_kaplan - 09 Nisan 2013, 22:31:05
c# ile vb.net arasında komut olarak "öyle büyük farklar" yoktur. Yukarda yazdıklarımı C# syntax ına göre yazarsanız çalışır.

mesaj birleştirme:: 09 Nisan 2013, 22:33:56

Alıntı yapılan: Bloodofvol - 09 Nisan 2013, 12:30:57
Ama bunlar visual basic comutu deilmi.Bende bu şekilde kullandım visual basicde ama seri port kodlarında ssorun çıktı veriyi alamadım ve c# a geçtim oyuzden.Mid gibi bir komut bulamadım c# da  mid(string , 2) deyip stringde 2. haneden sonrasını yazdırsın yada baktıklarımı yanlış anlıyorum.
Olmaz Mid Komutunun parametreleri
textebox=mid(AlıntıYapılacakString, AlıntınınBaşlayacağıNokta, AlıntınınNekadarUzunluktaOlacağı)

olarak 3 tanedir.
Başlık: Ynt: İnteger + string ifade serialportla alma
Gönderen: peko - 10 Nisan 2013, 20:49:57
Gelen datayı ne zaman nerde dinleyeceğin üstadlarımızın söylediği gibi çok önemli..



string Rdata = ReceiveData();

public string ReceiveData()
    {
        if (!this.mySerialPort.IsOpen)
            throw new Exception("Port not open.");

        try
        {
            StringBuilder result = new StringBuilder();

            if (mySerialPort.BytesToRead == 0)
            {
                int retries = 0;
                while (retries < 5)
                {
                    Thread.Sleep(150);
                    if (mySerialPort.BytesToRead > 0) break;
                    retries++;
                }
            }

            while (mySerialPort.BytesToRead > 0)
            {
                byte[] buffer = new byte[mySerialPort.BytesToRead];
                int numRead = mySerialPort.Read(buffer,0, buffer.Length);
                if (numRead != 0)
                    result.Append(Encoding.ASCII.GetString(buffer, 0, numRead));
                else
                    break;
                Thread.Sleep(150);
            }
            return result.ToString();
        }
        catch (TimeoutException)
        {
            return "";
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message, ex);
        }

Başlık: Ynt: İnteger + string ifade serialportla alma
Gönderen: Bloodofvol - 12 Nisan 2013, 16:07:56
Hocam çok teşekkürler