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();
}
}
}
}
(https://s26.postimg.cc/9leakjxv9/Ads_z.png) (https://postimg.cc/image/9leakjxv9/)
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?
verileri neden timer ile alıyorsunuz ki?
Readexisting (); komutunu kullanıyordum. Gayet de güzel çalışıyordu. Denemek lazım.
timer kullanmadan nasıl yapabilirim?
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"
İllagal thread i kapatmak iyi bir yontem degildir.
Onun yerini ne seriportu dinleyecek baska bir thread olusturulmasi gerekir.
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
teşekkürler...