Aceminin C# sorulari

Başlatan z, 30 Mayıs 2012, 08:19:05

Mucit23

Yok Hocam çözüm olmadı. Ben bahsettiğim işlemi deneyeceğim. Data alışverişinden MCU'nun haberi olsun. Durduk yere veri göndermesin.

Mucit23

Muhittin Hoca bana kızacak belki ama ben data alımını yine eskisi gibi yaptım. Bu şekilde exceptionlardan kurtuldum. Birde bağlantıyı kesmeden önce mcu ya veri göndermeyi kesmesini söyledim.

Şimdilik dediğim gibi exception almıyorum ama yine donma oluyor. Nasılki Seri port close fonksiyonunu çalıştırdığım zaman sıkıntı oluşmaya başlıyor..

muhittin_kaplan

mucit form closing olayına

MCU veriyi kes
seriportu kapat
Formu Kapat.

desene

f15eagle

#213
benimde bir kaç sorum var,
C# da çok yeniyim, hatta ilk uygulamam.  Foruma biraz baktım seri porttan veri alıp yazdırmayı çözdüm. Daha sonra bir örnek kod buldum verileri yazdırması daha güzel oldu. Şimdi gelen verilerden grafik çizdirmem lazım.

public partial class Form1 : Form
{
       
   public Form1()
   {
      InitializeComponent();

            foreach (string s in SerialPort.GetPortNames())
            {
                portnum_text.Text = s;
            }
    }

        private void connect_port_Click(object sender, EventArgs e)
        {
            try
            {
                seri_port.PortName = portnum_text.Text;
                seri_port.BaudRate = Convert.ToInt32(baud_text.Text);
                seri_port.Open();
                close_port.Enabled = true;
                open_port.Enabled = false;
                baud_text.Enabled = false;
                portnum_text.Enabled = false;

            }
            catch
            {
                MessageBox.Show("Bağlantı kurulamadı.");
            }

        }

        private void close_port_Click(object sender, EventArgs e)
        {
            seri_port.Close();
            close_port.Enabled = false;
            open_port.Enabled = true;
            baud_text.Enabled = true;
            portnum_text.Enabled = true;
     
        }

       

        public void seri_port_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {

            updateReceivedText(seri_port.ReadExisting());
         
        }
        delegate void updateReceivedTextDelegate(string newText);
        private void updateReceivedText(string newText)
        {
            if (received_text.InvokeRequired)
            {
                // worker thread
                updateReceivedTextDelegate del = new updateReceivedTextDelegate(updateReceivedText);
                received_text.Invoke(del, new object[] { newText });
            }
            else
            {
                System.Threading.Thread.Sleep(5);
                received_text.Text += newText;
               
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            received_text.Clear();
        }
   
    }


seri porttan gelen veri şu şekilde,


Benim programda veriler yalnız şu şekilde geliyor, proteusdaki gibi olmuyor. Üst üste biniyor gelenler. Bunu nasıl düzeltebilirim

fatih6761

Alıntı yapılan: f15eagle - 23 Nisan 2013, 19:00:30
benimde bir kaç sorum var,
C# da çok yeniyim, hatta ilk uygulamam.  Foruma biraz baktım seri porttan veri alıp yazdırmayı çözdüm. Daha sonra bir örnek kod buldum verileri yazdırması daha güzel oldu. Şimdi gelen verilerden grafik çizdirmem lazım.

public partial class Form1 : Form
{
       
   public Form1()
   {
      InitializeComponent();

            foreach (string s in SerialPort.GetPortNames())
            {
                portnum_text.Text = s;
            }
    }

        private void connect_port_Click(object sender, EventArgs e)
        {
            try
            {
                seri_port.PortName = portnum_text.Text;
                seri_port.BaudRate = Convert.ToInt32(baud_text.Text);
                seri_port.Open();
                close_port.Enabled = true;
                open_port.Enabled = false;
                baud_text.Enabled = false;
                portnum_text.Enabled = false;

            }
            catch
            {
                MessageBox.Show("Bağlantı kurulamadı.");
            }

        }

