Aceminin C# sorulari

Başlatan z, 30 Mayıs 2012, 08:19:05

Mucit23

Alıntı yapılan: muhittin_kaplan - 11 Mart 2013, 00:10:48
muhtemel hatan
xstart tan başla 3 karekter al diyorsun. ya 1 karekter varsa

Hocam Readline ı da denerim.

sorun dediğiniz gibi ya 1 karakter varsa?

Onuda çözdüm.

MCU da tüm dizi sonuna ; koydum.

sonra data recieved de şöyle bir değişiklik yaptım.

        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {   
            RxString += serialPort1.ReadExisting();
            int temp = RxString.IndexOf(';');
            if (temp != -1)
            {
                this.Invoke(new EventHandler(string_index));
                RxString = "";
            }
        }


muhittin_kaplan

yahu öyle yapma
readline ı koyduğunda /r ye bakıyor.
sen mcu ya gönderdiğin array a /r koy. burada readline yap


Mucit23

yok hocam dediğiniz gibi alamadım.

mcuda dediğiniz gibi dizisonunaa \r koydum.

c# dada dediğiniz değişikliği yaptım. Gelen giden yok

muhittin_kaplan

#198
MCU kodunun array oluşturma ve gönderme bölümünü yazarmısın


mesaj birleştirme:: 11 Mart 2013, 00:38:01

ben \n koymuşum  düzeltme \n zayten newline ya

sprintf (Deger,"P%2.2fB%2.2fC%2.2fT%2.2fA%2.2fF%2.2fL%2.2fE\n................................);

Mucit23

Ben bu şekilde gönderiyordum.

               sprintf(ubuffer,"X%03hdY%03hdZ%03hd\r",(short int)xaxis,(short int)yaxis,(short int)zaxis);
               Rs232_SendData(ubuffer);

Sanırım \n koymam gerekiyor..

muhittin_kaplan


Mucit23

#201
Tamam Hocam çalıştı şimdi. Artık Sıkıntısız bir şekilde data alıyorum.

Yalnız problemmi dir pek anlayamadım ama C# da programı test ettiğim de pc programının seri port ile bağlantısını kestiğim zaman bilgisayar yazılımı donuyor. Bunun için ne gibi önlemler alınabilir. (Programcılık adına Programın Donmasına kilitlenmesine karşı olmazsa olmazlar)

Birde şunu sorayım. Combobox içerisinde herhangi bir şey ekli olup olmadığını nasıl anlarım?

muhittin_kaplan

hata denetimi yaptır.
try catch ile

combobox un içeriğinde herhangi bir eleman varmı yokmu diye bakmak için

combox.item.count değerine bak.

Mucit23

#203
Muhittin hocam merhaba,

Formu açıp kapayınca bazen bu hatayı alıyorum.


host images

Bu nedir?

Hocam Seri portta bağlantıyı kesince program donuyor. Bunu önlemek için ne yapmalıyım?

fatih6761

Hocam Exception furlatmasının sebebi Form kapanırken DataReceived olayının tetiklenmesi. Bildiğiniz gibi girdi/çıktı işlemlerini çekirdek yönetiyor, sizin EventHandler fonksiyonunuz çekirdek tarafından çağrılıyor, bir de bakılıyor ki Thread sonlanmış .Böylece hata fırlatılıyor. Bunu çözmek için OnClosing olayını override etmelisiniz.
protected override void OnClosed(CancelEventArgs e)
{
    try
    {
        if (serialPort.IsOpen) // Port açıksa, kapatmayı unutma
            serialPort.Close();
    }
    catch (Exception) { }

    base.OnClosing(e);
}

Burada mesela kapatma sırasında bir hata oluşursa e.Cancel = true yapabilirsiniz. Böylece form kapanmaz. Kapatma iptal olur.
İyi çalışmalar...

Mucit23

hocam peki seri port bağlantısını kesince programın donma ması için ne yapabilirim.

Herzaman olmuyor ama %70 oluyor.

tahminimce arka planda şöyle olaylar gerçekleşiyor.

Seri porttan data alındığı sırada biz baglantyı kesmeye çalışıyoruz. Seri port elemanıda arada veri iletişimi varken hattı kapayamıyor. Veri paketinin bitmesini bekliyor. Dolayısıyla kasılıp kalıyor. Ara sıra kapatma işlemi paket arasına denk geldiği için sorun olmuyor.

Ben seri port bağlantısını kapama dan önce seri port elemanını aradaki veri iletişimini kesmesi için uyarmalıyım.

Fatih hocam tahminim dogruysa eğer nasıl bir çözüm üretebiliriz

fatih6761

Hocam ReadLine'ın olduğu satırı şöyle değiştirin:
try
{
    RxString += serialPort1.ReadLine();
}
catch (TimeoutException) { }

Mucit23

Hocam yok başka bir problem var.

data  alma kısmında gerekli değişiklikleri yaptım ama düzelen birşey olmadı.

protected override void OnClosed(CancelEventArgs e)
{
    try
    {
        if (serialPort.IsOpen) // Port açıksa, kapatmayı unutma
            serialPort.Close();
    }
    catch (Exception) { }

    base.OnClosing(e);
}


Buradaki yapıyıda bir türlü çalıştıramadım. OnClosed fonksiyonunun FormClosed Fonksyonundan farkı nedir.
böyle bir hata alıyorum.
Error	1	'PC_Program.Form1.OnClosed(System.ComponentModel.CancelEventArgs)': no suitable method found to override


Ama kesinlikle problem sizin dediğiniz sebebten kaynaklanıyor. Çünkü Seri port Bağlantısı açık ve data geliyorken bağlantıyı kesmeden önce aradaki seri port kablosunu çekip veri akışını kestikten sonra seri portu kapatırsam sıkıntı olmuyor.

Çok mecbur kalırsam eğer seri portu kapatmadan önce işlemciye data göndermeyi kesmesini söyleyeceğim. Ama bu sorunu çözmez. Bunun dışında başka ne yapabilirim?

fatih6761

#208
Hocam hata benim yanlış yazmamdan kaynaklanıyor galiba :)
protected override void OnClosing(CancelEventArgs e)

OnClosed değil OnClosing olacaktı. Bir de böyle deneyin...
Not : Form'un Closed olayından farkı yok, sadece yazması daha kolay. Hem override etme olayını da görmüş olursunuz diye yaptım.
İyi çalışmalar...

muhittin_kaplan

closed da formun tüm bileşenleri hafızadan atılırken closing de atılmadan önce bu olay işletilir.
closing işlemi yapılırken genelde

mesajbox(program kapatılsın mı) yapar sonrasında kapatırım.