Picproje Elektronik Sitesi

PROGRAMLAMA DİLLERİ => Visual C# => Konuyu başlatan: cebeci006 - 20 Eylül 2014, 20:02:58

Başlık: Baglanti noktası kapalı hatası nasıl çözülür
Gönderen: cebeci006 - 20 Eylül 2014, 20:02:58

(http://s10.postimg.cc/qn36k2wo5/image.jpg) (http://postimg.cc/image/qn36k2wo5/)


arkadaşlar seri port ile arm mikrodenetleyiciden aldıgım gerilim degerini texbox1 e atıp onu da grafik olarak gösteriyorum.
problem bi kaç kere port baglan , port baglantısı durdur yaptıgımda resimdeki hatayı alıyorum sorun nerde acaba yardım edebilir misiniz.

Başlık: Ynt: Baglanti noktası kapalı hatası nasıl çözülür
Gönderen: barisertekin - 21 Eylül 2014, 20:12:48
Portun kapalı olduğunu söylüyor.

O satırdan önce if(port kapalıysa) port.open(); şeklinde kullanırsanız çözülür.
Başlık: Ynt: Baglanti noktası kapalı hatası nasıl çözülür
Gönderen: Kabil ATICI - 21 Eylül 2014, 20:31:31
  public void port_ac()
        {
            //port açma için
            if (serialPort1.IsOpen == false)
            {
                if (hata_bay == 0)
                {
                    try
                    {
                        serialPort1.Open();
                    }
                    catch (System.IO.IOException ex)
                    {
                        string mese;
                        mese = ex.ToString();
                        mese = "Bilgisayardaki Bluetooth modülün bağlantı ve ayarlarını kontrol edip Seri portu tekrar seçin. \"Atmega8 ve DS1820 ile Bluetooth İletişimli Termometre\" çalıştığına emin olun";

                        MessageBox.Show(mese, "BLUETOOTH BAĞLANTI HATASI", MessageBoxButtons.OK,
              MessageBoxIcon.Exclamation,
              MessageBoxDefaultButton.Button1);
                        hata_bay = 1; //hata oluştu
                        richTextBox1.Visible = true;
                    }
                }

            }
        }
public void port_kapa()
        {
            if (hata_bay == 0)
            {
                //port kapatam için
                if (serialPort1.IsOpen == true)
                {
                    try
                    {
                        serialPort1.Close();
                    }
                    catch (System.IO.IOException ex)
                    {
                        string mese;
                        mese = ex.ToString();
                        mese = "Bu programı çalıştırmadan önce Bluetooth modülün çalıştığına emin olun.";
                        MessageBox.Show(mese, "BLUETOOTH BAĞLANTI HATASI");
                    }
                }
            }

        }

        public void port_gonder(byte[] seriGonder)
        {
            if (hata_bay == 0)
            {
                //porta veri göndermek için
                try
                {
                    serialPort1.Write(seriGonder, 0, 1); //yaz
                }
                catch (System.IO.IOException ex)//seri port hatası
                {
                    string mese;
                    timer1.Enabled = false;
                    mese = ex.ToString();
                    mese = "Bluetooth modülün bağlantı ve ayarlarını kontrol edin. \"Atmega8 ve DS1820 ile Bluetooth İletişimli Termometre\" çalıştığına emin olun.";
                    MessageBox.Show(mese, "BLUETOOTH BAĞLANTI HATASI",
                        MessageBoxButtons.OK,
          MessageBoxIcon.Exclamation,
          MessageBoxDefaultButton.Button1);
                    hata_bay = 1;
                    button1.Enabled = false;
                    button1.Text = "Sürekli Oku";
                }
                catch (InvalidOperationException ex) //geçersiz işlem hatası
                {
                    string mese;
                    timer1.Enabled = false;
                    mese = ex.ToString();
                    mese = "Bluetooth modülün bağlantı ve ayarlarını kontrol edin. \"Atmega8 ve DS1820 ile Bluetooth İletişimli Termometre\" çalıştığına emin olun";
                    MessageBox.Show(mese, "BLUETOOTH BAĞLANTI HATASI",
                        MessageBoxButtons.OK,
          MessageBoxIcon.Exclamation,
          MessageBoxDefaultButton.Button1);
                    hata_bay = 1;
                  button1.Enabled = false;
                    button1.Text = "Sürekli Oku";
                }
            }
            else
            {
                timer1.Enabled = false;
            }


        }
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {

           // string Veri;
            int Veri = 0;
            try
            {
                Veri = serialPort1.ReadByte();
                // if (Veri != "")
                // {
                //     veri_1 = (int)Veri;
                //  }
            }
            catch
            {
                Veri=0;
            }
            // Veri = serialPort1.ReadExisting();
            finally
            {
                // this.Invoke(this.BenimDelegem, new Object[] { Veri.ToString() });
                this.BeginInvoke(new EventHandler(delegate
                {
                    veri_1 = Veri;
                    PortDinle("a");

                }));
                Application.DoEvents();
            }
        }


yukarıdaki örnek c# için port açma, kapama ve okuma işlemlerini buna benzer şekilde yapabilirsen en azından bir hata olursa doğrudan uyarı şeklinde alırsın.
Seri port (Bluetooth modül üzerinden) kullanılan bir sistemdi. O yüzden mesajlar o sistemle ilgili.
Başlık: Ynt: Baglanti noktası kapalı hatası nasıl çözülür
Gönderen: cebeci006 - 21 Eylül 2014, 21:59:43

private void buttonStart_Click(object sender, EventArgs e)
        {
            serialPort1.PortName = comboBox1.SelectedItem.ToString();
            serialPort1.BaudRate = 115200;

            serialPort1.ReadTimeout = 1000;

            serialPort1.Open();
           
            serialPort1.DataReceived += serialPort1_DataReceived;

                       
            if (serialPort1.IsOpen)
            {
                buttonStart.Enabled = false;
                buttonStop.Enabled = true;
                label7.Visible = true;
                timer1.Enabled = true;
               
            }
}


        private void buttonStop_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                serialPort1.Close();
               
                buttonStart.Enabled = true;
                buttonStop.Enabled = false;
                timer1.Enabled = false;
                progressBar1.Visible = false;

            }
           
        }

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
           
            string line = serialPort1.ReadTo("\n\r");
            textBox1.Text = line;
        }


