Baglanti noktası kapalı hatası nasıl çözülür

Başlatan cebeci006, 20 Eylül 2014, 20:02:58

cebeci006





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.


barisertekin

Portun kapalı olduğunu söylüyor.

O satırdan önce if(port kapalıysa) port.open(); şeklinde kullanırsanız çözülür.

Kabil ATICI

#2
  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.
ambar7

cebeci006

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

Kabil ATICI

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...
ambar7

barisertekin

#5
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.

cebeci006

ambar 7 dediğini uyguladım 1 kere portu açıp kapatınca bu hatayı verdi




cebeci006

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.

barisertekin

#8
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.

Kabil ATICI

Haklısınız.
Bilgilendirme için teşekkür ederim.
ambar7

cebeci006

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?

barisertekin

#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

Kabil ATICI

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.
ambar7

cebeci006

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ı?

cebeci006

Ş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)




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





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ı.)