rs232 c# arayüzü donuyor

Başlatan electricker, 12 Haziran 2013, 19:04:14

electricker

Pic e veri göndermek için bu küçük uygulamayı yaptım. Bağlantıda sıkıntı olup olmadığını anlamak için usb - seri çeviricinin 2 ve 3 uncu çıkışlarını kısa devre yaptım. Gönderdiğim verinin aynı şekilde geri dönmesini bekledim. Veriyi yazıp mesela 'a' harfini gönderiyorum uygulama donuyor. Yardımınız için şimdiden teşekkür ederim.   
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (!serialPort1.IsOpen)
            {
                serialPort1.Open();
            }
            string veri = textBox1.Text;
            serialPort1.WriteLine(veri);


            string gelen_veri = serialPort1.ReadLine();
            textBox2.Text = gelen_veri;
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {

        }
    }
}



X-Fi

line okuyorsun line göndermen lazım "\r\n" ekleyebilirsin string sonuna ayrıca gönderdikten sonrada Thread.Sleep(10); gibi bir ifadeyle beklemen gerek yada okuma işini kesmesinde yapmalısın.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

electricker

thread komutunu ekledim ancak yine donma yaşanıyor

Gökhan BEKEN

Bütün com portlarını listeletip, takılan com portu kullanıcıya seçtirtip denediniz mi?
Ayrıca seri port nesnesini eklediniz mi?
Formun load olayını aşağıdaki gibi yapmanızı tavsiye ederim. Aşağıdaki kodları eklemeniz için comboBox1 nesnesi olması gerekiyor.

private void Form1_Load(object sender, EventArgs e)
 
{
 
string[] portlar = SerialPort.GetPortNames();  // portları dizi halinde aldık
 
foreach (string port in portlar)
 
{
 
comboBox1.Items.Add(port.ToString()); // Portlarımızı combobox ın içine aldık.
 
}
 
CheckForIllegalCrossThreadCalls = false;  //bunu silmeyiniz.
 
}




bağlantı için bu fonsiyonu kullanabilirsiniz:
void seri_port_baglan()
 
{
 
if (serialPort1.IsOpen) // Bağlantıyı açıyoruz.eğer önceden bağlan butonuna basmış isek yani bağlantıyı açmışsak aşağıdaki hata mesajını verecektir.
 
{
 
MessageBox.Show("Port Açık Bulunmaktadır..", "Bilgi", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button3);
 
return;
 
}
 
else
 
{
 
try
 
{
 
serialPort1.BaudRate = int.Parse("9600"); // Hız olarak 9600 verdik.
 
serialPort1.DataBits = int.Parse("8"); // Veri bit ini de 8 bit olarak verdik
 
serialPort1.StopBits = System.IO.Ports.StopBits.One; // Durma bitini tek sefer olarak verdik.
 
serialPort1.Parity = Parity.None; // eşlik bit ini vermedik.
 
serialPort1.PortName = comboBox1.Text; // Port adlarını comboboxtan alıyoruz.
 
serialPort1.Open(); // Bağlantıyı açıyoruz
 
MessageBox.Show("Bağlantı Başarılı");
 
}
 
catch (Exception) // Herhangi bir hata anında alttaki hata mesajını alacağız..
 
{
 
MessageBox.Show("cihazınız bağlı değil...", "Bilgi", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button3);
 
}
 
}
 
}



veri göndermek için aşağıdaki fonsiyonu kullanabilirsiniz:
 
private void seri_port_data_gonder(string gonderilecek_veri)
 
{
 
try
 
{
 
if (serialPort1.IsOpen)
 
{
 
serialPort1.Write(gonderilecek_veri);
 
System.Threading.Thread.Sleep(150);
 
//alıcı cihaza okuması için biraz süre tanımak gerek, kul yapısı sonuçta <img src="http://gokhanbeken.com/wp-includes/images/smilies/icon_biggrin.gif" alt=":D" class="wp-smiley">
 
}
 
}
 
catch (Exception)
 
{
 
MessageBox.Show("Sonuç: Başarısız !", "Bilgi", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button3);
 
}
 
}
 
void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
 
