Arduino'dan c#a veri gödnerme

Başlatan Kevinlomax, 30 Aralık 2018, 11:00:56

Kevinlomax

İyi günler.

Resimde eklediğim arduino kodundaki "kisi" degerini int olacak şekilde c# form ekranında anlık olarak göstermek istiyorum. Nasıl yapabilirim?








Gediz1337

Veri gönderimini basitçe canlandırmak için, bir byte değişkenini her saniye artırıp seri port üzerinden işlemesi (benim açımdan) kolay bir şekilde gönderen bir Arduino kodu olsun.

byte var = 0;

void setup() {
  Serial.begin(115200);
}

void loop() {
  var++;
  
  Serial.print("kisi:");
  Serial.println(var);
  
  delay(1000);
}

Bu kodun çıktısı şu şekilde oluyor;


C# tarafı:
using System;
using System.IO.Ports;
using System.Linq;
using System.Windows.Forms;

namespace SerialParser
{
    public partial class Main : Form
    {
        public Main()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // Form yüklenmeye başladığında bir string dizisine seri port isimlerini al.
            // Eğer bir veya daha fazla port mevcutsa bunları bir combo box içerisine ekle
            // ve varsayılan indis ayarla.
            // Ardından "Port aç" butonunu etkinleştir.

            string[] ports = SerialPort.GetPortNames();

            if (ports.Length > 0)
            {
                foreach (string port in ports)
                {
                    comboBox_AvailablePorts.Items.Add(port);
                }

                comboBox_AvailablePorts.SelectedIndex = 0;

                button_TogglePort.Enabled = true;
            }
        }

        private void button_TogglePort_Click(object sender, EventArgs e)
        {
            // Port zaten açıksa kapat.
            if (serialPort_Arduino.IsOpen)
            {
                timer_SerialRead.Stop();
                serialPort_Arduino.Close();

                button_TogglePort.Text = "Portu aç";
            }
            else
            {
                // "Port aç" butonuna tıklandığında combo box üzerinden seçilen port adını
                // seri port nesnesinin port adı olarak ayarlayıp seri portu aç.
                serialPort_Arduino.PortName = comboBox_AvailablePorts.SelectedItem.ToString();
                serialPort_Arduino.Open();

                // Seri port açıldıysa buton adını düzenle ve veri okuma zamanlayıcısını başlat.
                if (serialPort_Arduino.IsOpen)
                {
                    button_TogglePort.Text = "Portu kapat";

                    timer_SerialRead.Start();
                }
            }
        }

        private void timer_SerialRead_Tick(object sender, EventArgs e)
        {
            // Veri alım bufferında veri varsa,
            if (serialPort_Arduino.BytesToRead > 0)
            {
                // Mevcut veriyi bir stringe aktar
                string receivedData = serialPort_Arduino.ReadExisting();

                // Burası tamamen opsiyonel. Veri alım vaktini göstermek için ufak bir ekleme.
                string now = DateTime.Now.ToString("HH:mm:ss");
                string receivedDataInfo = $"[{now}] {receivedData}";

                // Gelen veri ham haliyle bir text boxa ekle.
                textBox_RawData.AppendText(receivedDataInfo);

                // Daha sonra parse fonksiyonunu gelen veriyi girdi parametresi olacak şekilde çağır
                ParseData(receivedData);
            }
        }

        private void ParseData(string data)
        {
            // Veri iki nokta üst üste karakteri içeriyorsa bizim için anlamlıdır ve işlenmeye çalışılmalıdır.
            // Burası da isteğe bağlıdır, keyfine kalmış.
            if (data.Contains(':'))
            {
                // Gelen veri örneği: "kisi:55"
                // Burada ayraç karakteri 'iki nokta üst üste'dir.
                // Veriyi bu karaktere göre ayırırsak string iki alt metine ayrılır. Bunlar;
                // "kisi" ve "55" olur.
                string[] substrings = data.Split(':');

                // Örnek veri split işlemine tabi tutulursa substrings dizisi aşağıdaki gibi olur:
                // substrings = {"kisi", "55"}

                // Bu dizide bizi ilgilendiren değer dizinin 2. elemanı (1. indis) olur.
                // Bu elemanı (int.TryParse ile) tam sayı olarak çözümlemeye çalışırız.
                // Bu işlem başarılı olursa true döndürür.
                // Başarılı olduğu takdirde bize parsedValue adında bir tamsayı değişkeni üretmesini istiyoruz.
                if (int.TryParse(substrings[1], out int parsedValue))
                {
                    // Burada artık elimizde düzgün bir sayısal değer oluyor. Formda göstermeye hazır.
                    numericUpDown_CurrentValue.Value = parsedValue;
                }
            }
        }

        private void Main_FormClosing(object sender, FormClosingEventArgs e)
        {

            timer_SerialRead.Stop();

            // Lüzümsuz ise söndürünüz.
            if (serialPort_Arduino.IsOpen)
            {
                serialPort_Arduino.Close();
            }
        }
    }
}


Sonuç:



Arduino kodu
C# Solution Klasörü