Aceminin C# sorulari

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

Mucit23

Teşekkür ederim. Bi araştırayım dediğinizi

Mucit23

Arkadaşlar merhaba.

Bilgisayara bağlı Com bağlantı noktalarını combobox içerisinde listemelek istiyorum.

internette birkaç örnek buldum fakat çalıştıramadım.

SerialPort.GetPortNames() Fonksiyonunu çalıştıramadım. 

Bunun kullanımı nasıl?


fatih6761

Hocam SerialPort.GetPortNames fonksiyonu string[] türünden döndürür. Yani fonksiyonun dönüş değerini bir string dizisine atıp combobox'a ekleyeceksiniz.
// Port names
string[] availablePorts = SerialPort.GetPortNames();
this.comboBoxPortNames.Items.AddRange(availablePorts);

Seri portlarla ilgili basit bir uygulama yazmıştım SerialPort sınıfının özellikleri ve kullanımını görebiliyosunuz isterseniz öm ile yollayabilirim..
İyi çalışmalar hocam...

Mucit23

Hocam iyi olur. Daha önce seri portu hiç kullanmadım c# ile. Sağa sola bakarak ilerliyorum...

Gökhan BEKEN

buraya yüklerseniz bende faydalanabilirim.
Özel mesaj okumuyorum, lütfen göndermeyin.

Mucit23

#185
Bir Sorum olacak.
Seri porttan bir dizi halinde iki farklı data alıyorum. Örnek olarak sıcaklık bilgisi olabilir.

Gelen Data Formatı şöyle

"A-25B002C045" gibi

Mcu dan bu formatta data gönderiyorum. Ben bilgisayar tarafında gelen stringi bu tanımlayıcılara göre ayırmak istiyorum.

Mesela "A" karakteri görüldüğü zaman A karakterinden sonra gelen 3 karakteri yani -25 i bir stringer yerleştireceğim. Aynı şekilde "B" karakteri geldiği zaman ondan sonra gelen 3 karakteri yani 002 değerini ayrı bir stringe yerleştireceğim. Aynı durum "C" tanımlayıcısı içinde geçerli. Burada Sayısal değerlerden önce gelen Karakterler sadece tanımlayıcı, gelen datanın ne olduğunu bana bildirecek.

MCU tarafından gönderilen data formatını değiştirebilirim.

Bu dediğim işlemi Nasıl yaparım?


semih

Alıntı yapılan: Mucit23 - 10 Mart 2013, 11:28:23
Bir Sorum olacak.
Seri porttan bir dizi halinde iki farklı data alıyorum. Örnek olarak sıcaklık bilgisi olabilir.

Gelen Data Formatı şöyle

"A-25B002C045" gibi

Mcu dan bu formatta data gönderiyorum. Ben bilgisayar tarafında gelen stringi bu tanımlayıcılara göre ayırmak istiyorum.

Mesela "A" karakteri görüldüğü zaman A karakterinden sonra gelen 3 karakteri yani -25 i bir stringer yerleştireceğim. Aynı şekilde "B" karakteri geldiği zaman ondan sonra gelen 3 karakteri yani 002 değerini ayrı bir stringe yerleştireceğim. Aynı durum "C" tanımlayıcısı içinde geçerli. Burada Sayısal değerlerden önce gelen Karakterler sadece tanımlayıcı, gelen datanın ne olduğunu bana bildirecek.

MCU tarafından gönderilen data formatını değiştirebilirim.

Bu dediğim işlemi Nasıl yaparım?

Gelen komutu tamamen string olarak bir değişkene atadıktan sonra split fonksiyonu ile dediğin işlemi yapabilirsin.

muhittin_kaplan

#187
mucit

bu iş için instr ve mid left substring gibi string işlemlerini kullanman gerekir.

