PC den MCU ya Veri Gönderilirken Donma Sorunu

Başlatan SB7, 27 Ocak 2022, 18:41:41

SB7

Merhabalar,
Amacım çeşitli sensörleri okuyup GUI çalışmaları yaparak ilerlemek. Önce C# tan ilerleyip mantığı anlayınca android uygulamalar yapmak istiyorum.

-C# ile MCU nun haberleşip veri alışverişi yapması için bir form uygulaması yaptım.MCU dan rastgele değerler gönderip C# ile gelen dataları ayırarak ekranda çeşitli toolboxlar üzerinde göstermeyi hedefliyorum. Yaptığım test programı bu şekilde.


Videodaki form uygulamasında sensör1,sensör2 ve sensör3 dataları MCU dan gönderilen datalar.MCU olarak test amaçlı arduino kullandım(USB HID Daha sonra eklenecek).

SORUNUM: PC den MCU ya veri gönderdiğimde yaklaşık 2 sn form uygulamsı donuyor.
2.Sorun Gelen dataları alt alta textboxa yazıyorum. Textboxun scrolbars özelliğini "Vertical" yaptım ancak imleç sürekli üstte kalıyor.Yeni gelen dataları göremiyorum

-Arduinodan random 2 sayı üretip sürekli gönderiyorum. UART tan veri gelmişşe de gelen veriyi de bir değişkene atıp PC ye gönderiyorum.Yani her seferinde 3 değişken gönderiyorum PC ye ama 3.değişken PC den gelen veri, amacım debug yapmak.Arduino kodum bu şekilde:

int i,j,k;
String data;
void setup() {
Serial.begin(9600);
}
void loop() {
if(Serial.available() > 0){
String deger1=Serial.readString();
k = deger1.toInt();
}   
i  =random(1,100);
j = random(1,100);
Serial.print((String)  i + "A" + j + "B" + k + "C" + "\n" );
delay(250);      

}

c# tarafında veri alırken kullandığım metod:

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            serialPort1.ReadTimeout = 100;
            try
            {
                seraldataIn = serialPort1.ReadLine();
                this.Invoke(new EventHandler(ProcessData));
            }
            catch (Exception hata)
            {
                MessageBox.Show("Hata:" + hata.Message);
                serialPort1.Close();
                label9.ForeColor = Color.Red;
                label9.Text = "Bağlantı Hatası";

            }

 private void ProcessData(object sender, EventArgs e)
        {
            try
            {
                indexOfA = Convert.ToSByte( seraldataIn.IndexOf("A"));
                indexOfB = Convert.ToSByte(seraldataIn.IndexOf("B"));
                indexOfC = Convert.ToSByte(seraldataIn.IndexOf("C"));

                data1 = seraldataIn.Substring(0, indexOfA);
                data2 = seraldataIn.Substring(indexOfA + 1, (indexOfB - indexOfA) - 1);
                data3 = seraldataIn.Substring(indexOfB + 1, (indexOfC - indexOfB) - 1);
                progressBar2.Value = Convert.ToInt32(data1);
                progressBar3.Value = Convert.ToInt32(data2);
                progressBar4.Value = Convert.ToInt32(data3);
                textBox2.Text += ("data1=" + data1 + Environment.NewLine);
                textBox2.Text += ("data2=" + data2 + Environment.NewLine);
                textBox2.Text += ("data3=" + data3 + Environment.NewLine);
                sevenSegment1.Value = data1;
                sevenSegment2.Value = data2;
                sevenSegment3.Value = data3;
                Gauge1.Value = Convert.ToInt32(data3);



            }
            catch (Exception error)
            {
                MessageBox.Show(error.Message);
            }
        }
    }
        }

Yardımcı olursanız sevinirim, şimdiden teşekkürler.
-SB7

SB7

#1
Ekleme:Sorunun MCU tarafında mı yoksa PC programı tarafında mı olduğunu nasıl anlayabilirim bir debug yöntemi var mı?

-MCU 250ms de bir veri gönderiyor bu hız yüksek midir?

-PCden veri göndermeden önce MCU nun durdurulmasına gerek var mı?(1 veri gönder 1 veri al gibi)

-Bir de pc de ilk defa kod yazıyorum komut işleme hızı ve işlemci hızı öğrenilebiliyor mu?