{
 
byte[] buffer;
 
buffer = new byte[1];
 
serialPort1.Read(buffer, 0, 0);
 
MessageBox.Show("Gelen veri:" serialPort1.ReadExisting());
 
// her gelen veriyi otomatik görmenize gerek yoksa bu satırın başına // koyunuz
 
}
 
private void button1_Click(object sender, EventArgs e) //veri gönderme butonu
 
{
 
seri_port_data_gonder(textbox1.text+(Char)13);
 
//textboxtaki veriyi, yazdığımız fonksiyon aracılığıyla rs232 den gönderiyoruz.
 
//char13, enterin ascii kodudur.
 
}
 
}
 
}
Özel mesaj okumuyorum, lütfen göndermeyin.

electricker

comportları listeletmedim hocam , com6 da rs232-usb dönüştürücüsü vardı ona denk olarak , serial nesnesini ekleyerek data gönderip basitçe data okumaya çalıştım ama mantıkda mı hata var anlamadım ? kusura bakmayın combobox1 olayını detaylı anlatır mısınız ?

Gökhan BEKEN

combobox nesnesi vardır, tıklayınca ufak bir liste çıkar kullanıcının seçim yapması sağlanır:


Amacımız hangi com dan gönderileceğini seçmektir, isterseniz combobox kullanmadan direkt com6 da diyebilirsiniz. Tabi com6 değilse çalışmayacaktır.

Siz yukarıdaki yazdığım bağlantı fonksiyonu ve veri gönderme fonksiyonunu bir deneyin, sorun olursa yazarsınız.
Özel mesaj okumuyorum, lütfen göndermeyin.

electricker

Bi de hocam ben usb-rs232 dönüştürücü kullanıyorum . Bunların 5.pini toprağa vermeden , rx tx ini direk kısa devre etsem olur mu ?

Gökhan BEKEN

Alıntı yapılan: electricker - 14 Haziran 2013, 14:41:22
Bi de hocam ben usb-rs232 dönüştürücü kullanıyorum . Bunların 5.pini toprağa vermeden , rx tx ini direk kısa devre etsem olur mu ?
GND başka devrelere adapte ettiğimizde, anlaşmalarını sağlamak için gereklidir. tx ve rx kısa devre olacaksa gerek yok.
Dönüştürücünün driverini yüklediğinizden de emin olun.
Özel mesaj okumuyorum, lütfen göndermeyin.

electricker

Driverı baska bılgısayarlara yuklerken sıkıntı cıkarmıstı hocam , kısısel bılgısayarıma ılk yukledıgımde unlem ısaretı vardı ıkıncı kez sılıp yukledım unlem ısaretı kalktı ancak markası HL-340 dıye gecıyor , yalnız aygıt yonetıcısınde Profıl ısmıyle  gorunuyor ama unlem ısaretı yok ve com 6 ya takılı

Gökhan BEKEN

1-Seri port ile çalışan bir devre var mı, çeviriciyi test etmek için?
2-Kendi programınızın çalıştığından emin olmadığınız için, öncelikle terminal programı kullanın bence. Ben tera term kullanıyorum, burdan indirebilirsiniz: http://logmett.com/index.php?/download/tera-term-478-freeware.html
Özel mesaj okumuyorum, lütfen göndermeyin.

electricker

Pinlerde yazanlarla gercekteki pin numaraları uyuşmuyormuş hocam . 3 ve 4 konnektörde 2 ve 3 olarak geçiyor . Bunca uğraştırdı beni ancak gerek sizden gerekse sayfanızdan, netten  epey şey öğrendim seri portla ilgili , bu hata sayesinde   :)

Gökhan BEKEN

Sorun halloldu mu yani?
3 ve 4. pin olduğunu nerden görmüştün?
bu arada bu dökümanı seri port ile yeni tanışanlar için yazmıştım işine yarayabilir: http://gokhanbeken.com/?p=753
Özel mesaj okumuyorum, lütfen göndermeyin.

electricker

Seri port dönüştürücüde 3 ve 4 yazmışlar ama şekilden incelediğimde 2 ve 3. pinler normalde. Sorunu bu şekilde düzelttim hocam teşekkürler.