        private void close_port_Click(object sender, EventArgs e)
        {
            seri_port.Close();
            close_port.Enabled = false;
            open_port.Enabled = true;
            baud_text.Enabled = true;
            portnum_text.Enabled = true;
     
        }

       

        public void seri_port_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {

            updateReceivedText(seri_port.ReadExisting());
         
        }
        delegate void updateReceivedTextDelegate(string newText);
        private void updateReceivedText(string newText)
        {
            if (received_text.InvokeRequired)
            {
                // worker thread
                updateReceivedTextDelegate del = new updateReceivedTextDelegate(updateReceivedText);
                received_text.Invoke(del, new object[] { newText });
            }
            else
            {
                System.Threading.Thread.Sleep(5);
                received_text.Text += newText;
               
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            received_text.Clear();
        }
   
    }


seri porttan gelen veri şu şekilde,
(Resim gizlendi görmek için tıklayın.)

Benim programda veriler yalnız şu şekilde geliyor, proteusdaki gibi olmuyor. Üst üste biniyor gelenler. Bunu nasıl düzeltebilirim
(Resim gizlendi görmek için tıklayın.)
Hocam seri_port.ReadExisting() fonksiyonu tamponda bulunan veriyi döndürür. Bunun yerine ReadLine deneyebilir misiniz?

f15eagle

Fatih hocam teşekkürler, tam yapmak istediğim işlem oldu.
enkoder tam tur attığında verileri ekrana yazıyor.

Netteki C# örnek ve kitapları genellikle bilgisayar üzerinde işlemler için, biraz daha bize yönelik serialport işlemleri için bir kitap yazı öneriniz var mı acaba ?
Daha yeni başladım nasıl devam etmeliyim.

Bide gelen verilerden 1 kanalı seçip zamanla grafiğini çizmem gerekiyor.
http://hasan-bozkurt.blogspot.com/2009/01/c-ile-grafik-izimi.html
Linkdeki örneği buldum, uyarlamaya çalışıyorum.
Başka grafik işlemi örnekleri var mı ?

fatih6761

Alıntı yapılan: f15eagle - 25 Nisan 2013, 14:04:33
Fatih hocam teşekkürler, tam yapmak istediğim işlem oldu.
enkoder tam tur attığında verileri ekrana yazıyor.

Netteki C# örnek ve kitapları genellikle bilgisayar üzerinde işlemler için, biraz daha bize yönelik serialport işlemleri için bir kitap yazı öneriniz var mı acaba ?
Daha yeni başladım nasıl devam etmeliyim.

Bide gelen verilerden 1 kanalı seçip zamanla grafiğini çizmem gerekiyor.
http://hasan-bozkurt.blogspot.com/2009/01/c-ile-grafik-izimi.html
Linkdeki örneği buldum, uyarlamaya çalışıyorum.
Başka grafik işlemi örnekleri var mı ?
Hocam açıkçası kitap öneremem, çünkü hiçbirini okumadım, kusura bakmayın :(
Grafik çizdirmek için MS Charts yani verdiğiniz linkteki örneği kullanabilirsiniz. Kullanımı basittir, internette bulabilirsiniz...
Kolay gelsin, iyi çalışmalar.

Mucit23

#217
Selamlar,

Uzun bir aradan sonra tekrardan C# 'a bakmam gerekti. USB den ADC verisi alıp Line Graph üzerinde göstermem gerekiyor. Visual Studioda biraz formu hazırladım. Char yerleştirdim ve türünü Line olarak ayarladım.

Fakat X ve Y ekseninin değerlerini bir türlü sabit aralıkta yapamadım. Yapmak istediğim LDR den okuduğum Lüx değerini Açısal olarak gösterebilmek.  Nasıl ayarlayacağımı bilmiyorum. Mesela X eksenini 0-360 arası 1'er birim aralıklarla , Y eksenini de 0-50000 arası sabit bir şekilde ölçeklendirmek istiyorum. Y ekseninin ölçeği değişmeyecek.

Ayarları nasıl yapacağımı bulamadım. Yardım edebilecek varmı

mesaj birleştirme:: 15 Mayıs 2015, 12:20:13

X ve Y ekseni için ölçeklendirmeyi kod ile yaptım.

            chart1.ChartAreas[0].AxisY.Maximum = 50000;
            chart1.ChartAreas[0].AxisX.Maximum = 360;

Ayarlardan nasıl yapacağımı bulamadım bir türlü.

Şimdi X eksenini deki grid sayısını arttırmak istiyorum. X eksenini 360 birim uzunluğunda ayarladım ama ekranda 3 tane grid var sadece. Bunun sıklığını nasıl arttırırım.

Chart'ın okadar çok ayarı varki hangisi benim işimi görüyor nerde bulamıyorum bir türlü.

Mesela formu ilk çalıştırdığımda Chart'ın görünümü aşağıdaki gibi oluyor.

jpg upload
X ve Y ekseni ve Gridler görünmüyor ama chart'a veri gönderdiğimde görünmeye başlıyor. Bunuda çözmem lazım. Formu çalıştırır çalıştırmaz X ve Y ekseni görünür halde olması lazım.

Yardım ederseniz sevinirim.


muhittin_kaplan

mucit ben vb de yapmıştım ama aynıdır.
http://www.muhittinkaplan.com/2012/02/13/stm32f4-discovery-kit-ve-ivmeolcer/ incele bira birşeyler çıkartırsın.

Mucit23

Abi senin kodu inceledim. Senin kullandığın chart'da da aynı problem var. İlk çalıştığı zaman chart'a veri göndermediğimizde klavuz çizgiler eksenler vs görünmüyor.

Bunun yanı sıra chart ta X ekseninde bir türlü istediğimi yapamadım. Anlatabilmek için word üzerinde bir grafik oluşturdum.

bmp resim yükle

Sormak istediğim C# da chart kullanırken X eksenini nasıl resimdeki gibi yaparım? Y eksenine göndereceğim değerin en yüksek değeri 50000 felan ama bu eksen otomatik olsada olur. Sabit olmayadabilir. Fakat X ekseni sabit olması lazım.

Ne yapmam lazım. Bilgili arkadaşlardan ricam yol gösterin lütfen.

muhittin_kaplan

sen bunu propertes penceresinden yapmak mı istiyorsun, kodla yaptın sanırım.

Mucit23

Hocam yukarıda verdiğim grafiği word de çizdim.

Ondan önceki mesajımda ise kod ile x ekseninin uzunluğunu ayarlayabildiğimi söyledim. Properties penceresinden yapamadım bir türlü.

muhittin_kaplan

mucit resimleri göremiyorum.

ERdow

Daha güzel yöntemi nedir bilmiyorum, lakin boş chart göstermek için, chart'a boş bir seri ekleyebilirsiniz, rengi transparan adınıda boş yaparsanız görünür. Sonra ilk gerçek veriniz geldiğinde bunu temizleyip onu ekleyebilirsiniz.

   
            Series dummy = new Series();
            dummy.ChartType = SeriesChartType.Point;
            dummy.Color = Color.Transparent;
            dummy.LegendText = " ";
            dummy.Points.Add(2);
            chart1.Series.Add(dummy);


Chart'ın önceden belli ise (ya da herhangi bir ekseni örneğin X) interval ayarları ile oynanıp birşeyler yapılabilir sanırım. Örneğin 360 maximumunuz için birde minimum 0 ayarlarsanız aşağıdaki kod X eksenini 9 alana böler
            chart1.ChartAreas[0].AxisX.IntervalAutoMode = IntervalAutoMode.FixedCount;
            chart1.ChartAreas[0].AxisX.Interval = 40;



Mucit23

Abi bu resim görünmüyormu


Grafiğimin X eksenini Bu resimdeki gibi yapmak istiyorum. Bu resimde Word de çizdim.