(Çok fazla soru sordum ama c# ta yeniyim hızlıca öğrenmek için sadece bana lazım olacak yerleri araştırıyorum kusura bakmayın :))
-SB7

MrDarK

SB7 muhtemelen thread yapısı kullanmadan veri çekiyorsun. Multithread yapısı ile serial receive fonksiyonunu ayırırsan donma olarak gözlemlediğin form elemanlarına zaman kalmaması durumunu ortadan kaldırmış olursun.
Picproje Eğitim Gönüllüleri ~ MrDarK

SB7

Cevap için teşekkürler @MrDarK,
Aslında multi thread mantığını çok iyi anlatan bir video buldum(https://www.youtube.com/watch?v=oU3EOjwggUE&ab_channel=CemalCanAKGUL). Thread yetersiz kaldığında formun da donması gerekiyormuş (main thread kullanıldığı için).
Kendi programımda bunu test ettim veri gönderdiğim zaman formda donma olmuyor. MCU kullanmadan sanal olarak mcudaki gibi karar verebilen ve veri alışverişi yapabileceğim sanal bir platform var mı?(Her seferinde 3 değer gönderecek ama 3. değer seri haberleşmeden kendisine gönderilen güncel değer olacak)
Formda donma olmayınca MCU dan şüphelendim.
-SB7

karakaya_o

Formda donma oluyorsa sorun %99 threadden kaynaklıdır. Arayüz threadi içinde mümkün olduğunca iş yapmayın ayrı threadler açın. Yeniyseniz formda background worker kullanımı daha kolaydır. Mcu den okuma ayrı threadde (datareceived) zaten o yüzden donmuyor. Pcden veri göndermeden mcu in durdurulmasına gerek yok. StopWatch sınıfı ile işlem süresi görülebilir. Mobil için c# alıştıysan xamarin kullanabilirsin.

yas

Alıntı yapılan: SB7 - 28 Ocak 2022, 12:36:06MCU kullanmadan sanal olarak mcudaki gibi karar verebilen ve veri alışverişi yapabileceğim sanal bir platform var mı?
Eğer kullandığınız mcu yu Proteus simüle edebiliyorsa compim nesnesini kullanarak pc yazılımızın ile haberleştirebilirsiniz.

ziyaretci

Hem PC hem de MCU tarafından dataları paketler halinde ve dinamik önbellekleme şeklinde alın. PC tarafında thread ve MCU tarafında uart kesmesi ile gelen datayı hızlıca artırım indeksli önbelleğe çekin. Data gelmediği zamanlarda gelen dataları pakete dönüştürüp yönlendirin.

Böylelikle herhangi bir tıkanma/donma  olmaz, hatalı data gelse bile hatayı sezer ve yeniden aynı paketi talep edebilirsiniz.

Tabi bu işlem belli sınırlar dahilinde çalışır.Önbellek boyutu ve işlem gücü yetersiz kalırsa haberleşme patlar. Ama bu kalıcı olmaz, dinamik önbellekleme indeksleri birbirini yakalayıncaya kadar hatalı paket alırsınız o kadar.

ilyas KAYA

Dondugunda pic in beslemesini kesip 3 5 saniye sonra tekrar açın veriler geliyorsa sorun pic tarafinda yada pc ile pic arasındaki uart ceviricide.

Cok sık başıma gelen olay statik elektrik yüklenip programlayici yada ceviriciye dokununca pickit3 kitleniyor. Çıkarıp geri takmam gerekiyor. Belki sizde de aynı durum vardır.

SB7

Alıntı yapılan: karakaya_o - 29 Mart 2022, 08:54:51xamarin
Bu çok iyiymiş daha önce duymamıştım.

-Galiba bu donma olağan bir durum, sürekli MCU dan veri geliyor ve herhangi bir işaret olmadan aniden PC veri gönderince MCU tarafında işler karışıyor. MCU kesmeye girip işlem yaparken 2 sn bekleme süresi tolere edilebilir bir süre aslında. Sürekli veri göndermeyeceğim için bu süreyi kabullendim.

-Son olarak algoritmayı değiştirip veri alma işlemi bitmişse bir flag set et, o flag setse veri gönder, değilse bekle şeklinde yapmayı deneyeceğim.

İlgilenen ve cevap veren herkese teşekkür ederim.

-SB7