(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.
Portun kapalı olduğunu söylüyor.
O satırdan önce if(port kapalıysa) port.open(); şeklinde kullanırsanız çözülür.
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.
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
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...
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.
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/)
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.
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.
Haklısınız.
Bilgilendirme için teşekkür ederim.
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?
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)
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.
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ı?
Ş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ı.)
DataReceived eventini paylaşırsanız daha iyi olur. ReadLine() mı yoksa ReadExisting() mi kullanıyorsunuz kodlara bir bakalım.
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"));
}
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.
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.
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ş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