kodlar şu şekilde zaten aynı mantıkta sizinkiyle 3 kereden fazla portu durdurup çalıştırdıgımda hata alıyorum sorunu çözemedim
Başlık: Ynt: Baglanti noktası kapalı hatası nasıl çözülür
Gönderen: Kabil ATICI - 22 Eylül 2014, 08:53:47
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
if (serialPort1.IsOpen == false)
            {
...
serialPort1.Open();
}
string line = serialPort1.ReadTo("\n\r");
            textBox1.Text = line;
...


şeklinde dene.
Program başlat - durdur butonundan farklı bir kaynaktan harekete geçerse portu okumak istediğinde portu açar...
Başlık: Ynt: Baglanti noktası kapalı hatası nasıl çözülür
Gönderen: barisertekin - 22 Eylül 2014, 11:02:26
Bu kodlar yanlış yerde. Sayfanın Load eventinde bir kez çalışmaları yeterli.


serialPort1.PortName = comboBox1.SelectedItem.ToString();
serialPort1.BaudRate = 115200;
serialPort1.ReadTimeout = 1000;
serialPort1.DataReceived += serialPort1_DataReceived;


Ayrıca "timer1.Enabled = true;" satırını görünce acaba okuma işlemini timer'da mı yapıyorsunuz diye düşünmedim değil. Data_Received eventinde okuma yapmalısınız.
Başlık: Ynt: Baglanti noktası kapalı hatası nasıl çözülür
Gönderen: cebeci006 - 22 Eylül 2014, 17:17:26
ambar 7 dediğini uyguladım 1 kere portu açıp kapatınca bu hatayı verdi


