UART haberleşmede timer sorunu

Başlatan berkay_91, 02 Eylül 2017, 11:31:53

berkay_91


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;

namespace Arduino_UART
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            comboBox1.DataSource = SerialPort.GetPortNames();
            serialPort1.BaudRate = 9600;
        }

        private void button3_Click(object sender, EventArgs e)  // bağlan ve timer başlat
        {
            if (serialPort1.IsOpen == false)
            {
                serialPort1.PortName = comboBox1.Text;
                serialPort1.Open();
                timer1.Start();
            }

        }

        private void button4_Click(object sender, EventArgs e) // bağlantıyı kes ve timer kapat
        {
            if (serialPort1.IsOpen == true)
            {
                serialPort1.Close();
                timer1.Stop();
            }

        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            try
            {
                string sonuc = serialPort1.ReadLine();
                textBox1.Text = sonuc + "";
                serialPort1.DiscardInBuffer();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message); // basarısız olursa hata verecek.
                timer1.Stop();
            }
        }
    }
}




Merhaba, Arduinoya bağlandıktan sonra verileri düzgün alabiliyorum ancak bağlantıyı kes butonuna tıkladığımda çıkmıyor, bağlantı kesilmiyor. timer nesnesinin interval değerini 200 yaptım yardımcı olur musunuz?

Hadi

verileri neden timer ile alıyorsunuz ki?

omereliusuk

Readexisting (); komutunu kullanıyordum. Gayet de güzel çalışıyordu. Denemek lazım.


baran123

formload eventine şunu yaz
CheckForIllegalCrossThreadCalls = false;


MySerial.PortName = Convert.ToString(cmbPortName.Text);
                    MySerial.BaudRate = Convert.ToInt32(cmbBaudRate.Text);
                    MySerial.DataBits = Convert.ToInt16(cmbDataBits.Text);
                    MySerial.Parity = (Parity)Enum.Parse(typeof(Parity), cmbParityBit.Text);
                    MySerial.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cmbStopBit.Text);
                    MySerial.Handshake = (Handshake)Enum.Parse(typeof(Handshake), cmbHandShake.Text);
                    MySerial.DataReceived += new SerialDataReceivedEventHandler(SerialPort_ReceivedEvent);
                    MySerial.Open();

Sonra "seri init" kısmında şunu yap.

Kesme metodunu oluştur.
internal delegate void SerialDataReceivedEventHandlerDelegate(object sender, SerialDataReceivedEventArgs e);

string rxData = String.Empty;

        private void SerialPort_ReceivedEvent(object sender, SerialDataReceivedEventArgs e)
        {
            rxData = MySerial.ReadLine();
        }


Artık her veri geldiğinde SerialPort_ReceivedEvent bu metoda düşeceksin.
Burada veriyi okuyup işlem yapabilirsin.

Kesme şudur : "Biri geldi mi diye sürekli kapıya bakmaktansa zil çaldığında kapıya bakarız"

muhittin_kaplan

İllagal thread i kapatmak iyi bir yontem degildir.
Onun yerini ne seriportu dinleyecek baska bir thread olusturulmasi gerekir.

baran123

Hakılısınız @muhittin_kaplan hocam ben basit olsun diye bu örneği verdim.
Arkadaş dediğiniz gibi yapmak isterse biraz daha araştırma yapması gerekecek.
Şuralara bir bakınabilirsin.
https://www.codeproject.com/Questions/228124/serial-port-using-threading