TextBox1.Text = [text]
            Dim textStartAdress As Short
            Dim textStopAdress As Short
            Dim TextLeght As Short

            textStartAdress = (InStr(Me.TextBox1.Text, "P")) + 1
            textStopAdress = InStr(Me.TextBox1.Text, "B")
            TextLeght = textStopAdress - textStartAdress

            If textStartAdress > 0 And textStopAdress > textStartAdress Then
                PVoltage = (Mid(TextBox1.Text, textStartAdress, TextLeght)) / 100
                Me.Label3.Text = PVoltage
            End If

            textStartAdress = (InStr(Me.TextBox1.Text, "B")) + 1
            textStopAdress = InStr(Me.TextBox1.Text, "C")
            TextLeght = textStopAdress - textStartAdress

            If textStartAdress > 0 And textStopAdress > textStartAdress Then
                BVoltage = (Mid(TextBox1.Text, textStartAdress, TextLeght)) / 100
                Me.Label5.Text = BVoltage
            End If

            textStartAdress = (InStr(Me.TextBox1.Text, "C")) + 1
            textStopAdress = InStr(Me.TextBox1.Text, "T")
            TextLeght = textStopAdress - textStartAdress

            If textStartAdress > 0 And textStopAdress > textStartAdress Then
                Curr = (Mid(TextBox1.Text, textStartAdress, TextLeght)) / 100
                Me.Label7.Text = Curr
            End If

            textStartAdress = (InStr(Me.TextBox1.Text, "T")) + 1
            textStopAdress = InStr(Me.TextBox1.Text, "A")
            TextLeght = textStopAdress - textStartAdress

            If textStartAdress > 0 And textStopAdress > textStartAdress Then
                ExTemp = (Mid(TextBox1.Text, textStartAdress, TextLeght)) / 100
                Me.Label9.Text = ExTemp
            End If

            textStartAdress = (InStr(Me.TextBox1.Text, "A")) + 1
            textStopAdress = InStr(Me.TextBox1.Text, "F")
            TextLeght = textStopAdress - textStartAdress

            If textStartAdress > 0 And textStopAdress > textStartAdress Then
                Dim AbsorpVoltage As Single = (Mid(TextBox1.Text, textStartAdress, TextLeght)) / 100
                Me.Label11.Text = AbsorpVoltage
            End If


            textStartAdress = (InStr(Me.TextBox1.Text, "F")) + 1
            textStopAdress = InStr(Me.TextBox1.Text, "L")
            TextLeght = textStopAdress - textStartAdress

            If textStartAdress > 0 And textStopAdress > textStartAdress Then
                Dim FVoltage As Single = (Mid(TextBox1.Text, textStartAdress, TextLeght)) / 100
                Me.Label13.Text = FVoltage
            End If

            textStartAdress = (InStr(Me.TextBox1.Text, "L")) + 1
            textStopAdress = InStr(Me.TextBox1.Text, "E")
            TextLeght = textStopAdress - textStartAdress

            If textStartAdress > 0 And textStopAdress > textStartAdress Then
                Dim LVoltage As Single = (Mid(TextBox1.Text, textStartAdress, TextLeght)) / 100
                Me.Label15.Text = LVoltage
            End If


mesaj birleştirme:: 10 Mart 2013, 13:07:36

Yukardaki kod Vb.net ile yazılmıştır.

ilk satırlarda dikkat edersen P ve B arasını almak için hemen altında B ile C arasını almak için Başlangıç ve bitiş sayılarını buluyorum
(instr ile) ve aradaki bilgileri alıp değişkene atıyorum. (Mid ile)

fatih6761

@Mucit23 hocam buyrun örnek uygulama:
http://s3.dosya.tc/server/mv4EKg/SerialPortDemo.zip.html
@muhittin_kaplan hocam C#'ta fonksiyonların isimleri biraz daha farklı. Şöyle basit bir kod yazabiliriz:
string[] ParseSerialPacket(string packet)
{
  string[] result = new string[3];
  
  const splitCharA = 'A';
  const lengthCharA = 3;
  
  const splitCharB = 'B';
  const lengthCharB = 3;
  
  const splitCharC = 'C';
  const lengthCharC = 3;
  
  int indexOfA = packet.IndexOf(splitCharA, 0);
  result[0] = packet.Substring(indexOfA, lengthCharA);
  
  int indexOfB = packet.IndexOf(splitCharB, 0);
  result[1] = packet.Substring(indexOfB, lengthCharB);
  
  int indexOfC = packet.IndexOf(splitCharC, 0);
  result[2] = packet.Substring(indexOfC, lengthCharC);
  
  return result;
}

Tabi bu kodlama 10 üzerinden 1' zor alır :) Mantığı çözebilin diye bu şekilde yazdım. Mantığı çözdükten sonra zaten kendiniz kodu iyileştirirsiniz...