(http://s8.postimg.cc/nn43t1vmp/image.jpg) (http://postimg.cc/image/nn43t1vmp/)
Başlık: Ynt: Baglanti noktası kapalı hatası nasıl çözülür
Gönderen: cebeci006 - 22 Eylül 2014, 17:24:15
barisertekin

dediklerini uyguladım oldu gibi baglan butona bastıgımda serialPort1.PortName = comboBox1.SelectedItem.ToString(); comboboxdan aktif olan comportu seçiyordum. sen bunları form load a yap dedin form load da aktif comportu nasıl seçecek acaba.
Başlık: Ynt: Baglanti noktası kapalı hatası nasıl çözülür
Gönderen: barisertekin - 24 Eylül 2014, 17:51:17
serialPort1.PortName = comboBox1.SelectedItem.ToString();
Bu satırı load eventi yerine Start butonuna koy o zaman. Diğerlerini bir kere set etmek yeterli.

@Ambar7 paylaştığınız kod parçacığı problemli.

Data_Received içerisinde port açılmaz.
Data_Received cihazdan veri gelince tetiklenir. Data_Received'a girmişse zaten port açıktır.
Başlık: Ynt: Baglanti noktası kapalı hatası nasıl çözülür
Gönderen: Kabil ATICI - 24 Eylül 2014, 18:57:05
Haklısınız.
Bilgilendirme için teşekkür ederim.
Başlık: Ynt: Baglanti noktası kapalı hatası nasıl çözülür
Gönderen: cebeci006 - 24 Eylül 2014, 20:09:02
arkadaşlar arm mikrodenetleyici tarafında ölçtüğüm gerilim degerlerini C# da gösteriyorum. arm dan ölçüp degerleri porta gönderiyorum.Seri Porta gelen verilere baktıgımda toplamda 1 saniyede 400 veri alıyorum (Putty terminale gelen verileri saydırdım) ama C# a gelen verilere baktıgımda listbox yada textboxta 1 saniyede 63 veri geliyor. her türlü okuma yolunu denedim hepsinde 1 saniyede 63 tane veri alabiliyorum problem nerde yardımcı olur musunuz?
Başlık: Ynt: Baglanti noktası kapalı hatası nasıl çözülür
Gönderen: barisertekin - 25 Eylül 2014, 10:32:11
Baudrate : Sinyalin saniyede değişim sayısıdır. Baud ne kadar yüksekse aynı hat üzerinden o kadar fazla veri iletilir.

Gerçi sen 115200 vermişsin. Gayet iyi bir hız olduğunu düşünüyorum. Tabi iletmeye çalıştığınız verinin boyutunu bilmiyorum.

Aygıt yöneticisinden o portun özelliklerinden de baud ayarını 115200 yapmak gerekiyor olabilir mi emin değilim. Bir dene istersen.

BaudRate Types:
http://msdn.microsoft.com/en-us/library/ee425155.aspx (http://msdn.microsoft.com/en-us/library/ee425155.aspx)
Başlık: Ynt: Baglanti noktası kapalı hatası nasıl çözülür
Gönderen: Kabil ATICI - 25 Eylül 2014, 10:39:13
Bilgisayardaki programın işlem yaparken harcadığı zamanı göz önüne almalısın. Tamam bilmem kaç GHz işlemcili makinede çalışıyorsun, ama C# bir sürü curcuna arasında çalışıyor. O yüzden istediğin hızda iletişim sıkıntı olabilir.

Bildiğim kadarı ile bu yüzden C++ gibi diller var.
Başlık: Ynt: Baglanti noktası kapalı hatası nasıl çözülür
Gönderen: cebeci006 - 25 Eylül 2014, 18:06:42
baundrate en fazla 115200 de program düzgün veri alabiliyor. yani hızı olabildigince yüksek tuttum. aygıt yöneticisinden de portun hızını 115200 yaptım. aldıgım veriler 8 bitlik. yani bu porttaki saniyede 400 veriyi C# da görmem imkansız mı?
Başlık: Ynt: Baglanti noktası kapalı hatası nasıl çözülür
Gönderen: cebeci006 - 25 Eylül 2014, 18:47:49
Şu şekilde açıklayayım. arm mikrodenetleyicide saniyede yaklaşık 400 veri(adc ile ölçtüğüm gerilim degerleri) alıyorum porta gelen veri ler resimdeki gibi(mV cinsinden)


(http://s14.postimg.cc/85eml2k7h/yyy.jpg) (http://postimg.cc/image/85eml2k7h/)

C# a verileri alınca list box daki veri sayısını excelde gösterdiğimde şu şekilde



(http://s17.postimg.cc/7yq85tl6z/cccc.jpg) (http://postimg.cc/image/7yq85tl6z/)

listboxdaki verileri excele saniyesini hatta salisesini göstererek attıgımda 49. saniyeden 50. saniye ye kadar resimdede gösterdim sadece 63 adet veri alabiliyorum . sorun nerde çözemedim(baundrate arttırdım, delay_ms() azalltım hiç bir değişiklik olmadı.)
Başlık: Ynt: Baglanti noktası kapalı hatası nasıl çözülür
Gönderen: barisertekin - 26 Eylül 2014, 12:12:48
DataReceived eventini paylaşırsanız daha iyi olur. ReadLine() mı yoksa ReadExisting() mi kullanıyorsunuz kodlara bir bakalım.
Başlık: Ynt: Baglanti noktası kapalı hatası nasıl çözülür
Gönderen: cebeci006 - 26 Eylül 2014, 13:46:04
data receivden eventi şu şekilde readline, readexisting, readto hepsini denedim aynı sorunu çözemedim.


private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {

       
         
                string data = serialPort1.ReadLine();

                listBox1.Items.Add(data.ToString());
                listBox2.Items.Add(System.DateTime.Now.ToString("dd.MM.yyyy , HH:mm:ss:fff"));
          }
Başlık: Ynt: Baglanti noktası kapalı hatası nasıl çözülür
Gönderen: barisertekin - 26 Eylül 2014, 17:25:47
SerialPort okuma işlemini farklı bir thread içerisinde yaparsan sorun çözülecektir. Listbox'a yazma işlemleri gecikme yapıyor.

string DispString;
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    DispString = serialPort1.ReadExisting();
    this.Invoke(new EventHandler(DisplayText));
}

private void DisplayText(object sender, EventArgs e)
{
    listBox1.Items.Add(DispString);
}


DisplayText Methodu ana program içerisinde yer alıyor.
Sen farklı bir thread içerisinde çalışan data_received metodunda DispString değişkenine veriyi atıp ana programa o DispString değişkenini listboxa yazma görevini verip işine devam ediyorsun.
Böylece gecikmeyi serialport'tan okuma yapan thread yerine ana program üstleniyor.
Başlık: Ynt: Baglanti noktası kapalı hatası nasıl çözülür
Gönderen: cebeci006 - 26 Eylül 2014, 18:12:33
barisertekin dediğini yaptım readexisting ile okumada veriler bozuk geliyor. readline ile yaptım yine hızda bi artma yok 63 veri 1 saniyede geliyor listbox a sorun pc işlemcisinin hızından kaynaklanıyo olabilirmi.

mesaj birleştirme:: 26 Eylül 2014, 18:17:39


(http://s27.postimg.cc/cehqr1kqn/Ads_z.jpg) (http://postimg.cc/image/cehqr1kqn/)

resimdede gözüküyo C# listbox a her 16 milisaniyede bir veri alıyor. Bunu arttırmam lazım toplamdada yine 63 veri 1 saniyede alabiliyorum.
Başlık: Ynt: Baglanti noktası kapalı hatası nasıl çözülür
Gönderen: barisertekin - 27 Eylül 2014, 01:30:09
Dediğini yaptım derken, başka bir thread içerisine serialport işlemlerini düzgün gerçekleştirebildiğinize emin misiniz?

Madem C# tan şüphe ediyorsunuz. C# ile yazılmış bir terminal uygulaması indirip test ediniz. Çalışıyorsa kodlarının inceleyiniz.
Başlık: Ynt: Baglanti noktası kapalı hatası nasıl çözülür
Gönderen: cebeci006 - 29 Eylül 2014, 16:39:23
başka thread içerisinde de çalıştırdım en fazla 1 saniyede 63 veri okudum ordada bu hızı artırmam lazımm.

başka terminal programları çalıştırdım benim çalıoşmam dan bi farkı yok okuma metotlarımız aynı sorun neden yavaş okuyo C# .

putty' terminal programına 400 veri gelirken C# 63 veriden fazla çekemedim 1 saniyede