C# “Dizin, dizi sınırlarının dışındaydı.” Hatası

Katılım
13 Mar 2022
Mesajlar
59
Puanları
1
Yaş
20
Arduinodan aldığım iki tane potansiyometre verisini C# formda göstermek için aşağıdaki kodu yazdım ama programı çalıştırıp portla bağlantıyı kurduğumda “Dizin, dizi sınırlarının dışındaydı.” diye bir hata alıyorum sorun nedir bilen varsa yardımcı olabilir mi?

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_Haberleşmesi_1_
{
public partial class Form1 : Form
{
string[] portlar = SerialPort.GetPortNames();
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{

foreach (string port in portlar)
{

comboBox1.Items.Add(port);
comboBox1.SelectedIndex = 0;

}
comboBox2.SelectedIndex = 1;
label2.Text = "Bağlantı Kapalı";
}

private void timer1_Tick(object sender, EventArgs e)
{
try
{

string sonuc = serialPort1.ReadExisting();
string[] sonuc_liste = sonuc.Split(' ');
label3.Text = sonuc_liste[0];
label4.Text = sonuc_liste[1];


}
catch (Exception ex)
{

MessageBox.Show(ex.Message);
timer1.Stop();
throw;
}
}

private void button1_Click(object sender, EventArgs e)
{
timer1.Start();
if (serialPort1.IsOpen == false)
{
if (comboBox1.Text == "")
return;
serialPort1.PortName = comboBox1.Text;
serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text);
try
{

serialPort1.Open();
label2.Text = "Bağlantı Açık";

}
catch (Exception hata)
{
MessageBox.Show("Hata: " + hata.Message);
throw;
}
}


else
{

label2.Text = "Bağlantı Kuruldu";

}
}

private void button2_Click(object sender, EventArgs e)
{
timer1.Stop();
if(serialPort1.IsOpen == true)
{

serialPort1.Close();
label2.Text = "Bağlantı Kapalı";

}
}

private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{

timer1.Stop();
if (serialPort1.IsOpen == true)
{

serialPort1.Close();

}

}
}
}
 
Acaba sorun string[] sonuc_liste = sonuc.Split(' '); satırında mı meyadana geliyor, debug yapıp hata yapan satırı ve hata mesajını burada paylaşman mümkün mü ?
 
Acaba sorun string[] sonuc_liste = sonuc.Split(' '); satırında mı meyadana geliyor, debug yapıp hata yapan satırı ve hata mesajını burada paylaşman mümkün mü ?
hocam sorunu çözdüm arduinonun gönderme hızı ve arayüzün okuma hızı senkron olmadığı için liste boş kalıyor listede olmayan elemanı almaya çalıştığım içinde bu hatayı döndürüyormuş...
 
Şimdide stringi intagere çevirirken sorun yaşıyorum
 
Şimdide stringi intagere çevirirken sorun yaşıyorum
Tam olarak hata aldığın satırı yazarmısın ?
Convert işlemi yaptığın string değişkenin içerisinde harhangi bir int olmayan karakter bulunması mümkün mü ?
 
Tam olarak hata aldığın satırı yazarmısın ?
Convert işlemi yaptığın string değişkenin içerisinde harhangi bir int olmayan karakter bulunması mümkün mü ?
tahminimce evet daha önce pythonda veri almayı denemiştim ve bana gelen veride satır sonu ve ne olduğunu bilmediğim bir karakter vermişti terminal çıktısının resmini paylaşıyorum.
 

Ekli dosyalar

  • Ekran Alıntısı.PNG
    29 KB · Görüntüleme: 48
Python deneyimim yok ancak aynı veriyi c# ile çektiğinde string değişkeni yazdır, fazla karakterleri SubString ve Replace yöntemleri ile temizleyebilirsin.
 
Python deneyimim yok ancak aynı veriyi c# ile çektiğinde string değişkeni yazdır, fazla karakterleri SubString ve Replace yöntemleri ile temizleyebilirsin.

Hocam farklı bir forumda aşağıdaki kod örneğini verdiler ama ne olduğunu anlamadım (C# da daha yeniyim ilk projemi yapıyorum) bilginiz varsa - yardımcı olabilirmisiniz?


byte[] messageReceived = new byte[1024];// Data buffer
int byteRecv;
byteRecv = sender.Receive(messageReceived);
string text1 = Encoding.ASCII.GetString(messageReceived, 0, byteRecv);
 
Seri portan bir tek veri alacaksanız yukarıda yazmış olduğunuz "string sonuc = serialPort1.ReadExisting();" satrı sizin için yeterli bunun için byte dizisine ihtiyacınız yok ancak aldığın veriler birden çok sayıda iseler ve peş peşe geliyorlarsa bunları byte dizisi olarak alıp ardında hepsini ayrı ayrı stringlere bölmeniz mümkün.

Bunun için seri portunuzdan ne geldiğine bakmak gerek.
 
hocam ben de aynı hatayı alıyorum ne yapabilrim?
private void serialPort1_DataReceived(object sender,SerialDataReceivedEventArgs e) {
string data;
string[] splitted_data;
data = serialPort1.ReadLine();
splitted_data = data.Split('*');
//if(splitted_data[1].Ex)
textBox5.Text = splitted_data[0];
textBox6.Text = splitted_data[1];
label5.Text=data;
}
kodum bu şekilde. Arduinodan veri alıyorum alınan veri şu şekilde geliyor:
xxx*yyy
"* " dan ayırıp x ve y leri ayrı yazdırmak için kullanıyorum kodu fakat ilk alınan veride eksiklikler olabilirdiği için kod hata veriyor sanırım. Orada değer bulamasa bile tekrar deneyip kodu devam ettirmesi için nasıl bir koşul yazabilirim?
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için onları kabul etmelisiniz. Daha fazla bilgi edin…