muhittin_kaplan

hocam kodlamada her işin kolayı vardır. benim verdiğimi öğrencim bana verse kalırdı :)

Mucit23

Hocam aslinda sabah ufak bir kod parçası yazdım. indexof fonksiyonu ile gelen string içerisinde tanimlayici araması yaptım. Sonra tanimlayıcı kaçinci sirada ise o siradan itibaren datalari alip diziye yerleştirdim.

Bunu yine başka bir programdan gördümüştüm. Çat pat çalıştı ama sürekli exeption aliyorum. Pek mantiğida aklima yatmamisti zaten.

Eve gidince size yazdiklarimi göstereyim.

Seri port nesnesinin data recieved fonksiyonuna her bir karakter geldiğindemi event gönderiliyor. Buna göre kendim bir fonksiyon yazmayı deneyeceğim..

semih

Alıntı yapılan: Mucit23 - 10 Mart 2013, 19:29:33
Hocam aslinda sabah ufak bir kod parçası yazdım. indexof fonksiyonu ile gelen string içerisinde tanimlayici araması yaptım. Sonra tanimlayıcı kaçinci sirada ise o siradan itibaren datalari alip diziye yerleştirdim.

Bunu yine başka bir programdan gördümüştüm. Çat pat çalıştı ama sürekli exeption aliyorum. Pek mantiğida aklima yatmamisti zaten.

Eve gidince size yazdiklarimi göstereyim.

Seri port nesnesinin data recieved fonksiyonuna her bir karakter geldiğindemi event gönderiliyor. Buna göre kendim bir fonksiyon yazmayı deneyeceğim..

Ne yapmak istediğini tam anlamadım. Ama bende seri port ile çalışıyorum. İşlemciden birden fazla veri geldiğinde bu verileri ayırt edip farklı yerlere yazdırıyorum ve bunun için data revieved fonksiyonunu kullanmadım. Çünkü kullandığımda her karakter geldiğinde farklı değerler çıkartıyordu. Onun yerine şu şekilde bir kodu timer_tick fonksiyonuna yazarak sorunu çözdüm.

gelen = Convert.ToString(serialPort1.ReadExisting()); //Gelen veri içinde sayılarda bulunduğu için böyle bir dönüştürme kullandım.
            label2.Text = gelen.Split(' ')[0];// Boşluk karakterini gördüğünde veriyi böl. İlk böldüğü veri 0 numarasını alacaktır.
            if (gelen.Split(' ').Length > 1)//Eğer böldüğün veri birden fazla karakter içeriyorsa
                label4.Text = gelen.Split(' ')[1];//Birinci karakteri label4'e yaz.

muhittin_kaplan

Mucit tekbir karekter yada komple string gelme olayını
gönderdiğin dataya göre ve aldığın yerdeki kullandığın fonksiyona göre değişir.
eğer gönderdiğin yerde /r/n var sa

mySerialPort.ReadLine

ile alırsan komple string i alırsın.

Mucit23

Hocam benim yazdığım kodlar bunlar.

        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            RxString += serialPort1.ReadExisting();
            this.Invoke(new EventHandler(string_index));
        }

        private void string_index(object sender, EventArgs e) 
        {
            int xstart = RxString.IndexOf('X');
            int ystart = RxString.IndexOf('Y');
            int zstart = RxString.IndexOf('Z');

            if (xstart != -1)
            {
                Xaxis = RxString.Substring(xstart + 1, 3);
                label7.Text = Xaxis;
            }
            if (ystart != -1)
            {
                Yaxis = RxString.Substring(ystart + 1, 3);
                label8.Text = Yaxis;
            }
            if (zstart != -1)
            {
                Zaxis = RxString.Substring(zstart + 1, 3);
                label9.Text = Zaxis;
                RxString = "";
            }
        }


Mantıken çalışması lazım. Sürekli Nezamanki data gelmeye başlıyor ozaman sürekli exception hatası alıyorum.

Aldığım hata budur.

image upload
Burada ne demek istiyor.

muhittin_kaplan

serialPort1.ReadExisting
yerine readline yapsana.

muhtemel hatan
xstart tan başla 3 karekter al diyorsun. ya 1 karekter varsa