c#'da seri Porttan veri okuma

Başlatan Mucit23, 08 Ekim 2015, 14:22:15

Mucit23

Selamlar,

Daha önce C# da seri port ile haberleşen birkaç uygulama yapmıştım. Şimdi yine benzer bir iş için c# da seri port kullanmam gerekiyor. Eski programlardan faydalanarak programımı hazırladım.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.IO;
using System.IO.Ports;
using Microsoft.Win32;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        int baud = 0;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                serialPort1.Close();
            }
            serialPort1 = new SerialPort();
            serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);

            toolStripStatusLabel1.ForeColor = Color.Red;
            toolStripStatusLabel1.Text = "Bağlantı Bekleniyor";
            comboBox2.SelectedIndex = 3;
            baud_index();

            foreach (string item in System.IO.Ports.SerialPort.GetPortNames())  //Serial Port İsimleri alınıyor. 
            {
                comboBox1.Items.Add(item);
                comboBox1.SelectedIndex = 0;
            }
        }

        private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
        {
            baud_index();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen == false)
            {
                serialPort1.PortName = comboBox1.SelectedItem.ToString();
                serialPort1.BaudRate = baud;
                serialPort1.Parity = Parity.None;
                serialPort1.StopBits = StopBits.One;
                serialPort1.DataBits = 8;


                try
                {
                    serialPort1.Open();
                    button1.Text = "DisConnect";
                    toolStripStatusLabel1.ForeColor = Color.Green;
                    toolStripStatusLabel1.Text = "Bağlantı Kuruldu";
                    comboBox1.Enabled = false;
                    comboBox2.Enabled = false;
                    serialPort1.DiscardInBuffer();
                    serialPort1.DiscardOutBuffer();
                }
                catch (Exception)
                {
                    MessageBox.Show(this, "Bir Hata algılandı. Lütfen Daha sonra Tekrar deneyin", "Hata!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
            else
            {
                serialPort1.Close();
                button1.Text = "Connect";
                comboBox1.Enabled = true;
                comboBox2.Enabled = true;
                toolStripStatusLabel1.ForeColor = Color.Red;
                toolStripStatusLabel1.Text = "Bağlantı Kesildi";
            }

        }

        public delegate void delegateG();

        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            String RxString = serialPort1.ReadLine();
            textBox2.Text = "Veri Geldi";  //Mesaj geldiğini anlamak için yaptım. 
            textBox1.BeginInvoke(new delegateG(guncelle)); 
        }

        public void guncelle()
        {
            int yeni=0;
            int recived = serialPort1.ReadByte();

            if (recived != yeni)
            {
                yeni = recived;
                textBox1.Text += recived.ToString();
            }

            if (textBox1.TextLength == 100)
            {
                textBox1.Text = "";
            }
        }

        public void baud_index()
        {
            switch (comboBox2.SelectedIndex)
            {
                case 0:
                    baud = 1200;
                    break;
                case 1:
                    baud = 2400;
                    break;
                case 2:
                    baud = 4800;
                    break;
                case 3:
                    baud = 9600;
                    break;
                case 4:
                    baud = 19200;
                    break;
                case 5:
                    baud = 38400;
                    break;
                case 6:
                    baud = 57600;
                    break;
                case 7:
                    baud = 15200;
                    break;
            }

        }

    }
}

Com porta bağlanıyorum ama PC ye veri geldiği zaman serialPort1_DataReceived eventi oluşmuyor. Ufak bir yerde hata yapıyor olmam gerek. Sorun ne olabilir?

kudretuzuner

Merhaba,
C# yazılımını bilmiyorum ama genel olarak yazayım,seriportu açtınız mı?Ayrıca PC'ye gelecek dataların ne olduğunu bilir de evanta ona göre bir yazılım yazarsanız gelen dataları görebilirsiniz.Not:gelecek dataları yazarsanız VB.Net kodlarını verebilirim.
Amatör

Gökhan BEKEN

eventi kopyala yapıştır yaparsan olmaz, sağ tarafta serial port 1'in event kısmına gel receiving'e tıkla otomatik oluştursun.
Özel mesaj okumuyorum, lütfen göndermeyin.

Mucit23

Hocam öyle yaptım zaten. Eventi kendi oluşturdu. 

tunayk

#4
Aslında altyapı olarak sorun yok.  Lakin tespit yapabilmek için doğru olması gereken diğer parametreler de var.
MTM nin dediği bir byte'lık alım için ReceiveTreshold  değeri bir olmalıdır. Eğer daha büyük bir sayı ise okadalık byte gelmedikçe event tetiklenmez.
İkinci olarak gelen datanın baud rate ve parityleri tutmalıdır. Eğer bunda bir hata varsa yine event oluşmaz. DataError eventi oluşur.
Fiziksel bağlantıda sorun olabilir. Rx Tx pinleri hatalı bağlanmış olabilir.  Yazılımı test için bir kablo ile seriportun 2.ve3. pinlerini kısadevre edip kendi programınızın içinden veri gönderin. Gönderdiklerinizi okuyorsanız yazılımınız sağlam fakat karşıdaki cihazda sorun vardır.
Bir de evente hiç mi girmiyor yoksa giriyorda  istediğiniz gibi mi davranmıyor.  Örneğin ReadLine ile okuma yapmışsınız. Ancak satır sonu gelmemişse doğru çalışmayacaktır.  Bunun yerine ReadExisting() metodu daha iyi çalışabilir.
Yüksek ihitmal 1.bytta event oluşuyor ancak direk okuma yapıldığı ve satır sonu görmediği için doğru çalışmıyordur. Bunu engellemek için evente ilk girdiğinde 100ms bekleyip öyle okuma yapabilir veya gelen dataları bir kuyrukta biriktirip sonra işleyebilirisiniz.